Пользовательский блок Magento занимает много времени для загрузки с большим количеством SKU - PullRequest
0 голосов
/ 08 марта 2012

У меня был код фрилансера, блок, который показывает слайдер избранных продуктов, с вкладками, соответствующими подкатегориям в пределах.

.phtml файл находится здесь: http://pastebin.com/6jEexZxu

ВотПример загрузки страницы только с 20 или около того SKU (это может быть немного медленно, эта установка не была оптимизирована вообще): http://crunchconcepts.com.au/test_store/magento/

Структура категории выглядит следующим образом:

Слайдер (id = 3)

-> PS3

-> Рекомендуемые

-> Последние добавленные

-> В продаже

-> Xbox

-> В избранном

-> Последние добавления

-> В продаже

... и так далее.Это автоматически загружает новый ползунок для любой подкатегории «Слайдер» и новую вкладку для каждой подкатегории.

Это прекрасно работает (хотя загрузка продуктов по требованию при нажатии на следующую вкладкубыло бы намного лучше), когда в магазине было только около 100 SKU, но когда мы импортировали 1000 тестовых SKU, загрузка страницы зависала только при доступе к домашней странице.Хранилище работает нормально на всех других страницах и в функциях, и только когда блок слайдера удален с домашней страницы, он возвращается к нормальной скорости.

В данный момент он работает на VPS, и загрузка сервера можетПик до 7-8 при попытке получить продукты слайдера.

Кто-нибудь может увидеть, почему это происходит, и что я могу сделать, чтобы это исправить?

Фрилансер в основном перестал отвечать на запросыпо электронной почте теперь, когда у него есть деньги, поэтому его совет не в уравнении!

Обновление:

Хорошо, так что я пытаюсьначать с нуля, и я думаю, что я там ... Или, по крайней мере, я многому учусь!

    <?php
$categoryId = 3; // a category id that you can get from admin
$category = Mage::getModel('catalog/category')->load($categoryId);

$parentCat = Mage::getModel('catalog/category')->load($categoryId);
$childCategories = $parentCat->getChildren(); //Child category IDs separated by commas

$children1 = explode(',', $childCategories);

foreach ($children1 as $subCat1){
echo "<br/>";

$parentCat1 = Mage::getModel('catalog/category')->load($subCat1);
$childCategories1 = $parentCat1->getChildren(); //Child category IDs separated by commas
$mainCatName = $parentCat1->getName();
$children2 = explode(',', $childCategories1);
echo "<br/><br/>".$mainCatName;






foreach($children2 as $tabs){


$tab = Mage::getModel('catalog/category')->load($tabs);
echo "<br/><br/>".$tab->getName()."<br/>";

$_category = Mage::getModel('catalog/category')->load($tabs);
$_productCollection = Mage::getResourceModel('catalog/product_collection')
  ->addStoreFilter()
  ->addCategoryFilter($_category)
  ->addAttributeToSelect(array('name','url','small_image'));  


    if(!empty($_productCollection))

    {

            foreach ($_productCollection as $_product):

            echo $_product->getName();   //get product name  

        endforeach;

    }else{
    echo "nothing!";}


}


}


  ?>

Я получил это, и он отображает названия категорий и идентификаторы, но всякий раз, когда я пытаюсь загрузить товары, он загружает каждый товар в магазине!Я пробовал пару других способов, но он загружает неправильный продукт из случайной категории.Помогите!

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Подход должен быть изменен.Такой код не должен быть в файле шаблона phtml.Это нужно переписать как правильный модуль Magento с классом Block, выполняющим весь сбор и фильтрацию коллекции, чтобы получить то, что вы хотите.И phtml только отображает слайдер вашего продукта.Кроме того, тогда можно добавить правильное блочное кэширование, чтобы ваши страницы загружались за конечное время при включенном кэшировании.

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

0 голосов
/ 09 марта 2012

Это медленно, потому что вы выполняете несколько запросов с массивным набором результатов, а затем повторно загружаете целые модели.

Примерно так будет немного более подходящим.

$_catId = 999;
$_category = Mage::getModel('catalog/category')->load($_catId);
$_productCollection = Mage::getResourceModel('catalog/product_collection')
  ->addStoreFilter()
  ->addCategoryFilter($_category);

Затем вы можете выполнить итерацию по этой коллекции продуктов.

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

Тогда это означает, что вам нужен только 1 файл шаблона и вы можете сделать что-то столь же простое, как это, где бы вам ни понадобилось

{{block type='mynamespace/mymodule' template='mymodule/slider_template.phtml' cat_id="5" limit="3"}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...