Получение 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 - нет?
Или, возможно, у кого-то есть несколько советов о том, как я могу создавать более описательные сообщения об ошибках для отладки?
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;
}
Возможно, вам также потребуется переопределить это, чтобы включить значение вашего атрибута в массив результатов.