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,
      ],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc