Magento _prepareLayout () вызывается 5 раз для многих - PullRequest
2 голосов
/ 25 сентября 2010

** Новый EDIT **

так что я пытаюсь это сделать.

Я хочу добавить новые элементы формы, сгенерированные моим модулем, в представлении продукта следующего URL

http://magento.example.com/catalog/product/view/id/46

в конечном итоге эти элементы будут отображаться связанной таблицей в моем модуле

Я ожидал, что если бы я расширил Mage_Catalog_Block_Product_View в своем модуле, как показано ниже, я смог бы создать в форме продукта блок, который будет содержать такие поля формы, только если он находится в соответствующей таблице в моем модуле

поэтому я создал файл test.phtml в

 app/design/frontend/default/default/templates/<module>/test.phtml

затем, как вы можете видеть в моем файле View.php, описанном ниже, я построил блок и отобразил его в представлении продукта.

Оно появилось, но в 5 раз больше. из приведенных ниже ответов это нормально, поэтому он отвечает на вопрос о том, почему он появляется пять раз, но оставляет вопрос о том, как правильно действовать, поскольку этот план не будет работать

** Конец нового редактирования **

в моем модуле я вызываю _prepareLayout (), и он делает это 5 раз, когда я поднимаю страницу

вот мой код в

/app/code/local/Namespace/Module/Product/Veiw.php
class <Namespace>_<module>_Block_Product_View extends Mage_Catalog_Block_Product_View {
    protected function _toHtml() {
        return parent::_toHtml();
    }

    public function _prepareLayout() {
        $block = $this->getLayout()->createBlock(
            'Mage_Core_Block_Template',
            'my_block_name_here',
            array('template' => '<module>/test.phtml')
        );
        if ($block){
            $this->getLayout()->getBlock('content')->insert($block)->toHtml();
        }else{
            echo "no block";
        }
            return parent::_prepareLayout();
    }
}

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

EDIT Сначала я хочу поблагодарить вас всех за ваши ответы. Во-вторых, я хочу дать вам больше контекста

причина, по которой я решил сделать это в модуле, заключается в том, что я не хочу, чтобы блок отображался на каждом продукте. У меня есть таблица того, что я назову пользовательскими параметрами, содержащими свойства продукта, такие как вес цвета волос и т. Д., И в зависимости от того, какой набор свойств привязан к продукту (если есть), будет зависеть от того, какой HTML-контент показать на странице. так что в одном случае это может быть выпадающее меню, а в другом - поле ввода. другая очень важная часть - это то, что это должно быть настроено так, чтобы я мог выдать конечный результат в виде модуля, который можно установить, и не беспокоиться, что он не будет отображаться, если кто-то обновит его magento

тем не менее, имеет ли смысл делать все это в файле xml?

Ответы [ 2 ]

5 голосов
/ 27 сентября 2010

Мне кажется, что ваш код переопределяет основной модуль Magento для достижения того, что можно легко сделать в конфигурации макета XML.Я настоятельно рекомендую следующее:

  1. Используйте встроенные механизмы конфигурации (например, layout xml - прочитайте превосходное руководство Алана здесь ) вместо того, чтобы писать код, когда это возможно.
  2. Не переопределяйте код ядра
  3. , если вам нужно изменить поведение кода ядра, используйте Обозреватель, а не переписывать / переопределять
  4. , если вам абсолютно необходимо переопределить, всегда вызов parent::whatever()

Например, если вы создаете файл макета <module>.xml в своей теме (app/design/frontend/default/<theme>/layout), вы можете использовать следующий код:

<catalog_product_view>
    <reference name="content">
        <block type="module/block" name"my_block_name_here" template="module/test.phtml"/>
    </reference>
</catalog_product_view>

Затем вам потребуется использовать getChildHtml('my_block_name_here'); вызов в вашем phtml для позиционирования блока.

Таким образом, если внутри вашего _prepareLayout нет других функций, нет необходимости переопределять ядро ​​или даже переопределять значение по умолчанию catalog.xml.

EDIT (небольшое редактированиевыше)

Итак, теперь в вашем блоке (я бы порекомендовал назвать его Namespace_Module_Block_Product_Customattributes или что-то в этом роде), вы не переопределяете основной блок Product_View, а просто обрабатываете свою логику для получения HTMLвиджеты, используемые для визуализации ваших пользовательских атрибутов.Оставьте остальные цены уровня, добавьте в корзину, другой общий код блока продукта и т. Д. Для Magento для разработки.

Если вы беспокоитесь о пути обновления для пользователей вашего модуля, вам определенно НЕ следует переопределятьосновной код.Используйте подход конфигурации и очень избирательно вводите код, который «хорошо играет» с системой, а не пытайтесь использовать его с переопределениями.

4 голосов
/ 26 сентября 2010

Я посмотрел на стандартную версию Magento CE 1.4.1 и немодифицированный метод _prepareLayout вызывается шесть раз при загрузке URL

http://magento.example.com/catalog/product/view/id/46

Это потому, чтокласс создается шесть раз.Так что это правильное поведение.

Что касается исчезающего элемента, я могу сказать наверняка, но ваше переопределение к _prepareLayout не похоже ни на

  1. Выполните те же действия, что и Mage_Catalog_Block_Product_View :: _ prepareLayout

  2. Вызовите parent :: _ prepareLayout ();

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

Непонятно, чего вы здесь пытаетесь достичь.Вы должны разбить свою проблему на более мелкие, а затем опубликовать один (или более) вопрос типа «Я пробовал X, ожидал Y и получил Z».Как написано, никто не сможет ответить на ваш вопрос.

...