2012-03-19 53 views
2

我一直在與此戰鬥了一段時間。我有一個可以正確設置併成功完成的可配置產品。我還有一張桌子,根據兒童的基礎上產生的每個版本的產品的大小和數量。看到這裏:dev4.printpartnerships.com/flyer-printingMagento AJAX在產品頁面上重新加載

這張表當前呈現在頁面加載然後使用jQuery來交換它取決於下拉框選擇。問題是它有點慢,我需要根據下拉列表動態重新加載JUST表。例如,當選擇下拉式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腳本並重新加載表格,而不是加載頁面加載和顯示/隱藏的所有表格。我之前在Magento嘗試過使用AJAX,除了問題之外,我想知道是否有人可以給我一個我可以編輯的真實世界的例子或任何可以解決我的問題的方法。

正如你所看到的,我擁有所有的代碼和邏輯,它只是讓它重新加載而不是jQuery來顯示/隱藏。

乾杯。

+0

我不知道你的目標,但你可以使用jQuery的數據表,是可用的大多數東西,你想要的。 [jQuery DataTables](http://www.datatables.net/) – 2012-03-19 11:05:18

+0

嗨Oguz,看起來不錯,但我的問題不是數據表本身,因爲它工作得很好(請參閱我的示例頁面)它正在與Magento發送一個AJAX請求。正如我所說我以前在Magento中嘗試過,只是調用簡單變量並獲取方法錯誤等,通常指向類似的東西,如必要的類不加載。雖然這是以前的嘗試。 – 2012-03-19 11:14:49

+0

如何加載所有必要的值,然後通過選擇進行過濾以消除性能問題。 – 2012-03-19 11:23:17

回答