2012-03-19 4 views
2

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

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

<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.

+0

Я не знаю вашей цели, но вы можете использовать JQuery данных-таблицу, в которой доступно большинство вещей, которые вы хотите. [jQuery DataTables] (http://www.datatables.net/) –

+0

Привет Огуз, это выглядит нормально, но моя проблема не в самой таблице данных, так как это работает отлично (см. мою страницу примера), она работает с ней Magento отправить запрос AJAX. Как я уже сказал, я пробовал это раньше, когда Magento просто вызывает простые переменные и получает ошибки метода и т. Д., Обычно указывающие на такие вещи, как необходимые классы, не загружаются. Однако это было сделано по предыдущей попытке. –

+0

Как загрузить все необходимые значения, затем отфильтровать по выбору, чтобы устранить проблему с производительностью. –

ответ

0

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

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

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

Смежные вопросы