Чи добре створити клас getModel на шаблонах phtml?


14

Це питання щодо належної практики програмування в 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?

Якщо ні, то який найкращий спосіб досягти цієї функціональності? Я маю на увазі, який файл краще редагувати або який клас краще додати, де? Помічник?

Чи можете ви надати невеликий приклад чи поглянути на те, які файли краще редагувати.

Відповіді:


10

Я хочу не погодитися з відповіддю Сонасі :)

Ініціювати модель у шаблоні - це погана практика. Іноді це потрібно, а іноді і я це роблю. Але якщо це можливо, вам слід не допустити додавання коду у ваші файли pHTML та лише echoдані.

Це розділення проблем . Не змішуйте HTML та кодування матеріалів. Це повинно бути в класі Блок.


3
Я також згоден з вашою незгодою :) Але завантаження однієї моделі поза циклом - це не кінець світу. В іншому випадку це стає випадком абстракції infinitum - додавання додаткових класів, існуючих лише для відокремлення одного рядка коду від подання. Це просто додає переписати накладні витрати, не кажучи вже про технічне обслуговування.
Бен Лессані - Сонассі

У вас занадто багато часу, якщо ви хочете виправити всі мої орфографічні помилки, дякую за це :-)
Fabian Blechschmidt

До речі, ви праві, сонассі :-) Це просто те, з чим ми повинні бути обережні. Я бачив SQL querys у phtml-файлах ... НІ НІ :-)
Fabian Blechschmidt

4

Немає нічого поганого в завантаженні моделі у phtmlфайл. Але це залежить від того, чому ти це робиш.

Якщо вам потрібна вся модель та всі пов’язані з нею дані, то ви можете також завантажити всю модель.

Але якщо вам просто потрібна URL-адреса продукту (з вашого прикладу), ви можете просто завантажити правильну колекцію

$_product->getRelatedProductCollection();

Потім перейдіть по мірі необхідності

<?php $_relatedCollection = $_product->getRelatedProductCollection(); ?>
<?php foreach ($_relatedCollection as $_item): ?>
<li>
  <a href="<?php echo $_item->getProductUrl(); ?>">
    <img src="<?php echo $this->helper('catalog/image')->init($_item, 'small_image')->resize(20); ?>" width="20" height="20">
  </a>
<li>
<?php endforeach; ?>

3

Хочете поставити мої 5 центів тут. Ми повинні поважати принципи архітектури, які використовуються в Магенто. Основний архітектурний зразок, який використовується в Магенто, - це MVC. У разі Magento "Перегляд" частина містить кілька речей (блок, шаблон, макет). Блоки були створені для переміщення логіки підготовки даних із шаблону до якогось іншого класу, щоб зробити шаблони більш чистими та читаними для розробників інтерфейсу. Тут я хочу погодитися з Фабіаном.

Що стосується занепокоєння Сонассі щодо занадто багато зайвих занять, то я пропоную з нетерпінням чекати MVC. У цьому випадку ми дивимось на контролер як на командира, який визначає, який блок і які дані повинні мати. Дія в контролері може містити необхідний код для завантаження даних і введення їх у блок (за допомогою магічних сеттерів) перед рендерінгом.


3

Я погоджуюся з Фабіаном Блешшмідтом, що це погана практика, і ви повинні поважати розділення проблем.

Щоб додати конструктивну пропозицію:

Це щось, для чого призначені класи Блоку. У вашому випадку вам доведеться переписати, Mage_Catalog_Block_Product_List щоб додати потрібну функціональність:

public function hasRelatedProducts()
{
    return count($this->getRelatedProductIds()) > 0;
}
public function getRelatedProducts()
{
    $products = array();
    foreach ($this->getRelatedProductIds() as $id) {
        $products[] = Mage::getModel('catalog/product')->load($id);
    }
    return $products;
}

Повинно бути очевидним, як використовувати ці методи в шаблоні.

Примітка: Перезапис не означає редагувати основний файл. Дотримуйтесь підручника з налаштування, якщо ви не знаєте, як переписати блок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.