apigee_api_catalog-8.x-2.4/modules/apigee_asyncapi_doc/src/Plugin/Field/FieldFormatter/AsyncapiFormatter.php
modules/apigee_asyncapi_doc/src/Plugin/Field/FieldFormatter/AsyncapiFormatter.php
<?php
/**
* @file
* Copyright 2022 Google Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
namespace Drupal\apigee_asyncapi_doc\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
/**
* Plugin implementation of the 'AsyncAPI' formatter.
*
* @FieldFormatter(
* id = "apigee_asyncapi_doc_async",
* label = @Translation("AsyncAPI"),
* field_types = {
* "file_link"
* }
* )
*/
class AsyncapiFormatter extends FormatterBase {
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$element = [];
foreach ($items as $delta => $item) {
$element[$delta] = [
'#theme' => 'apigee_asyncapi_doc_file_link_field_item',
'#field_name' => $this->fieldDefinition->getName(),
'#delta' => $delta,
'#link' => $item->getUrl()->toString(),
];
}
return $element;
}
/**
* {@inheritdoc}
*/
public function view(FieldItemListInterface $items, $langcode = NULL) {
$element = parent::view($items, $langcode);
$async_urls = [];
foreach ($items as $delta => $item) {
/** @var \Drupal\link\Plugin\Field\FieldType\LinkItem $item */
// Not validating URLs or paths.
$async_urls[] = $item->getUrl()->toString();
}
return $this->attachLibraries($element, $async_urls);
}
/**
* Helper function to attach library definitions and pass JavaScript settings.
*
* @param array $element
* A renderable array of the field element.
* @param array $async_urls
* An array of async Urls.
*
* @return array
* A renderable array of the field element with attached libraries.
*/
private function attachLibraries(array $element, array $async_urls) {
if (!empty($async_urls)) {
$element['#attached'] = [
'library' => [
'apigee_asyncapi_doc/reactjs',
'apigee_asyncapi_doc/asyncapi',
],
];
}
return $element;
}
}
