more_fields-2.2.19/src/Plugin/Field/FieldFormatter/AccordionFieldFormatter.php
src/Plugin/Field/FieldFormatter/AccordionFieldFormatter.php
<?php
namespace Drupal\more_fields\Plugin\Field\FieldFormatter;
use Drupal\Component\Utility\Html;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Template\Attribute;
/**
* Plugin implementation of the 'more_fields_accordion_field' formatter.
*
* @FieldFormatter(
* id = "more_fields_accordion_field_formatter",
* label = @Translation("Accordion field formatter type"),
* field_types = {
* "more_fields_accordion_field"
* }
* )
*/
class AccordionFieldFormatter extends FormatterBase {
/**
*
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'layoutgenentitystyles_view' => 'more_fields/field-accordion',
'open_action' => 'fisrt',
'custom_class' => '',
'custom_class_item' => '',
'attribute_content' => 'h6 text-black-50',
'attribute_header' => '',
'use_as_accordion' => true
] + parent::defaultSettings();
}
/**
*
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
return [
// utilile pour mettre à jour le style
'layoutgenentitystyles_view' => [
'#type' => 'select',
'#title' => 'Selectionner le style',
'#options' => [
'' => 'Default template bootstrap5',
'more_fields/field-accordion' => 'fields-box',
'more_fields/clean-box-accordion' => 'clean-box-accordion'
],
'#default_value' => $this->getSetting('layoutgenentitystyles_view')
],
'use_as_accordion' => [
'#type' => 'checkbox',
'#title' => 'use_as_accordion',
'#default_value' => $this->getSetting('use_as_accordion')
],
'open_action' => [
'#type' => 'select',
"#title" => "Open accordion",
"#options" => [
'' => 'None',
'fisrt' => 'open first',
"all" => "all open"
],
'#default_value' => $this->getSetting('open_action')
],
'custom_class' => [
'#type' => 'textfield',
'#title' => "Class personaliser pour l'accorddion",
'#default_value' => $this->getSetting('custom_class'),
'#description' => "Add class 'accordion-flush' to clear border"
],
'custom_class_item' => [
'#type' => 'textfield',
'#title' => "Class personaliser pour chaque item d'accorddion",
'#default_value' => $this->getSetting('custom_class_item')
],
'attribute_header' => [
'#type' => 'textfield',
'#title' => 'attribute_header',
'#default_value' => $this->getSetting('attribute_header')
],
'attribute_content' => [
'#type' => 'textfield',
'#title' => 'attribute_content',
'#default_value' => $this->getSetting('attribute_content')
]
] + parent::settingsForm($form, $form_state);
}
/**
*
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = [];
// Implement settings summary.
return $summary;
}
/**
*
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$id = 'hbk-' . static::getName(8);
$attribute = new Attribute([
'class' => [
$this->getSetting('custom_class')
],
'id' => $id
]);
if ($this->getSetting('use_as_accordion'))
$attribute->addClass("accordion");
$attribute_box = new Attribute([
'class' => [
'accordion-item',
$this->getSetting('custom_class_item')
]
]);
if ($this->getSetting('layoutgenentitystyles_view') == 'more_fields/field-accordion') {
$attribute->addClass("fields-box");
$attribute_box->addClass('field-box');
} elseif ($this->getSetting('layoutgenentitystyles_view') == 'more_fields/clean-box-accordion') {
$attribute->addClass("clean-box-accordion");
}
$elements = [
'#theme' => 'more_fields_accordion_field_formatter',
'#items' => [],
'#attribute' => $attribute,
'#attribute_box' => $attribute_box
];
$open_action = $this->getSetting('open_action');
foreach ($items as $delta => $item) {
$attribute_header = new Attribute([
'class' => [
'accordion-header',
'd-flex'
],
'data-bs-toggle' => "collapse",
'data-bs-target' => "#" . $id . '-' . $delta,
]);
$attribute_title = new Attribute([
'class' => [
'field-title',
'font-weight-bold'
]
]);
if ($this->getSetting('use_as_accordion'))
$attribute_header->addClass('accordion-button');
if ($this->getSetting('layoutgenentitystyles_view') == 'more_fields/field-accordion') {
$attribute_header->addClass('btn btn-block p-0 border-0');
}
$attribute_header->addClass($this->getSetting('attribute_header'));
$attr_desc = new Attribute([
'class' => [
'collapse',
'accordion-collapse'
],
'data-bs-parent' => "#" . $id,
'id' => $id . '-' . $delta
]);
if (($open_action == 'fisrt' && $delta == 0) || ($open_action == 'all')) {
$attr_desc->addClass('show');
} else {
$attribute_header->addClass('collapsed');
}
$attr_desc->addClass($this->getSetting('attribute_content'));
$elements['#items'][$delta] = [
'icon' => $this->viewValue($item->icon),
'title' => $this->viewValue($item->title),
'description' => $this->viewValue($item->description),
'attribute_title' => $attribute_title,
'attribute_content' => $attr_desc,
'attribute_header' => $attribute_header
];
}
return $elements;
}
/**
* Generate the output appropriate for one field item.
*
* @param \Drupal\Core\Field\FieldItemInterface $item
* One field item.
*
* @return array The textual output generated as a render array.
*/
protected function viewValue($value) {
// The text value has no text format assigned to it, so the user input
// should equal the output, including newlines.
return [
'#type' => 'inline_template',
'#template' => '{{ value|raw }}',
'#context' => [
'value' => $value
]
];
}
/**
*
* @param
* $n
* @return string
*/
public static function getName($n) {
$characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
$lgt = strlen($characters);
$randomString = '';
for ($i = 0; $i < $n; $i++) {
$index = rand(0, $lgt - 1);
$randomString .= $characters[$index];
}
return $randomString;
}
}
