Установка модели в качестве данных шаблона (атрибута) для дочернего блока - PullRequest
0 голосов
/ 26 января 2012

В моем шаблоне представления продукта я загружаю дочерний шаблон и передаю экземпляр продукта, который будет доступен в этом дочернем шаблоне:

<?php
    echo $this->getLayout()
        ->createBlock('core/template')
        ->setTemplate('catalog/product/view/addedToCartDialog.phtml')
        ->setAttribute('product', $_product)
        ->toHtml();
?>

Тогда в моем каталоге / product / view / AddedToCartDialog.phtml я пытаюсь использовать этот экземпляр продукта:

<code><?php $product = $this->getData('product'); ?>
<?php echo"<pre>";print_r($product->getId());echo"
";?>

Однако, похоже, что он не загружен: Неустранимая ошибка: вызов функции-члена getId () для необъекта в / home / ryba / workspace / polcode / Greenlights / app / design / frontend / default / greenlights / template /catalog/product/view/addedToCartDialog.phtml в строке 2 Но когда я проверяю переменную $ product с print_r:

<code><?php echo"<pre>";print_r($product);echo"
";?>

Отображается, что эта переменная является корректной Mage_Catalog_Model_Product Object, также проверяется, если атрибуты верны (например, sku, name и т. Д.) - все правильно.

Что с этим не так?

1 Ответ

1 голос
/ 26 января 2012

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

Прямой ответ:

Вместо использования setAttribute, просто используйте магические методы setter / getter:

<?php
// In catalog/product/view.phtml
echo $this->getLayout()
    ->createBlock('core/template')
    ->setTemplate('catalog/product/view/addedToCartDialog.phtml')
    ->setProduct($_product)
    ->toHtml();
?>

<?php
// In addedToCartDialog.phtml
$_product = $this->getProduct();
echo $_product->getId();
?>

Better:

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

<?php
// In catalog/product/view.phtml
echo $this->getLayout()
    ->createBlock('core/template')
    ->setTemplate('catalog/product/view/addedToCartDialog.phtml')
    ->toHtml();
?>

<?php
// In addedToCartDialog.phtml
$_product = Mage::registry('product');
echo $_product->getId();
?>

Еще лучше

Лучшим способом было бы использовать другой тип блока с уже загруженными методами (опять же, если вы знаете, что находитесь в шаблоне, загруженном каталогом / контроллером продукта)

<?php
// In catalog/product/view.phtml
echo $this->getLayout()
    ->createBlock('catalog/product_view')
    ->setTemplate('catalog/product/view/addedToCartDialog.phtml')
    ->toHtml();
?>

<?php
// In addedToCartDialog.phtml
$_product = $this->getProduct();
echo $_product->getId();
?>

И, наконец, лучший

Последний пункт бизнеса. Лучший способ добавить дополнительные блоки в шаблоны - добавить блок в файл local.xml.

<!-- Local.xml -->
<catalog_product_view translate="label">
  <reference name="content">
    <block type="catalog/product_view" name="addedToCartDialog" as="addedToCartDialog" template="catalog/product/view/addedToCartDialog.phtml" />
  </reference>
</catalog_product_view>

Теперь настройте свой phtml файл

<?php
// In addedToCartDialog.phtml
$_product = $this->getProduct();
echo $_product->getId();
?>

Затем вызовите блок из вашего phtml файла

// In catalog/product/view.phtml
<?php echo $this->getChildHtml('addedToCartDialog'); ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...