Есть 2 node type: Primary и Secondary. У Primary есть поле entity reference к secondary. Оба типа материала добавляются с помощью rest api. Вопрос: как добавить эту связь ?
Поменял, но PHP не считает такую запись правильной: Parse error: syntax error, unexpected '{', expecting ']' in /home/ubuntu/workspace/import/importer.php on line 80
нужен json синтаксис, т.е. еще : вместо => (а все из-за того, что ты невнимательно посмотрел на мой первый ответ, а я тем более):
на выходе должно получится 'field_secondary':[{'target_id':3830}],
нене, меня вообще не слушай, не отошел еще после тяжелого дня)))
так то у тебя нормич запрос, json_encode сам все приведет в нужную форму, так что походу просто rest криво настроен. Как он у тебя вообще устроен, и чем шлешь запрос?
Этот вариант 'field_secondary':[{'target_id':3830}], тоже не правильный,
Parse error: syntax error, unexpected '{', expecting ']' in /home/ubuntu/workspace/import/importer.php on line 80. Где именно могут быть ошибки в REST ? Остальные поля пишутся нормально и нода создается (если без reference field). Запрос шлю так:
Этот вариант 'field_secondary':[{'target_id':3830}], тоже не правильный,
Говорю же, я был пьян. Формат у тебя нормальный - пхп-массив, обернутый функцией преобразования в json-формат. Так что в результате получится то, что надо.
Проблема в том, как шлешь, конечно. file_get_contents - где ты откопал этот способ?!) Закопай обратно. Понимаю, пайпы-шмайпы, файлы правят миром, но будь человеком, возьми нормальный инструмент. Зря что ли в 8-ку Guzzle вкручивали?
Вот пример (по необходимости расскоментируй куки и csrf)
file_get_contents я тупо списал, т.к. в рнр не особо шарю. Но оно работает, и все поля пишутся, и нода создается. Проблема только с entity reference, без нее все класс. Я подозревая что target_id - это неправильно, но как правильно нигде не нашел.
Комментарии
Вот такой вариант:
$serialized_entity = json_encode([
'title' => [['value' => $title]],
'field_infohash' => [['value' => $infohash]],
'field_size' => [['value' => $size[0]]],
'field_tp' => [['value' => $item]],
// 'field_secondary' => [['target_id' => 3830]],
'type' => [['target_id' => 'primary']],
'_links' => ['type' => [
'href' => 'http://dhtapi-albabosh.c9users.io/drupal/rest/type/node/primary'
]],
]);
- работает, а вот такой:
$serialized_entity = json_encode([
'title' => [['value' => $title]],
'field_infohash' => [['value' => $infohash]],
'field_size' => [['value' => $size[0]]],
'field_tp' => [['value' => $item]],
'field_secondary' => [['target_id' => 3830]],
'type' => [['target_id' => 'primary']],
'_links' => ['type' => [
'href' => 'http://dhtapi-albabosh.c9users.io/drupal/rest/type/node/primary'
]],
]);
- уже нет, при том что nid 3830 реально существует.
"Крайне лаконичные" логи RESTa ничего толкового не содержат, единственная информация:
Warning: file_get_contents(http://dhtapi-albabosh.c9users.io/drupal/entity/node): failed to open stream: HTTP request failed! HTTP/1.1 422 Unprocessable Entity
поменяй квадратные скобки на фигурные
'field_secondary' => [{'target_id' => 3830}],
Поменял, но PHP не считает такую запись правильной: Parse error: syntax error, unexpected '{', expecting ']' in /home/ubuntu/workspace/import/importer.php on line 80
Квадратные скобки предположительно правильные, т.к. другие поля пишутся верно.
нужен json синтаксис, т.е. еще : вместо => (а все из-за того, что ты невнимательно посмотрел на мой первый ответ, а я тем более):
на выходе должно получится
'field_secondary':[{'target_id':3830}],
нене, меня вообще не слушай, не отошел еще после тяжелого дня)))
так то у тебя нормич запрос, json_encode сам все приведет в нужную форму, так что походу просто rest криво настроен. Как он у тебя вообще устроен, и чем шлешь запрос?
Этот вариант 'field_secondary':[{'target_id':3830}], тоже не правильный,
Parse error: syntax error, unexpected '{', expecting ']' in /home/ubuntu/workspace/import/importer.php on line 80. Где именно могут быть ошибки в REST ? Остальные поля пишутся нормально и нода создается (если без reference field). Запрос шлю так:
$result = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/hal+json\r\n" .
"Authorization: Basic ".base64_encode("user:pass")."\r\n",
'content' => $serialized_entity
)
)));
Говорю же, я был пьян. Формат у тебя нормальный - пхп-массив, обернутый функцией преобразования в json-формат. Так что в результате получится то, что надо.
Проблема в том, как шлешь, конечно. file_get_contents - где ты откопал этот способ?!) Закопай обратно. Понимаю, пайпы-шмайпы, файлы правят миром, но будь человеком, возьми нормальный инструмент. Зря что ли в 8-ку Guzzle вкручивали?
Вот пример (по необходимости расскоментируй куки и csrf)
<?php require __DIR__ . '/vendor/autoload.php'; $base_url = "http://dhtapi-albabosh.c9users.io"; $auth = ['user', 'pass']; $serialized_entity = json_encode([
'title' => [['value' => $title]],
'field_infohash' => [['value' => $infohash]],
'field_size' => [['value' => $size[0]]],
'field_tp' => [['value' => $item]],
'field_secondary' => [['target_id' => 3830]],
'type' => [['target_id' => 'primary']],
'_links' => ['type' => [
'href' => 'http://dhtapi-albabosh.c9users.io/drupal/rest/type/node/primary'
]],
]); //$jar = new \GuzzleHttp\Cookie\CookieJar();
$client = new \GuzzleHttp\Client([
'base_uri' => $base_url
// ,'cookies' => $jar
]); //$response = $client->get('/rest/session/token');
//$csrf = $res->getBody()->getContents(); $response = $client
->post('/entity/node?_format=hal_json', [
'auth' => $auth,
'body' => $serialized_entity,
'headers' => [
'Content-Type' => 'application/hal+json'
// ,'X-CSRF-Token' => $csrf
],
]);?>
file_get_contents я тупо списал, т.к. в рнр не особо шарю. Но оно работает, и все поля пишутся, и нода создается. Проблема только с entity reference, без нее все класс. Я подозревая что target_id - это неправильно, но как правильно нигде не нашел.
Все получилось, все правильно, просто у меня secondary был не опубликован, поэтому связь не создавалась