Получение catalogCategoryTree через Soap API завершается ошибкой с пользовательским атрибутом


Для экземпляра Magento 1.7.0.2 я пытаюсь интегрировать пользовательский атрибут legacy_id в список категорий. Это будет использоваться для сопоставления категорий из серверной системы с категориями Magento.

При этом вставка новой категории или обновление существующей отлично работает с использованием API (catalog_category.create/update). Извлечение одной категории также отлично работает, так как свойство legacy_id отлично работает на всех CRUD операции.

Однако, что не работает, так это получение дерева категорий через SOAP v2 с помощью такого вызова:

result = $proxy->catalogCategoryTree($session, 'category_root_id');

Это приведет к следующему исключению:

SOAP-ERROR: Encoding: object has no 'legacy_id' property in /var/www/vhosts/MAGENTO/docs/includes/src/Zend_Soap_Server.php on line 832

Вопрос в том, что может быть причиной этого, например, catalog_category работает, а category_tree - нет?

Или, возможно, у кого-то есть несколько советов о том, как я могу создавать более описательные сообщения об ошибках для отладки?

Author: Moriarty, 2013-07-26

1 answers

Метод tree возвращает объекты типа catalogCategoryTree, которые выглядят следующим образом:

<complexType name="catalogCategoryTree">
    <all>
        <element name="category_id" type="xsd:int"/>
        <element name="parent_id" type="xsd:int"/>
        <element name="name" type="xsd:string"/>
        <element name="position" type="xsd:int"/>
        <element name="level" type="xsd:int"/>
        <element name="children" type="typens:ArrayOfCatalogCategoryEntities"/>
    </all>
</complexType>

Это поле не содержит legacy_id. Вы можете расширить api и добавить его. Вот несколько указаний на то, кому следует расширить wsdl.

Также взгляните на метод tree в API категории, особенно на последние строки:

$collection = Mage::getModel('catalog/category')->getCollection()
            ->setStoreId($this->_getStoreId($store))
            ->addAttributeToSelect('name')
            ->addAttributeToSelect('is_active');

$tree->addCollectionData($collection, true);
return $this->_nodeToArray($root);

Ваш атрибут не добавлен в коллекцию. Таким образом, вы можете переопределить этот метод, чтобы добавить его.
Также возвращаемое значение обрабатывается метод _nodeToArray(), который выглядит следующим образом:

protected function _nodeToArray(Varien_Data_Tree_Node $node)
{
    // Only basic category data
    $result = array();
    $result['category_id'] = $node->getId();
    $result['parent_id']   = $node->getParentId();
    $result['name']        = $node->getName();
    $result['is_active']   = $node->getIsActive();
    $result['position']    = $node->getPosition();
    $result['level']       = $node->getLevel();
    $result['children']    = array();

    foreach ($node->getChildren() as $child) {
        $result['children'][] = $this->_nodeToArray($child);
    }

    return $result;
}

Возможно, вам также потребуется переопределить это, чтобы включить значение вашего атрибута в массив результатов.

 2
Author: Marius, 2017-04-13 12:54:55