Question

Dans mon modèle de ressource que je l'ai défini un champ comme sérialisable (voir $_serializableFields de propriété Mage_Core_Model_Resource_Db_Abstract):. Poignées Magento automatiquement sérialisation / délinéarisation du contenu lorsque les données de chargement de la base de données et avant d'enregistrer l'objet

Cela fonctionne parfaitement, mais quand je itérer sur une collection de ces objets, le contenu du champ ne sont pas délinéarisée automatiquement. J'ai essayé avec $collection->walk('afterLoad') mais très vite rendu compte que unserializeFields() est déclenchée dans le modèle des ressources load(), et non pas dans afterLoad() comme je l'ai d'abord pensé. Quelle est la meilleure pratique dans ce cas? Comment puis-je obtenir ce champ automatiquement en desordre? Je peux bien sûr recharger l'objet dans ma boucle, faire quelque chose comme $object = $object->load($object->getId()), mais je me demandais s'il y a une façon plus intelligente pour y parvenir.

Était-ce utile?

La solution

  

Je peux bien sûr recharger l'objet dans ma boucle, faire quelque chose comme $object = $object->load($object->getId())

Ceci est pas un reload - c'est une charge . Articles (instances de modèle) dans les collections ne sont pas chargé. Ils ont simplement eu un tableau associatif de données de ligne de résultats qui leur sont appliquées. Il est une différence importante et un peu déroutant entre ces instances de modèle appartenant à la collecte et des celles qui sont données d'auto-charge grâce à leur modèle de ressources.

Dans la _afterLoad() de votre collection, sur la _items itérer et unserialize() le champ approprié:

protected function _afterLoad()
{
    parent::_afterLoad();
    foreach ($this->getItems() as $item) {
        $item->setData('field',unserialize($item->getData('field')));
        $item->setDataChanges(false);
        //The above sets items as not dirty.
        //Value will be serialized on save via resource model.
    }
    return $this;
}

Autres conseils

Pour ce faire, pour les collections de produits, j'ai ajouté un écouteur d'événement à catalog_product_collection_load_after et itérer sur tous les produits.

/**
 * Apply backend manipulations of attributes to collection items.
 * Listens to catalog_product_collection_load_after.
 *
 * @param Varien_Event_Observer $observer
 * @return Mage_Catalog_Model_Observer
 */
public function loadCollectionAttributes(Varien_Event_Observer $observer)
{
    $collection = $observer->getCollection();
    /* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
    foreach ($collection as $product) {
        /* @var $product Limora_Catalog_Model_Product */
        foreach ($product->getAttributes() as $attribute) {
            /* @var $attribute Mage_Eav_Model_Attribute */
            $attribute->getBackend()->afterLoad($product);
        }
    }
}

Ou plus simplement, dans votre collection de modèle de ressources: -

class Collection 
extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    protected function _afterLoad()
    {
        parent::_afterLoad();
        foreach ($this->getItems() as $item) {
            $this->getResource()->unserializeFields($item);
            $item->setDataChanges(false);
        }
        return $this;
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top