2012-01-05 3 views
0

На странице списка категорий на моем сайте Magento у меня есть столбец справа, который загружает страницу просмотра продукта через AJAX, когда пользователь нажимает на продукт. Я могу получить весь контент со страницы просмотра, например изображения, вкладки и т. Д., Но я не могу получить настраиваемые параметры продукта, потому что они хранятся как переменная javascript.Magento: Получить параметры конфигурации продукта на странице категории

Любые идеи о том, как я могу получить эту информацию, а?

Редактировать - Лучшее объяснение: Я пытаюсь дать пользователю возможность настроить продукт прямо со страницы категории, показывая им все параметры, не переходя на страницу просмотра каждого продукта. До сих пор мне удалось получить html, но выпадающие списки пустые. И это потому, что все опции & их цены хранятся как переменная javascript на странице просмотра. Поэтому мой вопрос: как мне получить эти параметры через ajax-вызов? & загрузить выпадающие списки & заставить их работать точно так, как они делают на странице просмотра продукта?

+0

Вы пытаетесь получить значения или ключи (имя/тип/и т.д.) для настраиваемых параметров? – shybovycha

+0

Попытка получить все, включая интерфейс, в котором пользователь выбирает параметры, и цена автоматически обновляется. Я могу получить html для этого, но список опций пуст! –

+0

errr ... Что конкретно вы пытаетесь получить из продукта/категории? Просто не понял смысл слова «все» и связал его с вопросом ... – shybovycha

ответ

1

Magento использует JS, это правда. Он использует класс Mage_Catalog_Block_Product_View_Type_Configurable для отображения настраиваемых продуктов. И вы должны быть заинтересованы в его методе getJsonConfig(). Он используется в шаблоне app/design/frontend/base/default/template/catalog/product/view/type/options/configurable.phtml, чтобы отобразить код javascript, который делает магию, как вы сказали.

Таким образом, в шаблоне он выглядит следующим образом:

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

В браузере это выглядит следующим образом:

<script type="text/javascript"> 
    var denyProduct = {"62":["12","9"]}   
    var spConfig = new Product.Config({"attributes":{"70":{"id":"70","code":"manufacturer","label":"Manufacturer","options":[{"id":"11","label":"Fischer","price":"10","oldPrice":"10","products":["61","66"]},{"id":"12","label":"Queen mum","price":"20","oldPrice":"20","products":["62"]}]},"122":{"id":"122","code":"size","label":"Maat","options":[{"id":"9","label":"M","price":"15","oldPrice":"15","products":["61","62"]},{"id":"10","label":"S","price":"0","oldPrice":"0","products":["66"]}]}},"template":"\u20ac\u00a0#{price}","basePrice":"150","oldPrice":"150","productId":"64","chooseText":"Kies een optie...","taxConfig":{"includeTax":true,"showIncludeTax":true,"showBothPrices":false,"defaultTax":19,"currentTax":19,"inclTaxTitle":"Incl. BTW"}}); 
</script> 

И код, который создает все, что JavaScript варианты есть (Mage_Catalog_Block_Product_View_Type_Configurable::getJsonConfig() метод):

$attributes = array(); 
$options = array(); 
$store  = $this->getCurrentStore(); 
$taxHelper = Mage::helper('tax'); 
$currentProduct = $this->getProduct(); 

$preconfiguredFlag = $currentProduct->hasPreconfiguredValues(); 
if ($preconfiguredFlag) { 
    $preconfiguredValues = $currentProduct->getPreconfiguredValues(); 
    $defaultValues  = array(); 
} 

foreach ($this->getAllowProducts() as $product) { 
    $productId = $product->getId(); 

    foreach ($this->getAllowAttributes() as $attribute) { 
     $productAttribute = $attribute->getProductAttribute(); 
     $productAttributeId = $productAttribute->getId(); 
     $attributeValue  = $product->getData($productAttribute->getAttributeCode()); 
     if (!isset($options[$productAttributeId])) { 
      $options[$productAttributeId] = array(); 
     } 

     if (!isset($options[$productAttributeId][$attributeValue])) { 
      $options[$productAttributeId][$attributeValue] = array(); 
     } 
     $options[$productAttributeId][$attributeValue][] = $productId; 
    } 
} 

$this->_resPrices = array(
    $this->_preparePrice($currentProduct->getFinalPrice()) 
); 

