View source
<?php
namespace Drupal\library\Plugin\Field\FieldFormatter;
use Drupal\Component\Render\HtmlEscapedText;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Url;
use Drupal\library\Entity\LibraryAction;
use Drupal\library\Entity\LibraryItem;
use Drupal\library\LibraryItemInterface;
class LibraryItemFieldFormatter extends FormatterBase {
public function viewElements(FieldItemListInterface $items, $langcode) : array {
$elements = [
'#type' => 'table',
'#title' => $this
->t('Library items'),
'#header' => [
'Barcode',
'Library status',
'Notes',
'Actions',
],
];
$rows = [];
foreach ($items as $delta => $target) {
$item = \Drupal::entityTypeManager()
->getStorage('library_item')
->load($target
->getValue()['target_id']);
if ($item
->get('barcode')->value || $item
->get('in_circulation')->value) {
$rows[$delta]['barcode'] = nl2br(new HtmlEscapedText($item
->get('barcode')->value));
$rows[$delta]['library_status'] = $this
->checkAvailability($item
->get('in_circulation')->value, $item
->get('library_status')->value);
$rows[$delta]['notes'] = nl2br(new HtmlEscapedText($item
->get('notes')->value));
$actions = $this
->getActions($item
->get('in_circulation')->value, $item
->get('library_status')->value, $target
->getValue()['target_id']);
if ($actions) {
$actions = [
'#type' => 'operations',
'#links' => $actions,
];
$rows[$delta]['actions'] = \Drupal::service('renderer')
->render($actions);
}
else {
unset($elements['#header'][3]);
}
}
}
$elements['#rows'] = $rows;
return $elements;
}
protected function checkAvailability($in_circulation, $status) : TranslatableMarkup {
if ($in_circulation == LibraryItemInterface::REFERENCE_ONLY) {
return $this
->t('Reference only');
}
if ($status == LibraryItemInterface::ITEM_AVAILABLE) {
return $this
->t('Item available');
}
return $this
->t('Item unavailable');
}
protected function getActions($in_circulation, $status, $item) : array {
$actions = [];
if ($in_circulation == LibraryItemInterface::IN_CIRCULATION) {
if ($status == LibraryItemInterface::ITEM_AVAILABLE) {
$availableActions = \Drupal::entityQuery('library_action')
->condition('action', LibraryAction::CHANGE_TO_UNAVAILABLE)
->execute();
$actions = $this
->renderAction($availableActions, $item);
}
else {
$query = \Drupal::entityQuery('library_action');
$group = $query
->orConditionGroup()
->condition('action', LibraryAction::CHANGE_TO_AVAILABLE)
->condition('action', LibraryAction::NO_CHANGE);
$availableActions = $query
->condition($group)
->execute();
$actions = $this
->renderAction($availableActions, $item);
$actions['edit'] = $this
->renderEditAction($item);
}
}
return $actions;
}
private function renderAction(array $actions, $item) : array {
$output = [];
foreach ($actions as $action) {
$actionEntity = LibraryAction::load($action);
if ($actionEntity) {
$output[$actionEntity
->id()] = [
'title' => $actionEntity
->label(),
'url' => Url::fromRoute('library.single_transaction', [
'action' => $actionEntity
->id(),
'item' => $item,
]),
];
}
}
return $output;
}
private function renderEditAction($item) : array {
$output = [];
$itemEntity = LibraryItem::load($item);
if ($itemEntity) {
$transaction = $itemEntity
->getLatestTransaction();
if (!empty($transaction)) {
$output = [
'title' => 'Edit note',
'url' => Url::fromRoute('library.edit_transaction', [
'transaction' => array_shift($transaction),
]),
];
}
}
return $output;
}
}