Загрузка представления продукта в списке категорий с AJAX

14

Я пытаюсь загрузить блок представления продукта на странице списка категорий с помощью AJAX, используя Ajaxify . Все работает нормально, единственная проблема заключается в том, что окно параметров (childhtml "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>
[...]

но я не уверен, что именно проблема.

Я надеюсь, что кто-то может указать мне правильное направление.

С уважением, Сандер Мангель

Сандер Мангель
источник
1
Сандер - я быстро взглянул на расширение Ajaxify, и не совсем понятно, как ты его используешь. Какой именно javascript (или PHP + javascript) вы используете для вызова Ajaxify, и какой код вы добавили в контроллер (если есть) или XML-формат Ajaxify для обработки запроса? В основном, дайте нам достаточно информации, чтобы воссоздать проблему с нашей стороны, и мы, вероятно, сможем направить вас в правильном направлении.
Алан Шторм
Я решил переписать свой код, не используя Ajaxify, просто для простоты. Если проблема все еще существует, отправьте расширение с вопросом. Это, вероятно, намного проще. Спасибо за ваш комментарий
Сандер Мангель
Вы можете использовать ajax каталог, загружающий расширение для magento, он будет загружать продукты по прокрутке. Вы также можете добавить кнопку, нажав на которую будут загружены другие продукты. fmeextensions.com/magento-ajax-catalog-pro.html
Эй @SanderMangel, ты открыл исходное расширение? Thx
joseantgv

Ответы:

7

В прошлом у нас была похожая проблема при попытке ввести всплывающее окно быстрого просмотра на странице списка категорий. Вот несколько проблем, с которыми мы столкнулись:

  • /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()
));

Надеюсь, это поможет пролить некоторый свет на то, где вы идете не так

lukefowell
источник
Привет Люк, я думаю, что это может быть решением. Я переписываю все расширение. Если это работает плохо, пометьте этот пост как awnser (и, конечно, с открытым исходным кодом расширение). Благодарность!
Сандер Мангель
1

Проблема в том, что опции добавляются через JavaScript, а не как HTML в каталог / product / view / type / options / configurable.html:

<script type="text/javascript">
    var spConfig = new Product.Config(<?php echo $this->getJsonConfig() ?>);
</script>

Кажется, ваш Ajax-скрипт заменяет HTML, но не выполняет в нем JS. Вы должны выполнить эту часть вручную, но есть несколько способов сделать это:

  • preg_match все внутри тегов скрипта и вызывать это через eval
  • разделите ваш вывод в части html и javascript, чтобы вы могли получить как по отдельности
Тобиас
источник
Привет, Тобиас, спасибо за новость. Вы правы в том, что javascript не выполняется, но все равно должен быть вставлен какой-то html-код для подготовки параметров. Div # product-options-wrapper полностью пуст.
Сандер Мангель
0

Я смог продвинуться только с принятым здесь ответом. Чтобы заставить вещи работать с модальностью Twitter Bootstrap, мне нужно было использовать 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 Bootstrap Modal. Однако, следуя приведенным ниже советам, должно быть легко загрузить ваш продукт и запустить прилагаемый javascript, чтобы заставить его контент работать правильно. Нет необходимости добавлять product.js и т. Д. На страницу вашей категории.

Theodores
источник