foreach ($this->getAllowAttributes() as $attribute) { 
    $productAttribute = $attribute->getProductAttribute(); 
    $attributeId = $productAttribute->getId(); 
    $info = array(
     'id'  => $productAttribute->getId(), 
     'code'  => $productAttribute->getAttributeCode(), 
     'label'  => $attribute->getLabel(), 
     'options' => array() 
    ); 

    $optionPrices = array(); 
    $prices = $attribute->getPrices(); 
    if (is_array($prices)) { 
     foreach ($prices as $value) { 
      if(!$this->_validateAttributeValue($attributeId, $value, $options)) { 
       continue; 
      } 
      $currentProduct->setConfigurablePrice(
       $this->_preparePrice($value['pricing_value'], $value['is_percent']) 
      ); 
      Mage::dispatchEvent(
       'catalog_product_type_configurable_price', 
       array('product' => $currentProduct) 
      ); 
      $configurablePrice = $currentProduct->getConfigurablePrice(); 

      if (isset($options[$attributeId][$value['value_index']])) { 
       $productsIndex = $options[$attributeId][$value['value_index']]; 
      } else { 
       $productsIndex = array(); 
      } 

      $info['options'][] = array(
       'id'  => $value['value_index'], 
       'label'  => $value['label'], 
       'price'  => $configurablePrice, 
       'oldPrice' => $this->_preparePrice($value['pricing_value'], $value['is_percent']), 
       'products' => $productsIndex, 
      ); 
      $optionPrices[] = $configurablePrice; 
      //$this->_registerAdditionalJsPrice($value['pricing_value'], $value['is_percent']); 
     } 
    } 
    /** 
    * Prepare formated values for options choose 
    */ 
    foreach ($optionPrices as $optionPrice) { 
     foreach ($optionPrices as $additional) { 
      $this->_preparePrice(abs($additional-$optionPrice)); 
     } 
    } 
    if($this->_validateAttributeInfo($info)) { 
     $attributes[$attributeId] = $info; 
    } 

    // Add attribute default value (if set) 
    if ($preconfiguredFlag) { 
     $configValue = $preconfiguredValues->getData('super_attribute/' . $attributeId); 
     if ($configValue) { 
      $defaultValues[$attributeId] = $configValue; 
     } 
    } 
} 

$taxCalculation = Mage::getSingleton('tax/calculation'); 
if (!$taxCalculation->getCustomer() && Mage::registry('current_customer')) { 
    $taxCalculation->setCustomer(Mage::registry('current_customer')); 
} 

И код, который связывает эти значения с <select> элементов находится в файле Product.js.

Если вы хотите получить все атрибуты, используемые в некоторых категориях, вот решение: предположим, что у вас есть переменная $_productCollection, заполненная продуктами категории. После этого вы можете выполнить эту производительность непосильным код:

$setIds = array(); 

foreach ($_productCollection as $k => $product) 
{ 
    $setIds[] = $product->getAttributeSetId(); 
} 

/** @var $collection Mage_Catalog_Model_Resource_Product_Attribute_Collection */ 
$collection = Mage::getResourceModel('catalog/product_attribute_collection'); 
$collection 
    ->setItemObjectClass('catalog/resource_eav_attribute') 
    ->setAttributeSetFilter($setIds) 
    ->addStoreLabel(Mage::app()->getStore()->getId()) 
    ->setOrder('position', 'ASC'); 

$collection->load(); 

Таким образом, вы должны получить все атрибуты (с повторами) в переменной $collection.

Надеюсь, это как-то поможет.

+0

Благодарим вас за подробный ответ. Теперь у меня есть четкое представление о том, откуда взялись варианты. Но я боюсь, что не смогу использовать это решение, потому что, как вы упомянули, это потрясающий результат! Мне придется посмотреть на другие способы достижения этого. Еще раз спасибо! Ценить это. –

+0

Если вы кешируете переменную '$ _productCollection' или даже коллекцию атрибутов while - производительность повышается;) Когда мы делаем магию в офисе - нам не все равно, что производительность в Magento - это в основном бесполезно =) – shybovycha

0

Это может привести к значительным ресурсам сервера, так как для каждого продукта может быть много вариантов. Лучший способ - использовать ajax, чтобы загружать ВСЕ опции при запросе. Я нашел это расширение, которое сначала загрузит цвета, а затем, когда вы нажмете на него, вы получите все параметры продукта.

http://www.consofas.com/plugins/options-quickview-for-configurable-products-in-magento/

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