2015-03-28 1 views
0

Я столкнулся с проблемой в многоуровневом навигационном блоке, который, я считаю, может быть ошибкой.Magento Многоуровневый навигационный вызов для count() для неопределенного объекта

В блоке Mage_Catalog_Block_Navigation, метод _renderCategoryMenuItemHtml:

// get all children 
    // If Flat Data enabled then use it but only on frontend 
    $flatHelper = Mage::helper('catalog/category_flat'); 
    if ($flatHelper->isAvailable() && $flatHelper->isBuilt(true) && !Mage::app()->getStore()->isAdmin()) { 
     $children = (array)$category->getChildrenNodes(); 
     $childrenCount = count($children); 
    } else { 
     $children = $category->getChildren(); 
     $childrenCount = $children->count(); 
    } 

Я плоский индекс категории включен, а индекс перестраивается, когда планируется (каждую минуту). Magento версия 1.14.0.1 и иногда я получаю сообщение об ошибке:

Call to a member function count() on a non-object 

Основываясь на статье, если я предполагаю, что это происходит, когда кто-то получает доступ к странице в то время как индекс перестраивается (isAvailable).

Проблема в том, что код в блоке else, похоже, даже не теоретически не работает, потому что $ category-> getChildren() возвращает строку. Я что-то упустил? Является ли это ошибкой или у меня некорректная конфигурация где-то.

ответ

0

Изучив его дальше, похоже, что это ошибка. Проблема является условием гонки:

  • Mage_Catalog_Model_Category :: _ построить решает, что использовать, EAV или плоского ресурс
  • Затем Mage_Catalog_Helper_Category :: getStoreCategories возвращает другую коллекцию, основанную на этом.
  • в Mage_Catalog_Block_Navigation :: _ renderCategoryMenuItemHtml, то $ категории объект либо Mage_Catalog_Model_Category или Varien_Data_Tree_Node на основе предыдущего решения об использовании Flat или EAV.
  • Mage_Catalog_Block_Navigation :: _ renderCategoryMenuItemHtml снова проверяет, следует ли рассматривать объект как Flat или EAV и на основе этого использует различные методы.

Таким образом, в том случае, когда категории были инициализированы с плоской ресурс, и процесс индекса категории блокируется через некоторое время после, но до последнего метода, Magento будет обрабатывать $ категории как объект неправильного типа.

Моим решением является дополнительно проверить тип $ внутри части else.

} else { 
     if($category instanceof Varien_Data_Tree_Node) 
     { 
      $children = $category->getChildren(); 
     } else 
     { 
      $children = $category->getChildrenCategories(); 
     } 
    } 

То, что я немного боюсь, является проблемой, потому что я обращаюсь к индексу категории, когда он заблокирован.

0

Это может быть что-то, чего можно избежать, включив кеш (все cms/catalog/category/404 страницы полные страницы, кэшированные в корпоративной версии) и с запланированным сбросом кеша после завершения повторной передачи. Рассмотрим увеличение интервала между вашими реиндексами.

Если настройки с встроенными настройками не работает, вы всегда можете отлаживать:

Создать файл журнала и сделать его записывающий

touch mage-root/var/log/counts.log 
chmod 755 mage-root/var/log/counts.log 

Заменить дочерние вызовы с:

// get all children 
// If Flat Data enabled then use it but only on frontend 
$flatHelper = Mage::helper('catalog/category_flat'); 
Mage::log('Flat data enabled: ' . $flatHelper, null, 'counts.log', FALSE); 
if ($flatHelper->isAvailable() && $flatHelper->isBuilt(true) && !Mage::app()->getStore()->isAdmin()) { 
    $children = (array)$category->getChildrenNodes(); 
    Mage::log('Children in if: ' . $children, null, 'counts.log', FALSE); 
    $childrenCount = count($children); 
} else { 
    $children = $category->getChildren(); 
    Mage::log('Children in else: ' . $children, null, 'counts.log', FALSE); 
    $childrenCount = $children->count(); 
} 

Наконец, вы можете переопределить класс ваниль, копируя его:

приложения \ код \ Local \ Mage \ Каталог \ Block \ navigation.php

Затем добавление if(!empty($children)) выше заявления оскорбительного и используя этот «патч» в долгосрочной перспективе.

+0

Я пробовал кеш-память, у меня есть запланированный импорт по 15 м каждый час, и кеш был очищен одновременно. Я сменил его на 15 м позже, но это все еще произошло. – Domeglic

Смежные вопросы