Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Приветствую! Возникла необходимость вывода 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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.