Загрузка представления продукта в список категорий с помощью AJAX
Я пытаюсь загрузить блок просмотра продукта на странице списка категорий с помощью AJAX, используя Ajaxify. Все работает нормально, единственная проблема заключается в том, что поле параметров (дочерний файл "container1") загружено неправильно. Он не показывает параметры.
У кого-нибудь есть опыт в этом, может быть, пробовал что-то подобное? Я устанавливаю активный продукт в контроллере с помощью
$productId = (int) $this->getRequest()->getParam('product_id');
Mage::helper('catalog/product')->initProduct($productId, $this);
Перед визуализацией макета.
Я думаю, что это как-то связано с тем фактом, что параметры добавляются в представление в другой части catalog.xml
[...]
<PRODUCT_TYPE_configurable translate="label" module="catalog">
<label>Catalog Product View (Configurable)</label>
<reference name="product.info">
<block type="catalog/product_view_type_configurable" name="product.info.configurable" as="product_type_data" template="catalog/product/view/type/default.phtml">
<block type="core/text_list" name="product.info.configurable.extra" as="product_type_data_extra" translate="label">
<label>Product Extra Info</label>
</block>
</block>
</reference>
<reference name="product.info.options.wrapper">
<block type="catalog/product_view_type_configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="catalog/product/view/type/options/configurable.phtml"/>
</reference>
</PRODUCT_TYPE_configurable>
[...]
Но я не уверен, в чем конкретно заключается проблема.
Я надеюсь, что кто-нибудь сможет указать мне правильное направление.
С уважением, Сандер Мангель
3 answers
В прошлом у нас была аналогичная проблема при попытке ввести всплывающее окно быстрого просмотра на странице списка категорий. Вот несколько проблем, с которыми мы столкнулись: -
-
/js/varien/product.js
&/js/varien/configurable.js
по умолчанию не включены на странице списка категорий, которые необходимы для создания настраиваемых раскрывающихся списков. Встроенный JS ниже требует этого.<script type="text/javascript"> var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>); </script>
Другая проблема, с которой мы столкнулись, заключалась в том, что при попытке включить более одного из них на страницу у нас возникали проблемы с дубликаты удостоверений личности, в любом случае это может не относиться к вам, но убедитесь, что у вас их несколько, вы уничтожите их при закрытии.
Мы сделали это, создав пустой файл контроллера, который позволяет нам использовать уникальный дескриптор макета, например". Который вы можете использовать в следующем формате xml.
<custom_catalog_product_ajax_view>
<update handle="catalog_product_view" />
<remove name="html_calendar" />
<reference name="root">
<action method="setTemplate"><template>custom/catalog/ajax/product/response.phtml</template></action>
</reference>
<reference name="product.info">
<action method="setTemplate"><template>custom/catalog/ajax/product/view.phtml</template></action>
<action method="append">
<block>breadcrumbs</block>
</action>
</reference>
<reference name="product.info.media">
<action method="setTemplate"><template>custom/catalog/ajax/product/view/media.phtml</template></action>
</reference>
<reference name="product.info.options.configurable">
<action method="setTemplate"><template>custom/catalog/ajax/product/view/type/options/configurable.phtml</template></action>
</reference>
</custom_catalog_product_ajax_view>
Это означало, что мы могли бы включить соответствующие блоки и настроить некоторые аспекты обычной страницы продукта.
Мы также добавили это в дескриптор, чтобы включить необходимые файлы JS.
<catalog_category_default>
<update handle="required_for_catalog_ajax_product_view" />
</catalog_category_default>
<required_for_catalog_ajax_product_view>
<reference name="head">
<action method="addJs"><script>varien/product.js</script></action>
<action method="addJs"><script>varien/configurable.js</script></action>
</reference>
</required_for_catalog_ajax_product_view>
Наш файл response.phtml также выглядит так
<?php echo Zend_Json::encode(array(
'success' => true,
'html' => $this->getChildHtml('content'),
'optionsPrice' => $this->getOptionsPrice(),
'spConfig' => $this->getSpConfig()
));
Надеюсь, это поможет пролить некоторый свет на то, где вы ошибаетесь
Проблема в том, что параметры добавляются с помощью JavaScript, а не в виде HTML в catalog/product/view/type/options/configurable.html :
<script type="text/javascript">
var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>);
</script>
Ваш сценарий Ajax, похоже, просто заменяет HTML, но не выполняет JS в нем. Вы должны выполнить эту часть вручную, но есть несколько способов сделать это:
- предварительно сопоставьте все внутри тегов скрипта и вызовите это через eval
- разделите вывод на части html и javascript, чтобы вы могли получить оба индивидуально
Я смог продвинуться так далеко только с принятым ответом, представленным здесь. Чтобы заставить вещи работать с модальным загрузчиком Twitter, мне нужно было использовать Prototype для загрузки настраиваемого продукта и настроить его для запуска сценариев на возвращаемой странице:
new Ajax.Updater(target, product, {
parameters: { evalJS: true},
...
Кроме того, когда я закрыл свой модальный, мне нужно было полностью очистить содержимое:
$(document.body).on('hidden.bs.modal', function () {
delete spConfig;
$('#myModal').html('<div class="modal-dialog">...</div>');
...
Я не предоставил здесь полного решения, так как теперь, когда я нашел, что происходит, мне нужно провести рефакторинг моего контроллера и завершить шаблон для моих продуктов, чтобы он возвращал аккуратный заголовок и т. Д. для работы с модальным загрузчиком Twitter. Однако, следуя следующим советам, вам должно быть легко загрузить свой продукт и запустить javascript, который поставляется с ним, чтобы его содержимое работало правильно. Нет необходимости добавлять product.js и т.д. на страницу вашей категории.