You are here

class ReadmoreFormatter in Readmore 8

Same name and namespace in other branches
  1. 2.x src/Plugin/Field/FieldFormatter/ReadmoreFormatter.php \Drupal\readmore\Plugin\Field\FieldFormatter\ReadmoreFormatter

Plugin implementation of the 'readmore' formatter.

Plugin annotation


@FieldFormatter(
  id = "readmore",
  label = @Translation("Readmore"),
  field_types = {
    "text",
    "text_long",
    "text_with_summary"
  }
)

Hierarchy

Expanded class hierarchy of ReadmoreFormatter

File

src/Plugin/Field/FieldFormatter/ReadmoreFormatter.php, line 32
Contains \Drupal\readmore\Plugin\field\FieldFormatter\ReadmoreFormatter.

Namespace

Drupal\readmore\Plugin\Field\FieldFormatter
View source
class ReadmoreFormatter extends FormatterBase {

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return array(
      'trim_length' => '500',
      'trim_on_break' => TRUE,
      'show_readmore' => TRUE,
      'show_readless' => FALSE,
      'ellipsis' => TRUE,
      'wordsafe' => FALSE,
    ) + parent::defaultSettings();
  }

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state) {
    $elements = parent::settingsForm($form, $form_state);
    $elements['trim_length'] = [
      '#type' => 'number',
      '#title' => $this
        ->t('Trim link text length'),
      '#field_suffix' => $this
        ->t('characters'),
      '#default_value' => $this
        ->getSetting('trim_length'),
      '#min' => 1,
      '#description' => $this
        ->t('Leave blank to allow unlimited link text lengths.'),
    ];
    $elements['trim_on_break'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Trim on @break', [
        '@break' => '<!--break-->',
      ]),
      '#description' => $this
        ->t('If @break not found in the text then trim length used.', [
        '@break' => '<!--break-->',
      ]),
      '#default_value' => $this
        ->getSetting('trim_on_break'),
    ];
    $elements['show_readmore'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Show read more'),
      '#default_value' => $this
        ->getSetting('show_readmore'),
    ];
    $elements['show_readless'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Show read less'),
      '#default_value' => $this
        ->getSetting('show_readless'),
    ];
    $elements['ellipsis'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Add ellipsis'),
      '#default_value' => $this
        ->getSetting('ellipsis'),
    ];
    $elements['wordsafe'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Truncate on a word boundary'),
      '#default_value' => $this
        ->getSetting('wordsafe'),
    ];
    return $elements;
  }

  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $summary = [];
    $settings = $this
      ->getSettings();
    if (!empty($settings['trim_on_break'])) {
      $summary[] = $this
        ->t('Trim on @break', [
        '@break' => '<!--break-->',
      ]);
    }
    elseif (!empty($settings['trim_length'])) {
      $summary[] = $this
        ->t('Text trimmed to @limit characters', [
        '@limit' => $settings['trim_length'],
      ]);
    }
    if (!empty($settings['show_readmore'])) {
      $summary[] = $this
        ->t('With read more link');
    }
    else {
      $summary[] = $this
        ->t('Without read more link');
    }
    if (!empty($settings['show_readless'])) {
      $summary[] = $this
        ->t('With read less link');
    }
    else {
      $summary[] = $this
        ->t('Without read less link');
    }
    if (!empty($settings['ellipsis'])) {
      $summary[] = $this
        ->t('With ellipsis');
    }
    else {
      $summary[] = $this
        ->t('Without ellipsis');
    }
    if (!empty($settings['wordsafe'])) {
      $summary[] = $this
        ->t('Truncate on a word boundary');
    }
    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [];
    $settings = $this
      ->getSettings();
    $current_path = \Drupal::service('path.current')
      ->getPath();
    $url_object = \Drupal::service('path.validator')
      ->getUrlIfValid($current_path);
    $route_name = $url_object
      ->getRouteName();
    $route_parameters = $url_object
      ->getRouteParameters();
    $current_url = Url::fromRoute($route_name, $route_parameters, [
      'absolute' => TRUE,
    ]);
    $read_less = $this
      ->t('Read less');
    $read_more = $this
      ->t('Read more');

    // Prepare readless link.
    $link_less = Link::fromTextAndUrl($read_less, $current_url);
    $link_less = $link_less
      ->toRenderable();
    $link_less['#attributes']['class'][] = 'readless-link';

    // Prepare readmore link.
    $link_more = Link::fromTextAndUrl($read_more, $current_url);
    $link_more = $link_more
      ->toRenderable();
    $link_more['#attributes']['class'][] = 'readmore-link';
    foreach ($items as $delta => $item) {
      $text = $item->value;
      $text_length = Unicode::strlen($text);
      $trim_length = $settings['trim_length'];

      // Don't do anything if text length less than defined.
      if ($text_length > $trim_length) {

        // Add Read less if need.
        if ($settings['show_readless']) {
          $text .= ' ' . render($link_less);
        }

        // Get trimmed string.
        $summary = readmore_truncate_string($text, isset($item->format) ? $item->format : NULL, $trim_length, $settings['wordsafe'], $settings['trim_on_break']);

        // Add readmore link.
        $summary .= '<span>';
        $summary .= $settings['ellipsis'] ? $this
          ->t('...') : NULL;
        if ($settings['show_readmore']) {
          $summary .= render($link_more);
        }
        $summary .= '</span>';

        // Close all HTML tags.
        $summary = Html::normalize($summary);
        $elements[$delta] = [
          '#theme' => 'readmore',
          '#summary' => Markup::create($summary),
          '#text' => Markup::create($text),
        ];
      }
      else {
        $elements[$delta] = [
          '#markup' => $text,
        ];
      }
    }
    $elements['#attached']['library'][] = 'readmore/readmore';
    return $elements;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FormatterBase::$fieldDefinition protected property The field definition.
