Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

[Доработка] Борьба с 404 ошибкой, вернее ее отсутствием, удаление дубликатов ссылок


Рекомендованные сообщения

Приветствую! Возникла необходимость вывода 404 ошибки при неверном запросе. Для СЕО режима решается все просто и варианты здесь предлагались. Без СЕО я варианта не нашел.

Решение, кхм.. не самое красивое, но вроде работает.

1. В файле system/library/response меняем спецификатор доступа private у свойства $headers на public, т.е строка 3 будет выглядеть:

public $headers = array();
Делать это приходится, увы, чтобы иметь возможность добавить в каждом из контроллеров (продукт, категория, производитель) вывода хедера с 404 ответом, иначе он у меня добавляется уже после хедера с кодировкой.

2. В файлах category.php, manufacturer.php, product.php каталога catalog/controller/product перед строкой (2 - ой в скрипте, внутри else {})

$this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));
надо добавить

array_unshift($this->response->headers, $this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');

В итоге 404 ошибка будет выдаваться и при неверных ID товара, категории, производителя.

В общем на первый взгляд рабочее решение. Плохо что надо ставить костыль на систему и расширять доступ для свойства класса, но лучше решения я не нашел. С опен картом вожусь несколько дней, в целом CMS для меня новая, может кто решил данную проблему элегантнее?

Ссылка на комментарий
Поделиться на других сайтах


была где то темка посвященная ошибке 404, но суть решения было примерно таким же)

Понятно, ну если лучшего решения нет, будем юзать что есть)

Возникла задача удалить дубликаты ссылок, такой вопрос тоже рассматривался здесь по-разному, я решил реализовать вот таким образом

Файл catalog/controller/common/seo_url.php

Добавить после

if (isset($this->request->get['route'])) {

				return $this->forward($this->request->get['route']);
			}

		}
(примерно 55 строка)

else if(isset($this->request->get["route"]))
		{
			if 	($this->request->get["route"] == 'product/category' ||
				 $this->request->get["route"] == 'product/product' ||
				 $this->request->get["route"] == 'information/information' ||
				 $this->request->get["route"] == 'product/manufacturer')
			{
				
				$query = $this->db->query("SELECT value FROM " . DB_PREFIX . "setting WHERE `key` = 'config_seo_url'");

				if ($query->row["value"] == 1)
				{
					$is_seo = true;

					if ($this->request->get["route"] == "product/category")
					{
						if (isset($this->request->get["path"]))
						{
							$path = explode("_", $this->request->get["path"]);

							foreach ($path as $cat_id)
							{
								$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'category_id=" . $this->db->escape($cat_id) . "'");

								if (!$query->num_rows) $is_seo = false;
							}
						}
					}
					else if ($this->request->get["route"] == "product/product")
					{
						if (isset($this->request->get["path"])) $is_seo = false;

						else if (isset($this->request->get["product_id"]))
						{
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'product_id=" . $this->db->escape($this->request->get["product_id"]) . "'");
							if (!$query->num_rows) $is_seo = false;
						}
					}
					else if ($this->request->get["route"] == "information/information")
					{
						if (isset($this->request->get["information_id"]))
						{
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'information_id=" . $this->db->escape($this->request->get["information_id"]) . "'");
							if (!$query->num_rows) $is_seo = false;
						}

					}
					else if ($this->request->get["route"] == "product/manufacturer")
					{
						if (isset($this->request->get["manufacturer_id"]))
						{
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'manufacturer_id=" . $this->db->escape($this->request->get["manufacturer_id"]) . "'");
							if (!$query->num_rows) $is_seo = false;
						}
					}
				}

				if ($is_seo == true)
				{
					$this->request->get['route'] = "error/not_found";
					return $this->forward($this->request->get['route']);
				}

			}
		}

Этот код, как я надеюсь) проверяет все не СЕО ссылки на их СЕО аналоги, при включенном СЕО режиме. В случае нахождения аналога выводится 404 ошибка. На первый взгляд работает, но очень тщательно я не тестил, может кому понадобится тоже. Критика приветствуется.

ЗЫ. Версия - 0.1.5

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.