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


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

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

Существует несколько категорий и несколько сотен товаров.

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

Как бы то ни было, загрузка списков категорий занимает много времени. Причиной этого является каталог_продукта.список возвращает только основную информацию о например, идентификатор продукта и артикул. Поэтому нам нужно установить новое соединение для каждого продукта в нашем списке, чтобы получить другую необходимую нам информацию, например, название, цену, изображения большого пальца. Создание нового подключения 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)

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

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

Мы будем очень признательны за любую помощь.

Author: Derek Organ, 2011-10-17

3 answers

Перейдите к \app\code\core\Mage\Catalog\Model\Product\Api.php, найдите метод элементов и посмотрите на следующий фрагмент кода (строка 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>').

 3
Author: Dmytro Zavalkin, 2011-10-18 20:36:40

Изменять код в приложении/коде/ядре - плохая практика. Вам придется продлить его.

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

  • Создайте новый модуль в своем приложении/коде/локальном. Не забудьте добавить модуль в каталог вашего приложения/etc/modules.

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

    ns_catalog_model_product_api_v2переписать> каталог> модели> глобальный>

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

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 вашего модуля.

  • Найдите сущность: Сложный тип имя="каталогпРодуктиВность"

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

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

 1
Author: Guiguiboy, 2015-06-18 15:17:46

@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 сломается. Поэтому будьте особенно осторожны, чтобы не изменять код атрибута, который добавлен здесь.

 0
Author: wiser, 2012-03-16 09:26:51