Это вопрос относительно хорошей практики программирования в Magento.
Мне нужно показать (в списке товаров категории) товар с сопутствующими товарами в виде миниатюр. Поэтому я отредактировал mypackage/mytheme/template/catalog/product/list.phtml
что-то вроде этого
<?php
$related=$_product->getRelatedProductIds();
if(count($related)>0){
echo '<div class="a'.$ap.'"></div>';
echo '<div class="li_p"><ul>';
foreach($related as $rela){
$rela_nom=Mage::getModel('catalog/product')->load($rela);
echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>';
}
echo '</ul></div>';
}
?>
И это работает очень хорошо.
Но мой вопрос: правильно ли создавать экземпляр класса модели в файлах phtml?
Если нет, то как лучше всего достичь этой функциональности? Я имею в виду, какой файл лучше редактировать или какой класс лучше добавить, где? Помощник?
Можете ли вы привести небольшой пример или дать мне представление о том, какие файлы лучше редактировать.
источник
Нет ничего плохого в загрузке модели в
phtml
файл. Но это зависит от того, почему вы это делаете.Если вам нужна вся модель и все данные, связанные с ней, то вы также можете загрузить всю модель.
Но если вам просто нужен URL продукта (из вашего примера), вы можете просто загрузить правильную коллекцию
Затем повторите это по мере необходимости
источник
Хочу поставить мои 5 центов здесь. Мы должны уважать принципы архитектуры, которые используются в Magento. Основной архитектурный образец, используемый в Magento - MVC. В случае Magento «View» часть содержит несколько вещей (блок, шаблон, макет). Блоки были созданы для перемещения логики подготовки данных из шаблона в другой класс, чтобы сделать шаблоны более понятными и удобочитаемыми для разработчиков веб-интерфейса. Здесь я хочу согласиться с Фабианом.
Что касается опасений Сонасси по поводу слишком большого количества ненужных классов, я предлагаю с нетерпением ждать MVC. В этом случае мы рассматриваем контроллер как командира, который определяет, какой блок и какие данные должны иметь. Действие в контроллере может содержать необходимый код для загрузки данных и помещения их в блок (с помощью магических сеттеров) перед рендерингом.
источник
Я согласен с Фабианом Блехшмидтом, что это плохая практика, и вы должны уважать разделение проблем.
Чтобы добавить конструктивное предложение:
Это то, для чего предназначены классы Block. В вашем случае вам придется переписать,
Mage_Catalog_Block_Product_List
чтобы добавить желаемый функционал:Должно быть очевидно, как использовать эти методы в шаблоне.
Примечание. Перезапись не означает редактирование файла ядра. Следуйте инструкциям по настройке, если вы не знаете, как переписать блок.
источник