Magento loadByAttribute завершается с ошибкой на вопросительных знаках - PullRequest
0 голосов
/ 24 августа 2010

Попытка загрузить продукт по его имени («Что такое тесты?») Не удалась, даже если продукт существует.

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

Это работает для любого другого имени.

Когда Magento в конечном итоге проходит через PDO, будет ли "?" в названии будет интерпретироваться как параметр, и, поскольку я не передаю ему никакого значения, конечный запрос фактически будет искать «Что такое тесты» ... поэтому не найдет продукт?

Если так, как мне избежать этого?

Ура!

1 Ответ

6 голосов
/ 24 августа 2010

Я не уверен, что избежать этого возможно. Когда вы добавляете фильтр атрибутов с помощью Magento (что вы делаете выше), он создает компонент where с помощью метода quoteInto Zend, а затем добавляет полученную строку в объект 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);

Затем, когда Zend Select преобразуется в строку, он выглядит как

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

Проблема в полном, а не в параметризации, где добавляется выбор. Это безопасно, поскольку _getAttributeConditionSql использует метод Zend quoteInto, но я уверен, что это означает, что вы застряли, если в предложении where есть необработанный "?" отметьте там (рад, что это не так) Возможно, это можно сделать, поигравшись непосредственно с выбором модели ресурса, но я не фанат делать это с Magento.

Независимо от всего этого, следующее должно позволить вам обойти это

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

Приведенный выше код создает коллекцию с предложением where, который использует подстановочный знак «_» вместо «?», А затем отбирает первый элемент сверху. Не идеально, но это должно быть достаточным обходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...