Как расширить каталог Magento API catalog_product.list, чтобы включить больше информации о продукте XML-RPC

Хорошо, вот моя ситуация.

Мы используем Magento Store в качестве онлайн-каталога для iPad-приложения для магазина одежды.

Есть несколько категорий и несколько сотен продуктов.

Из всех стандартных вызовов API, доступных нам с использованием XML-RPC, нам удалось заставить работать наше прекрасное приложение для iPad.

Однако загрузка списков категорий занимает много времени. Причина этого в том, что catalog_product.list возвращает только основную информацию о продукте, например. id и артикул. Таким образом, мы должны установить новое соединение для каждого продукта в нашем списке, чтобы получить другую необходимую нам информацию. например Имя, цена, изображения для большого пальца. Создание нового соединения XML-RPC, скажем, для 100 продуктов занимает очень много времени. в настоящее время более 30 секунд. Естественно, после первой загрузки мы могли бы хранить эту информацию локально в iPad, но важно, чтобы первая загрузка была быстрой.

Пример возврата текущего метода: catelog_product.list

position = "";
    "product_id" = 805;
    set = 4;
    sku = 1901252;
    type = simple;
},
    {
    position = "";
    "product_id" = 807;
    set = 4;
    sku = 2143405;
    type = simple;
},

Вопрос 1)

Есть ли способ решить эту проблему с помощью существующего стандартного API Magento?

Вопрос 2)

Если нет, то где мне искать обновление метода catalog_product.list, чтобы он включал в себя дополнительную информацию, которая нам нужна.

Примечание. Я неплохо знаком с PHP, но не очень хорошо знаком с точной структурой Magento и его фреймворком.

Любая помощь будет принята с благодарностью.


person Derek Organ    schedule 17.10.2011    source источник


Ответы (3)


Перейдите к \app\code\core\Mage\Catalog\Model\Product\Api.php, найдите метод items и посмотрите на следующий фрагмент кода (строка 80 в моем CE 1.6)

        $result[] = array( // Basic product data
            'product_id' => $product->getId(),
            'sku'        => $product->getSku(),
            'name'       => $product->getName(),
            'set'        => $product->getAttributeSetId(),
            'type'       => $product->getTypeId(),
            'category_ids'       => $product->getCategoryIds()
        );

Добавьте сюда необходимые атрибуты или даже напишите $result[] = $product->getData();, чтобы получить все стандартные атрибуты. Если вам нужен какой-то пользовательский атрибут, посмотрите на код

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

выше (строка 58 в моем CE 1.6) и добавьте строку ->addAttributeToSelect('<your_attribute_code>').

person Dmytro Zavalkin    schedule 18.10.2011

Модифицировать код в файле app/code/core — плохая практика. Вам придется продлить его.

У меня была такая же проблема, и вот что я сделал, чтобы заставить его работать с API V2 в Magento CE 1.9.0.1:

  • Создайте новый модуль в файле app/code/local. Не забудьте добавить модуль в каталог app/etc/modules.

  • В config.xml добавьте следующие правила перезаписи (замените именами классов):

    ‹global› ‹models› ‹catalog› ‹rewrite› ‹product_api_v2›NS_Catalog_Model_Product_Api_V2‹/product_api_v2› ‹/rewrite› ‹/catalog› ‹/models› ‹/global›

Затем создайте класс:

class NS_Catalog_Model_Product_Api_V2 extends Mage_Catalog_Model_Product_Api_V2
{
    /**
     * Retrieve list of products with basic info (id, sku, type, set, name)
     *
     * @param null|object|array $filters
     * @param string|int $store
     * @return array
     */
    public function items($filters = null, $store = null)
    {
        $collection = Mage::getModel('catalog/product')->getCollection()
            ->addStoreFilter($this->_getStoreId($store))
            ->addAttributeToSelect('name')
            ->addAttributeToSelect('price')
            ->addAttributeToSelect('custom_attribute_1')
            ->addAttributeToSelect('custom_attribute_2') //and so on...
        ;

        /** @var $apiHelper Mage_Api_Helper_Data */
        $apiHelper = Mage::helper('api');
        $filters = $apiHelper->parseFilters($filters, $this->_filtersMap);
        try {
            foreach ($filters as $field => $value) {
                $collection->addFieldToFilter($field, $value);
            }
        } catch (Mage_Core_Exception $e) {
            $this->_fault('filters_invalid', $e->getMessage());
        }
        $result = array();
        foreach ($collection as $product) {
            /** @var Mage_Catalog_Model_Product $product */

            $result[] = array(
                'product_id'   => $product->getId(),
                'price'        => $product->getPrice(),
                'attr_1'       =>  $product->getData('custom_attribute_1'),
                'sku'          => $product->getSku(),
                'name'         => $product->getName(),
                'set'          => $product->getAttributeSetId(),
                'type'         => $product->getTypeId(),
                'category_ids' => $product->getCategoryIds(),
                'website_ids'  => $product->getWebsiteIds()
            );
        }
        return $result;
    }
}

Но этого недостаточно... вам придется перегрузить wsdl.xml и wsi.xml.

  • Скопируйте файлы из app/code/core/Mage/Catalog/etc/(wsdl|wsi).xml в каталог etc вашего модуля.

  • Найдите сущность: complexType name="catalogProductEntity"

  • Добавьте свои пользовательские атрибуты в список

  • очистить кеши (если вы используете PHP-клиент, имейте в виду, что PHP хранит копию WSDL по умолчанию в /tmp)

person Guiguiboy    schedule 18.06.2015

@Zyava указал файл для изменения, что очень полезно. Но я использовал другой способ изменить этот файл:

$result[] = array( // Basic product data
    'product_id' => $product->getId(),
    'sku'        => $product->getSku(),
    'name'       => $product->getName(),
    'set'        => $product->getAttributeSetId(),
    'type'       => $product->getTypeId(),
    'category_ids'       => $product->getCategoryIds(),
    '<your_attribute_code>' => $product->getData('<your_attribute_code>')
);

Просто добавьте строку для атрибута, который вы хотите получить. Это работало на моем CE 1.6.1. Но с этим есть небольшая проблема: если изменить код атрибута в админке Magento, код API сломается. Поэтому будьте особенно осторожны, чтобы не изменить добавленный здесь код атрибута.

person wiser    schedule 16.03.2012
comment
код атрибута будет выделен серым цветом после его создания, поэтому вы не сможете его случайно изменить;) - person Shathish; 17.02.2014