如何将根名称和子名称添加到 drupal 视图 REST?
How to add a root name and child name to drupal view REST?
我有疑问,我用 View 创建了一个 REST,我的格式类似于 JSON,但输出是这样的:
[{"item1":"123","item2":"123","item3":"123","item4":"","item5":"123","item5":"123"}, {"item1":"345","item2":"345","item3":"345","item4":"","item5":"345","item5":"345"}]
我需要这样的东西:
{"elements":
[
{"element":
{"item1":"123","item2":"123","item3":"123","item4":"123","item5":"123"}
},
{"element": {"item1":"345","item2":"345","item3":"345","item4":"345","item5":"345"}
}
]
}
如何添加根名称和子名称?
我可以对视图进行一些配置吗?
我试过像这样使用 views_post_execute 挂钩:
function mymodule_views_post_execute(ViewExecutable $view) {
if (isset($view) && ($view->storage->id() == 'myrestjson')) {
$result = ['elements' => array_map(
function ($subarray) {
return ['element' => $subarray];
},$view->result
)];
$view->result = $result;
}
}
但我收到此错误:
TypeError: Argument 1 passed to Drupal\views\Plugin\views\field\FieldPluginBase::advancedRender() must be an instance of Drupal\views\ResultRow,array given, called in mysite\core\modules\rest\src\Plugin\views\row\DataFieldRow.php on line 147 in Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender() (line 1142 of core\modules\views\src\Plugin\views\field\FieldPluginBase.php).
你能帮帮我吗?
问候
马里奥
您可以使用自定义 Serializer
来改变输出:
- 在您的自定义模块中创建一个新的自定义序列化程序 class,路径为:
.../your_module/src/Plugin/views/style/CustomSerializer.php
.
- 自定义序列化程序 class 应该从核心扩展
Serializer
class: Drupal\rest\Plugin\views\style\Serializer.php
- 重写
render()
方法(可以和核心Serializer
class对比看我修改了什么)
<?php
namespace Drupal\your_module\Plugin\views\style;
use Drupal\rest\Plugin\views\style\Serializer;
/**
* The style plugin for serialized output formats.
*
* @ingroup views_style_plugins
*
* @ViewsStyle(
* id = "custom_serializer",
* title = @Translation("Custom serializer"),
* help = @Translation("Serializes views row data using the Serializer
* component."), display_types = {"data"}
* )
*/
class CustomSerializer extends Serializer {
/**
* {@inheritdoc}
*/
public function render() {
$rows = [];
foreach ($this->view->result as $row_index => $row) {
$this->view->row_index = $row_index;
$rows[] = ['element' => $this->view->rowPlugin->render($row)];
}
unset($this->view->row_index);
if ((empty($this->view->live_preview))) {
$content_type = $this->displayHandler->getContentType();
}
else {
$content_type = !empty($this->options['formats']) ? reset($this->options['formats']) : 'json';
}
return $this->serializer->serialize(['elements' => $rows], $content_type, ['views_style_plugin' => $this]);
}
}
- 转到您的视图 >
REST Export
> FORMAT
> Format
> Select 新创建的序列化程序
- 结果:
我有疑问,我用 View 创建了一个 REST,我的格式类似于 JSON,但输出是这样的:
[{"item1":"123","item2":"123","item3":"123","item4":"","item5":"123","item5":"123"}, {"item1":"345","item2":"345","item3":"345","item4":"","item5":"345","item5":"345"}]
我需要这样的东西:
{"elements":
[
{"element":
{"item1":"123","item2":"123","item3":"123","item4":"123","item5":"123"}
},
{"element": {"item1":"345","item2":"345","item3":"345","item4":"345","item5":"345"}
}
]
}
如何添加根名称和子名称? 我可以对视图进行一些配置吗?
我试过像这样使用 views_post_execute 挂钩:
function mymodule_views_post_execute(ViewExecutable $view) {
if (isset($view) && ($view->storage->id() == 'myrestjson')) {
$result = ['elements' => array_map(
function ($subarray) {
return ['element' => $subarray];
},$view->result
)];
$view->result = $result;
}
}
但我收到此错误:
TypeError: Argument 1 passed to Drupal\views\Plugin\views\field\FieldPluginBase::advancedRender() must be an instance of Drupal\views\ResultRow,array given, called in mysite\core\modules\rest\src\Plugin\views\row\DataFieldRow.php on line 147 in Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender() (line 1142 of core\modules\views\src\Plugin\views\field\FieldPluginBase.php).
你能帮帮我吗? 问候 马里奥
您可以使用自定义 Serializer
来改变输出:
- 在您的自定义模块中创建一个新的自定义序列化程序 class,路径为:
.../your_module/src/Plugin/views/style/CustomSerializer.php
. - 自定义序列化程序 class 应该从核心扩展
Serializer
class:Drupal\rest\Plugin\views\style\Serializer.php
- 重写
render()
方法(可以和核心Serializer
class对比看我修改了什么)
<?php
namespace Drupal\your_module\Plugin\views\style;
use Drupal\rest\Plugin\views\style\Serializer;
/**
* The style plugin for serialized output formats.
*
* @ingroup views_style_plugins
*
* @ViewsStyle(
* id = "custom_serializer",
* title = @Translation("Custom serializer"),
* help = @Translation("Serializes views row data using the Serializer
* component."), display_types = {"data"}
* )
*/
class CustomSerializer extends Serializer {
/**
* {@inheritdoc}
*/
public function render() {
$rows = [];
foreach ($this->view->result as $row_index => $row) {
$this->view->row_index = $row_index;
$rows[] = ['element' => $this->view->rowPlugin->render($row)];
}
unset($this->view->row_index);
if ((empty($this->view->live_preview))) {
$content_type = $this->displayHandler->getContentType();
}
else {
$content_type = !empty($this->options['formats']) ? reset($this->options['formats']) : 'json';
}
return $this->serializer->serialize(['elements' => $rows], $content_type, ['views_style_plugin' => $this]);
}
}
- 转到您的视图 >
REST Export
>FORMAT
>Format
> Select 新创建的序列化程序 - 结果: