URL-адрес просмотра Magento 1-категории не перенаправляется, а просмотр продукта


В процессе настройки моего сайта я не смог использовать ссылки для просмотра категорий в форме:

/catalog/category/view/id/

Аналогичные ссылки на страницу просмотра продукта работают просто отлично. Вышесказанное приводит к странице CMS "без маршрута". Я перепробовал все идентификаторы категорий в своем магазине, я попытался переиндексировать данные, очистить кэш и отключить несколько сторонних модулей, которые я установил.

Поскольку я довольно новичок в Magento, любые общие советы о том, как отладить подобную проблему буду очень признателен!

Author: Black, 2013-01-24

3 answers

Если бы эта ошибка возникала для страниц продуктов, я был бы склонен рассмотреть проблему с переписыванием URL-адресов и/или проблему с конфигурацией маршрута модуля каталога, т.Е. содержимым frontend/routers/catalog xpath в конфигурации. То, что ваши продукты работают, говорит мне о том, что ни с одним из этих двух нет ничего общего.

Ошибки, вы их видите?

В зависимости от ошибки сопоставление маршрута Magento с контроллером может не работать для стандартного маршрутизатора, и в этом случае страница 404 будет отображаться через маршрутизатор по умолчанию. Я бы начал с исключения изменений основного кода и пользовательских модулей. Включите отчеты об ошибках для PHP и установите режим разработчика Magento в значение true; см. index.php и редактируйте напрямую или устанавливайте необходимые параметры до PHP (например, в .htaccess, если вы используете Apache). Проверьте журналы ошибок в var/log/.

Основные изменения

Если возможно, используйте стандартную копию вашей версии Magento, наведите ее на базу данных и посмотрите, есть ли проблема остается. Если это так, то это проблема с данными, которая может исходить из кода, но, по крайней мере, у вас будет указание, где искать.

Пользовательский код

Вернувшись в "обычный" экземпляр, исключите модули пула локальных кодов, установив флаг disable_local_modules в app/etc/local.xml к true и проверьте эффект (предполагая, что файлы объявлений в приложении/etc/modules/ следуют соглашению и ничего не делают, кроме объявления модуля).

Модули пула кодов сообщества не может быть отключен таким образом, поэтому было бы необходимо временно переименовать пул кодов сообщества, чтобы эффективно отключить их (опять же, при условии, что файлы объявлений в app/etc/modules/ следуют соглашению и не делают ничего, кроме объявления модуля). Проверьте эффект и посмотрите, что произойдет.

Маршрутизация Magento обычно работает, поэтому, повторяя код и конфигурацию, которые используются при маршрутизации, можно отсеять виновных и помочь выявить проблему.

 5
Author: benmarks, 2013-01-25 19:06:27

Существует несколько причин, по которым страница просмотра категорий может возвращать значение 404. Я перейду к конкретному коду через минуту, но на высоком уровне вы захотите

  1. Убедитесь, что ваш URL-адрес содержит параметр числового идентификатора

  2. Убедитесь, что для вашей категории установлено значение "активный" в бэкэнде

  3. Убедитесь, что ваша категория входит в список корневых категорий на странице управления категориями

Для меня лучший способ отладить эти проблема в том, чтобы проникнуть в код. URL-адрес категории перенаправляет к следующему классу контроллера

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php

В частности, следующий viewAction метод

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php
public function viewAction()
{
    if ($category = $this->_initCatagory()) {
        //...code snipped for brevity...
    }
    elseif (!$this->getResponse()->isRedirect()) {
        $this->_forward('noRoute');
    }
}    

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

public function viewAction()
{
    var_dump(__METHOD__);
    exit;
    //...
}

Если вы не видите имя метода, загруженное в браузер с указанным выше кодом, это означает, что произошел конфликт перезаписи или переопределения с другим модулем.

Если это подтвердится как видно из определения метода, если метод _initCategoty возвращает значение false, страница категории перейдет на страницу без маршрута 404. Перейдя к _initCategory, вы можете увидеть, что есть три причины, по которым это может произойти.

Первый

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php
protected function _initCatagory()
{
    //...    
    Mage::dispatchEvent('catalog_controller_category_init_before', array('controller_action' => $this));
    $categoryId = (int) $this->getRequest()->getParam('id', false);
    if (!$categoryId) {
        return false;
    }
    //...
}

Если в URL-адресе нет параметра id, метод вернет значение false, и вы получите 404.

Затем Magento загружает категорию и выполняет следующие действия

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php
protected function _initCatagory()
{
    //...    
    if (!Mage::helper('catalog/category')->canShow($category)) {
        return false;
    }
    //...
}

В canShow В Magento есть набор правил, которые управляют категорией через. Если они не сработают, вы получите страницу 404. (мы перейдем к этим правилам через секунду)

Наконец, Magento отправляет событие catalog_controller_category_init_after

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php
try {
    Mage::dispatchEvent(
        'catalog_controller_category_init_after',
        array(
            'category' => $category,
            'controller_action' => $this
        )
    );
} catch (Mage_Core_Exception $e) {
    Mage::logException($e);
    return false;
}

Если какие-либо наблюдатели событий выдадут исключение, Magento зарегистрирует сообщение об ошибке и отобразит страницу 404.

Я бы рекомендовал вам добавлять временный код отладки над каждым возвращаемым значением false

var_dump(__METHOD__ . '::' . __LINE__);
exit;
return false;

Это подскажет вам, какое условие не выполняется. За исключением, дополнительный

var_dump($e->getMessage());

Это хорошая идея.

Если это canShow, который терпит неудачу, вы можете найти эти тесты в

#File: app/code/core/Mage/Catalog/Helper/Category.php
public function canShow($category)
{
    if (is_int($category)) {
        $category = Mage::getModel('catalog/category')->load($category);
    }

    if (!$category->getId()) {
        return false;
    }

    if (!$category->getIsActive()) {
        return false;
    }
    if (!$category->isInRootCategoryList()) {
        return false;
    }

    return true;
}

Как вы можете видеть, здесь выполняется проверка активной категории или проверка того, что категория находится в корневом списке. Аналогичный отладочный код здесь должен позволить вам выяснить, в чем именно заключается проблема.

 11
Author: Alan Storm, 2013-01-26 06:12:20

Как правило, лучший способ отладки в Magento - это покопаться в коде и набраться определенного терпения:). Прежде всего, вам нужно выяснить, в каком файле сгенерирована проблема (или в какой таблице). Такие вещи, как панель инструментов отладки и подсказки пути к шаблону, могут легко указать вам правильное направление. Затем вы можете перейти к детальной отладке. Обычно я помещаю Mage::log в функции, чтобы увидеть, какая функция генерируется, а затем углубляюсь в проблему. Если есть какая-либо таблица/запрос связанные проблемы вы всегда можете включить $_debug и ведение журнала запросов (последнее обычно доступно на панели инструментов отладки). Для отладки индексатора я советую вам запускать его из командной строки, потому что он возвращает ошибки более корректно. Остальное - просто копать, копать и копать, но через некоторое время это становится все быстрее и быстрее.

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

 2
Author: Toon Van Dooren, 2013-01-25 07:09:48