Перезагрузка стола Magento AJAX на странице продукта - PullRequest
2 голосов
/ 19 марта 2012

Я уже давно борюсь с этим.У меня есть настраиваемый продукт, который настроен правильно и успешно.У меня также есть таблица, которая производится на основе размера и количества, доступного для каждой версии этого продукта, на основе детей.Смотрите здесь: dev4.printpartnerships.com/flyer-printing

Эта таблица в настоящий момент отображается при загрузке страницы, а затем использует jQuery для ее замены в зависимости от выбора выпадающего списка.Проблема в том, что это немного медленно, и мне нужно динамически перезагружать таблицу в зависимости от раскрывающегося списка.Например, если выбран раскрывающийся список 3 «Бумага», он потенциально перезагружает таблицу.Это делается этими двумя функциями и этим вызовом:

<div id="matrix-container">
    <?php $attributeSetName = Mage::getModel('eav/entity_attribute_set')->load($_product->getAttributeSetId())->getAttributeSetName(); ?>
    <?php $stock = $_product->getResource()->getAttribute('stock'); ?>
    <?php if($stock->usesSource()):?>
    <?php $options = $stock->getSource()->getAllOptions(false); ?>
        <?php foreach ($options as $k => $v):?>
            <?php $options[$k] = $v['label']; ?>
            <?php $stockQuery = $options[$k].' '.$attributeSetName; ?>
            <?php echo Mage::getModel('catalog/product_type_configurable')->getTable($_product, $stockQuery); ?>
        <?php endforeach;?>
    <?php endif;?>
</div>

И функции здесь:

    public function getMatrixData($requiredAttributeIds = null, $product = null, $stock)
{   
    Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
    $this->_usedProducts = '_cache_instance_products';
    if ($this->getProduct($product)->hasData($this->_usedProducts)) {
        if (is_null($requiredAttributeIds)
            and is_null($this->getProduct($product)->getData($this->_configurableAttributes))) {
            $this->getConfigurableAttributes($product);
            Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
            return $this->getProduct($product)->getData($this->_usedProducts);
        }

        $usedProducts = array();
        $collection = $this->getUsedProductCollection($product)
            ->addAttributeToSelect('*')
            ->addFieldToFilter('name', array('like' => '%'.$stock.'%'));

        if (is_array($requiredAttributeIds)) {
            foreach ($requiredAttributeIds as $attributeId) {
                $attribute = $this->getAttributeById($attributeId, $product);
                if (!is_null($attribute))
                    $collection->addAttributeToFilter($attribute->getAttributeCode(), array('notnull'=>1));
            }
        }

        foreach ($collection as $item) {
            $usedProducts[] = $item;
        }

        $this->getProduct($product)->setData($this->_usedProducts, $usedProducts);
    }
    Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
    return $this->getProduct($product)->getData($this->_usedProducts);
}

public function getTable($product = false, $stock) 
{
    if (!$product) return false;
        $childProducts = $this->getMatrixData(null, $product, $stock);
        $x = array();
        $r = '';

            foreach ($childProducts as $children){
                $x[$children->getAttributeText('quantity')][$children->getAttributeText('size')] = array('id'=>$children->getId(), 'price'=>number_format($children->getPrice(),'2'), 'name'=>$children->getName());
            }
        ksort($x);
        $r .= '<table id="'.strtolower(str_replace(' ','-',$stock)).'" class="matrix"><tr><th></th>';

            foreach(array_keys(current($x)) as $size){
                $r .= '<th>'.$size.'</th>';
            }
        $r .= '</tr>';

            foreach($x as $quantity => $data){
                $r .= '<tr><th>'.$quantity.'</th>';
                    foreach($data as $item){
                        $r .= '<td><a href="/checkout/cart/add?product='.$item[id].'" title="Add '.$item[name].' to basket">£'.$item[price].'</a></td>';
                    }
                $r .= '</tr>';
            }
        $r .= '</table>';
        return $r;
    }

Это прекрасно работает, как есть, и таблицы загружаются отлично, однако я хочуAJAX их, отправив раскрывающиеся значения в виде данных в сценарий AJAX и перезагрузив таблицу, а не загружая все таблицы при загрузке страницы и показывая / скрывая.Я пробовал с AJAX раньше в Magento, и у меня не было ничего, кроме проблем, я подумал, может ли кто-нибудь дать мне пример из реальной жизни, который я могу отредактировать, или что-нибудь еще, чтобы решить мою проблему.

Как вы видите, у меня естьвесь код и логику, это просто AJAX для его перезагрузки, а не JQuery для показа / скрытия.

Cheers.

1 Ответ

0 голосов
/ 13 апреля 2012

Вам нужно будет создать контроллер и действие, и там будет проходить запрос ajax.И создайте блоки и макет, если хотите.

Вот очень простой пример этого: http://subesh.com.np/2009/11/working-with-ajax-in-magento/

Он ссылается на расширение, которое вы можете использовать в качестве базы: http://www.magentocommerce.com/magento-connect/ajaxify-8411.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...