Автор Тема: Как установить свой ID объекта при использовании REST API  (Прочитано 197 раз)

17 Июль 2015, 23:19:48
  • Новичок
  • *
  • Сообщений: 1
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сегодня столкнулся с данной проблемой, гугл ответа не дал, пришлось решать самому.
Если при работе с Web Services возникает необходимость указать свой ID при создании объекта и просто передать узел ID в запросе, то преста ругнется и не создаст объект.
Как обойти:
В файле WebserviceRequest.php найти фрагмент:
      elseif ($this->method == 'POST' && count($ids) > 0)
{
$this->setError(400, 'id is forbidden when adding a new resource', 91);
return false;
}

foreach ($xmlEntities as $xmlEntity)
{
/** @var SimpleXMLElement $xmlEntity */
$attributes = $xmlEntity->children();

/** @var ObjectModel $object*/
if ($this->method == 'POST')
$object = new $this->resourceConfiguration['retrieveData']['className']();
elseif ($this->method == 'PUT')

и исправить вот так:

      //elseif ($this->method == 'POST' && count($ids) > 0)
//{
// $this->setError(400, 'id is forbidden when adding a new resource', 91);
// return false;
//}

foreach ($xmlEntities as $xmlEntity)
{
/** @var SimpleXMLElement $xmlEntity */
$attributes = $xmlEntity->children();

/** @var ObjectModel $object */
if ($this->method == 'POST'){
$object = new $this->resourceConfiguration['retrieveData']['className']();
if ((int)$attributes->id > 0) {
$object->id = (int)$attributes->id;
$object->force_id = true;
}
}elseif ($this->method == 'PUT')
Собственно, что мы сделали - во-первых задавили ошибку в случае если в запросе есть ID, во-вторых указали свежесозданному объекту его новый ID и поставили флаг, что нужно использовать именно его.

Замечания:
1) Так делать нехорошо, но если очень хочется то можно.
2) В начале данного файла висит дисклеймер, что его изменять нельзя. Насколько я понял, при обновлении он затрется, имейте это ввиду.
3) Проверялось на версии 1.6.1.0, в других версиях код может отличаться, но принцип останется такой же.
4) Если написал не в ту ветку, прошу модератора перенести.