Я использую Magento CE 1.9 и у меня есть фрагмент кода, который отображает пометку на странице продукта:
шаблон> каталог> продукт> view.phtml
код php:
< ? php echo $ this-> getProduct () -> getSku ()?>
это прекрасно работает, но если я пытаюсь добавить sku где-то еще на странице … например, для фрагмента кода для PowerReviews, где требуется динамический вставку SKU для отслеживания … если я добавлю тот же код php чтобы получить пометку, он ломает страницу прямо там. Я не уверен, почему я могу отобразить sku в view.phtml, но не на вкладке страницы продукта, например …
в этом примере он мне нужен в пользовательской вкладке, которую я сделал … так что это будет: frontend / rwd / default / template / so / reviews.phtml
Я думаю, что ваша проблема заключается в понимании того, как определяются блоки Magento. Шаблоны, как app/design/frontend/[DESIGN PACKAGE]/[THEME]/template/catalog/product/view.phtml
, иметь соответствующее определение блока PHP. Этот конкретный шаблон, например, имеет свой блок, определенный в app/code/core/Mage/Catalog/Block/Product/View.php
— и вы даже должны увидеть, что это прокомментировано в верхней части основного файла шаблона для блока представления продукта:
/**
* Product view template
*
* @see Mage_Catalog_Block_Product_View
* @see Mage_Review_Block_Product_View
*/
Внутри определения блока вы должны найти метод getProduct
вот почему вы можете получить доступ к этому методу из view.phtml
блок. $this
переменная ссылается на экземпляр объекта определения блока, поэтому экземпляр Mage_Catalog_Block_Product_View
, другими словами. Если другие определения блоков (в том числе из сторонних библиотек), в которых вы хотите получить доступ к продукту, не определяют такой метод, как getProduct
(или наследовать от определения блока, которое это делает), тогда вы не сможете вызвать этот метод и вернуть продукт. Что ты Можно do, это определить аналогичный метод в определении блока для любого блока, который вы хотите использовать для доступа к данным продукта. Например, вы можете скопировать getProduct
определение метода из определения блока представления основного продукта в определение блока для блока из вашего расширения PowerReviews.
Этот ресурс должен дать вам хороший обзор и, надеюсь, лучшее понимание концепции:
ОБНОВИТЬ: Вот немного больше указаний и некоторые уточнения моего ответа в комментариях. Одним из способов решения этой проблемы является использование существующего определения блока для вашего блока в определении макета, например, так:
Вы можете использовать существующее определение блока для вашего файла шаблона или создать свое собственное (и, возможно, наследовать этот класс)
<block type="catalog/product_view" name="my.product.block" template="path/to/custom/template.pthml" />
Обратите внимание, что я использую ядро Magento catalog/product_view
тип блока, который соответствует файлу PHP, который я упоминал ранее, который определяет блок и его getProduct
метод.
Или, если вам нужны какие-то пользовательские функции в вашем блоке, но вы хотите полагаться на базовую функциональность существующего блока, определите свой собственный блок и расширьте существующий, который обладает желаемой функциональностью:
class MyPackage_MyExtension_Block_Product_View extends Mage_Catalog_Block_Product_View {
// add your custom methods
}
Здесь я расширяю существующее определение блока ядра Magento, которое имеет метод, который вы хотите. Затем используйте собственное определение блока в определении макета:
<block type="mypackage_myextension/product_view" name="my.product.block" template="path/to/custom/template.pthml" />
Надеюсь, это поможет прояснить ситуацию немного подробнее.
Других решений пока нет …