Comment faire pour supprimer tous les éléments dans un magento produit collection?
Semble ne fonctionne pas:
<?php
$collection = Mage::getModel('catalog/product')->getCollection();
foreach($collection->getItems() as $key => $_product){
//product
$collection->removeItemByKey($key);
}
?>
$collection est toujours remplie
Supprimer est trop vague, une action. Qu'essayez-vous faire ici? Supprimer des éléments d'une collection, donc ils ne sont pas là à la prochaine itération, ou de les supprimer si ils sont partis du système?
juste supprimer de la collection, rien de plus.
Ce qui vous fait penser que ça ne fonctionne pas?
l'ajout d'après
juste supprimer de la collection, rien de plus.
Ce qui vous fait penser que ça ne fonctionne pas?
l'ajout d'après
<?php foreach($collection->getItems() as $key => $_product){ //product echo $_product->getName(); //returns "my product name" } ?>
OriginalL'auteur Antonino Bonumore | 2011-12-10
Vous devez vous connecter pour publier un commentaire.
Il y a
clear()
méthode dansVarien_Data_Collection
classe qui efface la collection.Je ne suis pas sûr si la méthode existe dans le temps, la question a été posée, mais il existe dans Magento 1.7
OriginalL'auteur Anatoly A. Kazantsev
Si vous souhaitez travailler avec un vide de la collection, la meilleure approche serait de le charger avec un filtre qui aurait toujours de produire un ensemble vide. Voici un exemple:
Parce que Magento id de produit commence à 1, cette collection resterait vide, jusqu'à ce que vous ajoutez des éléments avec la méthode addItem ().
clear() et removeItemByKey(), d'autre part, de ne déclencher une deuxième run de la base de données de réextraire les données que vous ne voulez pas que là.
removeItemByKey()
ne déclenchent pas la deuxième extraction de données à partir de la DB. Il a simplement unsets interne tableau de données par clé.clear()
ne déclenchent pas la deuxième extraction sur lui-même, mais il définit chargement de l'état de la collection de faux, de sorte que toute méthode de collecte de classe qui appelle la "charge" de la méthode sera le déclencheur d'extraction.donc, si je fais ceci:
$coll=$this->getLoadedProductCollection(); $coll->clear->addAttributeToFilter('my_attr',array('like'=>'55'))->load();
fera qu'ajouter un attribut à la filtre pour ma collection? Ou sera-ce ajoutés attribut être ignoré, car il n'a pas été utilisé lors de la collecte a été chargé pour la première fois?OriginalL'auteur Shay Acrich
Vous question n'a pas de sens. Exécutant le code suivant
résultats que dans le mot "terminé" en cours de sortie (Magento 1.6.1).
Ma deviner quelque chose à propos de votre installation de Magento est de faire l'appel à $c->getItems(); déclencher un rechargement de la collection. Donc, vous devez supprimer tous les éléments, mais alors quand vous appelez votre deuxième
getItems
, la collection est refetched.getItems
déclencher l'extraction? Il appelleload
, puisload
vérifie si la collection est chargé par l'appel deisLoaded
. MaisremoveItemByKey
ne réinitialise pas le drapeau. Ou dois-je m'ennuie de qch?OriginalL'auteur Alan Storm
devrait faire le travail.
OriginalL'auteur Sveta Oksen
Il y a aussi une possibilité de supprimer tous les éléments sans "faux chargement" (par opposition à Shay Acrich réponse):
Réglage
_totalRecords
à0
est nécessaire afin de ne pas laissergetSize()
méthode pour recharger la collection.Néanmoins, on doit étendre ou modifier une collection de code, parce que à la fois le domaine
_totalRecords
et la méthode_setIsLoaded()
sont protégés.Il convient de noter, que si un particulier de la collection ignore les drapeaux comme
_totalRecords
et_isCollectionLoaded
la solution ci-dessus peuvent ne pas fonctionner comme prévu.OriginalL'auteur jacek.ciach