В итоге я переопределил app / code / core / Mage / Sales / Model / Order / Api.php , добавив поле «особой магии», называемое collection.limit. Ваш пробег может отличаться; У меня есть жесткий контроль над установкой Magento и программами (в данном случае набором программ на C #), обращающимися к установке Magento.
Мой вызывающий просто использует "магическое поле" в качестве пары ключ / значение, что-то вроде этого (пожалуйста, проверьте, опять же, я звонил из C #, поэтому этот php следует считать подозрительным):
$collectionLimitClause = array (
'key' => 'collection.limit',
'value' => array('key' => 'eq', 'value' => '10')
);
В моей установке Magento (эта часть тестируется, работает и работает), я создал Sales / Model / Order / Api.php в своем локальном пространстве имен и переопределил функцию items. Примерно в 32-й строке этой функции вы увидите следующее:
$apiHelper = Mage::helper('api');
$filters = $apiHelper->parseFilters($filters, $this->_attributesMap['order']);
try {
foreach ($filters as $field => $value) {
$orderCollection->addFieldToFilter($field, $value);
}
} catch (Mage_Core_Exception $e) {
$this->_fault('filters_invalid', $e->getMessage());
}
Вместо этого я «ловлю» свой собственный магический ограничитель с помощью strncmp здесь, с if-else внутри foreach:
$apiHelper = Mage::helper('api');
$filters = $apiHelper->parseFilters($filters, $this->_attributesMap['order']);
try {
foreach ($filters as $field => $value) {
if( !strncmp($field,"collection.limit",16) ) {
$orderCollection->getSelect()->limit($value['eq']);
}
else {
$orderCollection->addFieldToFilter($field, $value);
}
}
} catch (Mage_Core_Exception $e) {
$this->_fault('filters_invalid', $e->getMessage());
}
Я не слишком взволнован этим, но я думаю, что это довольно безопасно и работает.