2014-12-19 3 views
0

Я использую Magento Community 1.9.0.0.Magento - Multi Select Категория Атрибут не сохраняется

Я программно создал атрибут настраиваемой категории, который является мульти-select. Атрибут можно увидеть в разделе моей категории admin. Когда я выбираю любые значения - будь то один или несколько, и нажмите «Сохранить», я получаю успешное сохраненное сообщение, но значения никогда не сохраняются.

Я также попробовал расширение, которое создает атрибуты категории. У этого была та же проблема. Когда я контактировал с опорой, они сказали:

Категория объекта не поддерживает множественный выбор, поэтому этот тип атрибута не будет работать с категорией.

Это правда? Может ли multi select не работать с атрибутами категории на CE-1.9?

Вот код, я использую, чтобы создать его программно:

require_once('app/Mage.php'); 
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); 
$installer = new Mage_Sales_Model_Mysql4_Setup; 
$attribute = array(
    'type' => 'text', 
    'label'=> 'Room Type', 
    'input' => 'multiselect', 
    'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL, 
    'visible' => true, 
    'required' => false, 
    'user_defined' => true, 
    'default' => "", 
    'group' => "General Information", 
    'option' => array ( 
     'value' => array(
      'kitchen' => array('Kitchen'), 
      'bedroom' => array('Bedroom'), 
      'bathroom' => array('Bathroom'), 
      'loft' => array('Loft'), 
      'basement' => array('Basement'), 
      'lounge' => array('Lounge') 
     ) 
    ) 

); 
$installer->addAttribute('catalog_category', 'room_type', $attribute); 
$installer->endSetup(); 
+0

Multiselect должен определенно работать с атрибутами категории. Следуйте этому руководству. Это для textarea, но вы можете создать его для выпадающего списка аналогичным образом. http://www.atwix.com/magento/add-category-attribute/ – Harit

+0

Знаете ли вы, почему это может не спасти? –

+0

Вы создали исходную модель? Отправьте свой код здесь. – Harit

ответ

0

Так что этот вопрос немного старый, но я думаю, лучше поздно, чем никогда.

Категории могут работать великолепно с несколькими избранными, вам просто нужно немного помочь им. Мультиселекторы отправляются в объект категории как массив, который он не может обрабатывать, то есть вы получаете пустой мультиселект. То, что вы хотите сделать, - объединить идентификаторы в одну строку. Либо используя javascript, либо как я, используя наблюдателя.

Мой атрибут multiselect называется category_limit.

Это идет в config.xml

<events> 
    <catalog_category_prepare_save> 
     <observers> 
      <rianorie_categorylimit_save> 
       <class>rianorie_categorylimit/observer</class> 
       <method>adjustCategory</method> 
      </rianorie_categorylimit_save> 
     </observers> 
    </catalog_category_prepare_save> 
</events> 

и это реальный наблюдатель делает работу:

class RianOrie_CategoryLimit_Model_Observer 
{ 
    public function adjustCategory(Varien_Event_Observer $observer) 
    { 
     $event = $observer->getEvent(); 
     $category = $event->getCategory(); 
     $category->setCategoryLimit(
       implode(',', $category->getCategoryLimit()) 
     ); 
    } 
} 
0

@Rian является правильным, множественного выбора значения передаются в виде массива, который может Не обрабатываться. Однако нам не нужно использовать наблюдателя. Вместо этого мы должны добавить базовую модель для атрибута. Добавьте следующую строку в массив данных атрибутов при ее создании.

'backend' => 'your_module/category_attribute_backend_related', 

В модели бэкэнда (Your_Module_Model_Category_Attribute_Backend_Related), вы должны иметь следующие функции, которые помогут выбранные параметры будут сохранены или загружены правильно.

public function beforeSave($object) { 
    $attributeCode = $this->getAttribute()->getName(); 
    if ($attributeCode == 'room_type') { 
     $data = $object->getData($attributeCode); 
     if (!is_array($data)) { 
      $data = array(); 
     } 
     $object->setData($attributeCode, join(',', $data)); 
    } 
    if (is_null($object->getData($attributeCode))) { 
     $object->setData($attributeCode, false); 
    } 
    return $this; 
} 

public function afterLoad($object) { 
    $attributeCode = $this->getAttribute()->getName(); 
    if ($attributeCode == 'room_type') { 
     $data = $object->getData($attributeCode); 
     if ($data) { 
      $object->setData($attributeCode, explode(',', $data)); 
     } 
    } 
    return $this; 
}