Création d'un attribut personnalisé via la configuration, mais il ne semble nouveaux produits
-
16-10-2019 - |
Question
Bonjour j'ai le code suivant de configuration:
$installer = new Mage_Catalog_Model_Resource_Setup('core_setup');
$installer->addAttribute('catalog_product', 'shipping_city', array(
'group' => 'General',
'type' => Varien_Db_Ddl_Table::TYPE_VARCHAR,
'backend' => '',
'frontend' => '',
'label' => 'Envio p/ Cidade',
'input' => 'text',
'class' => '',
'source' => '',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
'visible' => false,
'required' => false,
'user_defined' => true,
'default' => '',
'searchable' => true,
'filterable' => true,
'comparable' => false,
'visible_on_front' => true,
'unique' => false,
'apply_to' => 'simple,configurable,virtual',
'is_configurable' => false ));
$installer->endSetup();
Alors je déboguer les produits avec de "et" l'événement:
$product = $observer->getEvent()->getProduct();
Zend_Debug::dump($product->debug());die;
Le problème est que si je tente de sauver un produit déjà existant, il obtient l'événement et mon débogage apporte pas mon shipping_city d'attribut. Dans un nouveau produit, il apparaît dans mon débogage, mais seulement dans de cas de save_after, dans le aswell save_before ne marche pas apparaître ...
Les gars pensées?
La solution
Si vous ajoutez un nouvel attribut et il a été ajouté à l'ensemble d'attributs que vous voulez dans, tout se passait bien avec $installer->addAttribute
.
Le problème est, en raison de la EAV il n'y a pas de valeur pour votre nouvel attribut. Ce moyen d'interrogation et de filtrage par celui-ci, des moyens de filtrage par NULL et si vous appelez $product->getNewAttribute()
vous obtenez juste NULL
.
Mais ce comportement est correct et prévu.
Vous pouvez résoudre ce problème en écrivant un petit script et définir une valeur par défaut sur tous les produits, comme ceci:
$collection = Mage::getResourceModel('catalog/product_collection')->filterByWhateverYouWant();
foreach($collection as $product) {
$product->setNewAttribute('myCoolValue')->save();
}
Soyez prudent. Ce script fait une requête pour chaque produit dans la collection qui pourrait être beaucoup.