elevenlabs_field-1.0.0-beta7/src/Plugin/Field/FieldFormatter/ElevenLabsGenerationDefaultFormatter.php
src/Plugin/Field/FieldFormatter/ElevenLabsGenerationDefaultFormatter.php
<?php
namespace Drupal\elevenlabs_field\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\file\Entity\File;
/**
* Plugin implementation of the 'elevenlabs_default' formatter.
*
* @FieldFormatter(
* id = "elevenlabs_default",
* label = @Translation("Elevenlabs"),
* field_types = {"elevenlabs"}
* )
*/
class ElevenLabsGenerationDefaultFormatter extends ElevenLabsFormatterBase {
/**
* The prefix to use for the global player.
*/
protected static string $elevenLabsIdPrefix = 'elevenlabs-id-';
/**
* The prefix to use for items.
*/
protected static string $elevenLabsItemIdPrefix = 'elevenlabs-audio-';
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'show_speaker_label' => FALSE,
'show_speaker_text' => FALSE,
'virtual_player_enabled' => TRUE,
'play_button_type' => 'hide',
'global_play_button_text' => 'Play',
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$settings = $this->getSettings();
$element['virtual_player_enabled'] = [
'#type' => 'checkbox',
'#title' => $this->t('Virtual Player Enabled'),
'#default_value' => $settings['virtual_player_enabled'],
];
$element['show_speaker_label'] = [
'#type' => 'checkbox',
'#title' => $this->t('Show Speaker Label'),
'#default_value' => $settings['show_speaker_label'],
];
$element['show_speaker_text'] = [
'#type' => 'checkbox',
'#title' => $this->t('Show Speaker Text'),
'#default_value' => $settings['show_speaker_text'],
];
$element['play_button_type'] = [
'#type' => 'select',
'#options' => [
'audio' => $this->t('Normal Audio Element'),
'hide' => $this->t('Hide'),
],
'#title' => $this->t('Item Audio Field'),
'#default_value' => $settings['play_button_type'],
];
return $element;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$settings = $this->getSettings();
$summary[] = $this->t("Virtual Player: @virtual_player_enabled<br>
Show Speaker Label: @show_speaker_label<br>
Show Speaker Text: @show_speaker_text<br>
Play Button Type: @play_button_type", [
'@virtual_player_enabled' => $settings['virtual_player_enabled'] ? 'true' : 'false',
'@show_speaker_label' => $settings['show_speaker_label'] ? 'true' : 'false',
'@show_speaker_text' => $settings['show_speaker_text'] ? 'true' : 'false',
'@play_button_type' => $settings['play_button_type'],
]);
return $summary;
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$id = self::$elevenLabsIdPrefix . str_replace('_', '-', $this->fieldDefinition->getName());
$renderedItems = [];
$drupalSettings = [
'currentTime' => 0,
'state' => 'loading',
'totalItems' => count($items),
];
foreach ($items as $item) {
// Render the items.
$renderedItem = $this->preprocessItem($item);
if ($renderedItem) {
$renderedItems[] = $renderedItem;
$drupalSettings['items'][] = $this->createDrupalSettings($item);
}
}
// Should not happen.
if (!count($renderedItems)) {
return [];
}
// Render the whole entity.
$elements['#attached'] = [
'library' => [
'elevenlabs_field/elevenlabs',
],
'drupalSettings' => [
'elevenlabs' => [
$id => $drupalSettings,
],
],
];
$elements['#theme'] = 'elevenlabs_field';
$elements['#speeches'] = $renderedItems;
$elements['#attributes'] = [
'class' => [
'elevenlabs-global-play',
],
'id' => [
$id,
],
'disabled' => 'disabled',
];
$elements['#global_play_button_text'] = $this->settings['global_play_button_text'];
$elements['#global_play_button_enabled'] = FALSE;
$elements['#virtual_player_enabled'] = $this->settings['virtual_player_enabled'];
return $elements;
}
/**
* Add to the setting for the virtual player.
*
* @param \Drupal\Core\Field\FieldItemInterface $item
* The field item interface.
*
* @return array
* A part of the settings array.
*/
private function createDrupalSettings(FieldItemInterface $item) {
return [
'id' => self::$elevenLabsItemIdPrefix . $item->history_item_id,
'timePadding' => $item->start_time,
];
}
/**
* Preprocess each item.
*
* @param \Drupal\Core\Field\FieldItemInterface $item
* The field item interface.
*
* @return array
* A render object.
*/
private function preprocessItem(FieldItemInterface $item) {
$speakers = $this->getSpeakers();
// Should not really happen.
if (!$item->target_id) {
return FALSE;
}
$file = File::load($item->target_id);
return [
'#theme' => 'elevenlabs_audio',
'#file_url' => $file ? \Drupal::service('file_url_generator')->generate($file->getFileUri())->toString() : 'not found',
'#text' => $item->text,
'#voice' => $speakers[$item->speaker] ?? $item->speaker,
'#classes' => '',
'#show_voice' => TRUE,
'#show_text' => TRUE,
'#play_button_type' => $this->settings['play_button_type'] ?? 'audio',
'#show_speaker_label' => $this->settings['show_speaker_label'] ?? FALSE,
'#show_speaker_text' => $this->settings['show_speaker_text'] ?? FALSE,
'#attributes' => [
'id' => self::$elevenLabsItemIdPrefix . $item->history_item_id,
],
];
}
}
