2010-08-24 3 views
0

La tentative de chargement d'un produit par son nom ("What are Tests?") Échoue même si le produit existe.Magento loadByAttribute échoue sur les points d'interrogation

$product = Mage::getModel('catalog/product')->loadByAttribute('name', 'What are Tests?'); 

Cela fonctionne pour tout autre nom cependant.

Comme Magento passe finalement par PDO, le "?" dans le nom être interprété comme un paramètre et comme je ne lui transmets aucune valeur, la requête de fin serait en fait à la recherche de "What are Tests" ... donc ne pas trouver le produit?

Si oui, comment pourrais-je y échapper?

À la votre!

+1

Cela ressemble à un bug pour moi, je pense que vous devriez le signaler ... – greg0ire

Répondre

6

Je ne suis pas sûr que s'échapper est possible. Lorsque vous ajoutez un filtre d'attribut avec Magento (ce que vous faites ci-dessus), il crée le composant where en utilisant la méthode quoteInto de Zend, puis ajoute la chaîne résultante à un objet Zend Select.

//create a full where clause 
//In this case, $conditionSql = IF(_table_name.value_id>0, _table_name.value, _table_name_default.value) = 'What are Tests?' 
$conditionSql = $this->_getAttributeConditionSql($attribute, $condition, $joinType); 
... 
//add that where clause to a Zend select object 
$this->getSelect()->where($conditionSql); 

Ensuite, lorsque la sélection Zend est converti en une chaîne, il sort comme

IF(_table_name.value_id>0, _table_name.value, _table_name_default.value) = 'Product 7800''' 

Le problème est plein, pas paramaterized où est s'ajouter à la sélection. Son coffre-fort puisque _getAttributeConditionSql utilise la méthode quoteInto de Zend, mais je suis à peu près sûr que cela signifie que vous êtes coincé si votre clause where a un "?" Marquer là-dedans (heureux d'avoir tort sur ce point) Il est probablement possible de le faire en jouant directement avec le select du modèle de ressource, mais je ne suis pas fan de faire ça avec Magento.

Indépendamment de tout cela, ce qui suit devrait vous permettre de travailler autour de cette

$product = Mage::getModel('catalog/product') 
->getCollection() 
->addAttributeToSelect('*') 
->addFieldToFilter('name',array('like'=>'What are Tests_')) 
->getFirstItem(); 

Le code ci-dessus créer une collection avec une clause where qui utilise le caractère générique de caractère « _ » à la place d'un « ? ", puis arrache le premier article du haut. Pas idéal, mais cela devrait être un travail suffisant.

+1

Je suis vraiment vraiment déçu par le fait que ce n'est tout simplement pas possible sans modifications de base ... Je vais pleurer dans un coin et utilisez votre méthode à la place ... :-( –

Questions connexes