FormatterBase::$label protected property The label display setting.
FormatterBase::$settings protected property The formatter settings. Overrides PluginSettingsBase::$settings
FormatterBase::$viewMode protected property The view mode.
FormatterBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create 11
FormatterBase::getFieldSetting protected function Returns the value of a field setting.
FormatterBase::getFieldSettings protected function Returns the array of field settings.
FormatterBase::isApplicable public static function Returns if the formatter can be used for the provided field. Overrides FormatterInterface::isApplicable 14
FormatterBase::prepareView public function Allows formatters to load information for field values being displayed. Overrides FormatterInterface::prepareView 2
FormatterBase::view public function Builds a renderable array for a fully themed field. Overrides FormatterInterface::view 1
FormatterBase::__construct public function Constructs a FormatterBase object. Overrides PluginBase::__construct 11
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginSettingsBase::$defaultSettingsMerged protected property Whether default settings have been merged into the current $settings.
PluginSettingsBase::$thirdPartySettings protected property The plugin settings injected by third party modules.
PluginSettingsBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies 6
PluginSettingsBase::getSetting public function Returns the value of a setting, or its default value if absent. Overrides PluginSettingsInterface::getSetting
PluginSettingsBase::getSettings public function Returns the array of settings, including defaults for missing settings. Overrides PluginSettingsInterface::getSettings
PluginSettingsBase::getThirdPartyProviders public function Gets the list of third parties that store information. Overrides ThirdPartySettingsInterface::getThirdPartyProviders
PluginSettingsBase::getThirdPartySetting public function Gets the value of a third-party setting. Overrides ThirdPartySettingsInterface::getThirdPartySetting
PluginSettingsBase::getThirdPartySettings public function Gets all third-party settings of a given module. Overrides ThirdPartySettingsInterface::getThirdPartySettings
PluginSettingsBase::mergeDefaults protected function Merges default settings values into $settings.
PluginSettingsBase::onDependencyRemoval public function Informs the plugin that some configuration it depends on will be deleted. Overrides PluginSettingsInterface::onDependencyRemoval 3
PluginSettingsBase::setSetting public function Sets the value of a setting for the plugin. Overrides PluginSettingsInterface::setSetting
PluginSettingsBase::setSettings public function Sets the settings for the plugin. Overrides PluginSettingsInterface::setSettings
PluginSettingsBase::setThirdPartySetting public function Sets the value of a third-party setting. Overrides ThirdPartySettingsInterface::setThirdPartySetting
PluginSettingsBase::unsetThirdPartySetting public function Unsets a third-party setting. Overrides ThirdPartySettingsInterface::unsetThirdPartySetting
ReadmoreFormatter::defaultSettings public static function Defines the default settings for this plugin. Overrides PluginSettingsBase::defaultSettings
ReadmoreFormatter::settingsForm public function Returns a form to configure settings for the formatter. Overrides FormatterBase::settingsForm
ReadmoreFormatter::settingsSummary public function Returns a short summary for the current formatter settings. Overrides FormatterBase::settingsSummary
ReadmoreFormatter::viewElements public function Builds a renderable array for a field value. Overrides FormatterInterface::viewElements
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.