Je fais ce qui suit:
$productCollection = Mage::getModel('catalog/product')
->getCollection();
$productCollection
->addAttributeToFilter('my_attribute', 1);
my_attribute
n'est pas dans les tables plates, mais les tables plates sont activées.
Je reçois toujours la collection complète.
La raison semble être \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect
:
$columns = $this->getEntity()->getAttributeForSelect($attributeCode);
Non $this->getEntity()
est une instance Mage_Catalog_Model_Resource_Product_Flat
qui récupère les champs plats - et si aucun n'est trouvé, renvoie simplement null.
Qu'est-ce qu'un moyen propre d'ajouter un attribut non plat au filtre de collection?
Dans mon cas, cela n'a pas de sens, d'ajouter l'attribut à la table plate.
non-flat attribute
? Merci .et ne pas rendre magento déroutant. C'est déjà déroutantRéponses:
Vous pouvez rejoindre vous-même la table nécessaire.
Vous voudrez peut-être aussi rejoindre par store_id.
la source
Un hack (CE 1.6.2.0+) consiste à passer la condition sous forme de tableau et à croire que cela fonctionne ou non comme prévu:
la source
addFieldToFiler
est un wrapper pouraddAttributeToFilter
et cela a une option pour passer l'attribut comme un tableau:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
La raison pour laquelle la réponse de ColinM fonctionne est due au code dans
app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
laaddAttributeToFilter
méthode de. Si vous utilisez ce format de tableau, il n'appelle pasaddAttributeToSelect
. En mode plat,addAttributeToSelect
échoue silencieusement si l'attribut n'est pas dans la table plate.(ci-dessous est un nouveau hachage de ma réponse sur /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - je suis Je ne sais pas quelle est l'étiquette pour cela, mais sachez que j'aurais trouvé cela utile)
Je voulais une solution "propre" pour la sélection et le filtrage de collection en mode plat sur des attributs non plats, qui:
J'ai utilisé la collection de produits associée, mais cela s'applique à toute collection EAV.
Code défaillant:
En mode plat, le code ci-dessus ne parvient pas à sélectionner ou filtrer silencieusement l'attribut s'il ne se trouve pas dans la table plate.
Ajout à la sélection:
le
joinAttribute
méthode ajoute une jointure à la requête pour l'attribut spécifique demandé. Cela fonctionne toujours lorsque l'attribut est déjà dans la table plate, mais sera légèrement moins efficace que l'utilisation pure de la table plate.J'ai utilisé une
left
jointure là-bas, pour m'assurer qu'elle récupère les produits si ellemy_custom_attribute
n'est pas définie sur ces produits. Modifiez celainner
si vous n'êtes intéressé que par les lignes oùmy_custom_attribute
est défini.Ajout au filtre (selon ColinM ci-dessus):
Le code ci-dessus l'ajoutera à la sélection et obéira à votre filtre.
(testé dans CE 1.6.2.0)
la source
Dans le
Mage_Rss
module, ils ont utilisé la méthode a hacky pour désactiver les tables plates. Ils utilisent le fait que les tables plates sont toujours désactivées dans le magasin d'administration et émulent donc simplement le magasin d'administration.Après avoir démarré l'émulation, vous devez la réinitialiser avec
emulationModel->stopEnvironmentEmulation()
la source
lorsque vous créez l'attribut, il doit être au niveau global et filtrable. De cette façon, il sera utilisable dans la navigation en couches. Il faudra également que l'attribut soit une liste déroulante ou une sélection multiple. Je conseillerais personnellement de ne pas modifier les fichiers de base pour répondre à vos besoins dans ce cas
la source