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