get('serializer'), $container->getParameter('serializer.formats'), $container->getParameter('serializer.format_providers') ); } /** * Constructs a Plugin object. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, SerializerInterface $serializer, array $serializer_formats, array $serializer_format_providers) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->definition = $plugin_definition + $configuration; $this->serializer = $serializer; $this->formats = $serializer_formats; $this->formatProviders = $serializer_format_providers; } /** * {@inheritdoc} */ protected function defineOptions() { $options = parent::defineOptions(); $options['formats'] = ['default' => []]; return $options; } /** * {@inheritdoc} */ public function buildOptionsForm(&$form, FormStateInterface $form_state) { parent::buildOptionsForm($form, $form_state); $form['formats'] = [ '#type' => 'checkboxes', '#title' => $this->t('Accepted request formats'), '#description' => $this->t('Request formats that will be allowed in responses. If none are selected all formats will be allowed.'), '#options' => $this->getFormatOptions(), '#default_value' => $this->options['formats'], ]; } /** * {@inheritdoc} */ public function submitOptionsForm(&$form, FormStateInterface $form_state) { parent::submitOptionsForm($form, $form_state); $formats = $form_state->getValue(['style_options', 'formats']); $form_state->setValue(['style_options', 'formats'], array_filter($formats)); } /** * {@inheritdoc} */ public function render() { $rows = []; // If the Data Entity row plugin is used, this will be an array of entities // which will pass through Serializer to one of the registered Normalizers, // which will transform it to arrays/scalars. If the Data field row plugin // is used, $rows will not contain objects and will pass directly to the // Encoder. foreach ($this->view->result as $row_index => $row) { $this->view->row_index = $row_index; $rows[] = $this->view->rowPlugin->render($row); } unset($this->view->row_index); // Get the content type configured in the display or fallback to the // default. 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($rows, $content_type, ['views_style_plugin' => $this]); } /** * Gets a list of all available formats that can be requested. * * This will return the configured formats, or all formats if none have been * selected. * * @return array * An array of formats. */ public function getFormats() { return $this->options['formats']; } /** * {@inheritdoc} */ public function getCacheMaxAge() { return Cache::PERMANENT; } /** * {@inheritdoc} */ public function getCacheContexts() { return ['request_format']; } /** * {@inheritdoc} */ public function getCacheTags() { return []; } /** * {@inheritdoc} */ public function calculateDependencies() { $dependencies = parent::calculateDependencies(); $formats = $this->getFormats(); $providers = array_intersect_key($this->formatProviders, array_flip($formats)); // The plugin always uses services from the serialization module. $providers[] = 'serialization'; $dependencies += ['module' => []]; $dependencies['module'] = array_merge($dependencies['module'], $providers); return $dependencies; } /** * Returns an array of format options * * @return string[] * An array of format options. Both key and value are the same. */ protected function getFormatOptions() { $formats = array_keys($this->formatProviders); return array_combine($formats, $formats); } }