Reload une collection

Les collections dans Magento permettent de construire facilement des requêtes grâce à des fonctions comme addAttributeToSelect() et addAttributeToFilter().

Il arrive parfois de récupérer une collection déjà lue ce qui signifie que les données qui correspondent à la requête ont été chargées.C’est le cas par exemple avec la fonction Mage_Catalog_Model_Category::getChildrenCategories() qui retourne une collection de catégorie lue.

En réalité cette fonction appelle implicitement Mage_Catalog_Model_Resource_Eav_Mysql4_Category::getChildrenCategories($category)

/**
     * Enter description here...
     *
     * @param Mage_Catalog_Model_Category $category
     * @return unknown
     */
    public function getChildrenCategories($category)
    {
        $collection = $category->getCollection();
        /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */
        $collection-->addAttributeToSelect('url_key')
            ->addAttributeToSelect('name')
            ->addAttributeToSelect('all_children')
            ->addAttributeToSelect('is_anchor')
            ->addAttributeToFilter('is_active', 1)
            ->addIdFilter($category->getChildren())
            ->setOrder('position', 'ASC')
            ->joinUrlRewrite()
            ->load(); //lecture de la collection
        return $collection;
    }

Dans l’exemple ci-dessous, on souhaite ajouté l’attribut « description » à la collection $categories (soit modifier sa requête sql). L’attribut sera bien ajouté à la requête grâce à la fonction addAttributeToSelect() mais les données correspondront à l’état de la requête avant lecture.

/* @var $categories Mage_Catalog_Model_Resource_Category_Collection */
$categories = $category->getChildrenCategories();//load implicite
$categories->addAttributeToSelect('description');

Pour charger les données de la nouvelle requête lors d’un load() implicite ou direct, il faut supprimer les données de la collection avec la fonction clear().

$categories = $category->getChildrenCategories();//load implicite
$categories->addAttributeToSelect('description');//ajout de l attribut a la requete
$categories->clear();//vide les donnees

L’air de rien cette petite astuce peut vous faire gagner du temps :).

Tweet about this on Twitter0Share on Facebook0Share on Google+0

Michael

Originally trained as a sound engineer, I reinvented myself in computer development. In 2010, I got my professional degree as a developer in computer science and I I've started studying Magento framework. I quickly developed my skills in that area at Brand Online Commerce web agency. Today, I work at Soon Agency on Magento ecommerce websites.

Vous aimerez également...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>