Magento API, заказы на возврат со значениями NULL - PullRequest
2 голосов
/ 13 февраля 2012

Использование magento api версии 1 и мыла.

Необходимо вернуть все заказы с кодом купона => NULL

Я пытаюсь позвонить:

$order_listAR = $proxy->call($sessionId, 'sales_order.list', array(array('coupon_code'=>array('null'=>'null'))));

Результат, который я хочу вернуть, таков:

array(237) {
    ["state"]=>
    string(8) "complete"
    ["status"]=>
    string(8) "complete"
    ["coupon_code"]=> NULL

Пока, похоже, это работает правильно, но я не уверен, является ли ('null' => 'null') правильным способом поиска значений NULL в массиве. Может кто-нибудь объяснить, почему это работает, и, или это правильный синтаксис? У меня нет права на ошибку.

1 Ответ

4 голосов
/ 14 февраля 2012

Да, вы используете правильный синтаксис для фильтрации по null.

array(
    'coupon_code' => array(
        'null' => 'this_value_doesnt_matter'
    ) 
)

Magento отображает * метод API sales_order.list до Mage_Sales_Model_Order_Api::items().

public function items($filters = null)
{
    :
    $collection = Mage::getModel("sales/order")->getCollection()
    :
    if (is_array($filters)) {
        try {
            foreach ($filters as $field => $value) {
                if (isset($this->_attributesMap['order'][$field])) {
                    $field = $this->_attributesMap['order'][$field];
                }

                $collection->addFieldToFilter($field, $value);
            }
        } catch (Mage_Core_Exception $e) {
            $this->_fault('filters_invalid', $e->getMessage());
        }
    }
    :
}

Метод items() использует Mage_Sales_Model_Resource_Order_Collection для извлечения заказов для вызова API. Эта коллекция основана на Varien_Data_Collection_Db, поэтому

  • $collection->addFieldToFilter($field, $value)

сверху по сути звонит

  • Varien_Data_Collection_Db::addFieldToFilter()

Если вы последуете последнему, вы в конце наберете Varien_Db_Adapter_Pdo_Mysql::prepareSqlCondition(), а параметры будут

  • $fieldName = 'coupon_code'
  • $condition = array('null' => 'null')

Выдержка из этого метода:

public function prepareSqlCondition($fieldName, $condition)
{
    $conditionKeyMap = array(
        'eq'            => "{{fieldName}} = ?",
        :
        'notnull'       => "{{fieldName}} IS NOT NULL",
        'null'          => "{{fieldName}} IS NULL",
        : 
        'sneq'          => null
    );
    :

    $query = '';
    if (is_array($condition)) {
        :
        $key = key(array_intersect_key($condition, $conditionKeyMap));

        if (isset($condition['from']) || isset($condition['to'])) {
            :
        } elseif (array_key_exists($key, $conditionKeyMap)) {
            $value = $condition[$key];
            if (($key == 'seq') || ($key == 'sneq')) {
                :
            }
            $query = $this->_prepareQuotedSqlCondition($conditionKeyMap[$key], $value, $fieldName);
        } else {
            :
        }
    }
    :
}

В вашем случае _prepareQuotedSqlCondition() будет вызываться с

  • $text = '{{fieldName}} IS NULL'
  • $value = 'null'
  • $fieldName = 'coupon_code'

, что приведет к $query = 'coupon_code IS NULL'.

Если присмотреться к методу конвертации

protected function _prepareQuotedSqlCondition($text, $value, $fieldName)
{
    $sql = $this->quoteInto($text, $value);
    $sql = str_replace('{{fieldName}}', $fieldName, $sql);
    return $sql;
}

вы также увидите, почему значение пары 'null' => 'null' ключ / значение вообще не имеет значения. Это потому, что $text будет '{{fieldName}} IS NULL', т. Е. Не содержит привязки ?.

Следовательно, заменить _quoteInto() ^^

нечего

* см. app/code/core/Mage/Sales/etc/api.xml

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