summaryrefslogtreecommitdiffstats
path: root/core/modules/link/lib/Drupal/link/Plugin/field/formatter/LinkFormatter.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/modules/link/lib/Drupal/link/Plugin/field/formatter/LinkFormatter.php')
-rw-r--r--core/modules/link/lib/Drupal/link/Plugin/field/formatter/LinkFormatter.php187
1 files changed, 187 insertions, 0 deletions
diff --git a/core/modules/link/lib/Drupal/link/Plugin/field/formatter/LinkFormatter.php b/core/modules/link/lib/Drupal/link/Plugin/field/formatter/LinkFormatter.php
new file mode 100644
index 0000000..b71f17e
--- /dev/null
+++ b/core/modules/link/lib/Drupal/link/Plugin/field/formatter/LinkFormatter.php
@@ -0,0 +1,187 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\link\Plugin\field\formatter\LinkFormatter.
+ */
+
+namespace Drupal\link\Plugin\field\formatter;
+
+use Drupal\Component\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\field\Plugin\Type\Formatter\FormatterBase;
+
+/**
+ * Plugin implementation of the 'link' formatter.
+ *
+ * @Plugin(
+ * id = "link",
+ * module = "link",
+ * label = @Translation("Link"),
+ * field_types = {
+ * "link"
+ * },
+ * settings = {
+ * "trim_length" = "80",
+ * "url_only" = "",
+ * "url_plain" = "",
+ * "rel" = "",
+ * "target" = ""
+ * }
+ * )
+ */
+class LinkFormatter extends FormatterBase {
+
+ /**
+ * {@inheritdoc}
+ */
+ public function settingsForm(array $form, array &$form_state) {
+ $elements = parent::settingsForm($form, $form_state);
+
+ $elements['trim_length'] = array(
+ '#type' => 'number',
+ '#title' => t('Trim link text length'),
+ '#field_suffix' => t('characters'),
+ '#default_value' => $this->getSetting('trim_length'),
+ '#min' => 1,
+ '#description' => t('Leave blank to allow unlimited link text lengths.'),
+ );
+ $elements['url_only'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('URL only'),
+ '#default_value' => $this->getSetting('url_only'),
+ '#access' => $this->getPluginId() == 'link',
+ );
+ $elements['url_plain'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Show URL as plain text'),
+ '#default_value' => $this->getSetting('url_plain'),
+ '#access' => $this->getPluginId() == 'link',
+ '#states' => array(
+ 'visible' => array(
+ ':input[name*="url_only"]' => array('checked' => TRUE),
+ ),
+ ),
+ );
+ $elements['rel'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Add rel="nofollow" to links'),
+ '#return_value' => 'nofollow',
+ '#default_value' => $this->getSetting('rel'),
+ );
+ $elements['target'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Open link in new window'),
+ '#return_value' => '_blank',
+ '#default_value' => $this->getSetting('target'),
+ );
+
+ return $elements;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function settingsSummary() {
+ $summary = array();
+
+ $settings = $this->getSettings();
+
+ if (!empty($settings['trim_length'])) {
+ $summary[] = t('Link text trimmed to @limit characters', array('@limit' => $settings['trim_length']));
+ }
+ else {
+ $summary[] = t('Link text not trimmed');
+ }
+ if ($this->getPluginId() == 'link' && !empty($settings['url_only'])) {
+ if (!empty($settings['url_plain'])) {
+ $summary[] = t('Show URL only as plain-text');
+ }
+ else {
+ $summary[] = t('Show URL only');
+ }
+ }
+ if (!empty($settings['rel'])) {
+ $summary[] = t('Add rel="@rel"', array('@rel' => $settings['rel']));
+ }
+ if (!empty($settings['target'])) {
+ $summary[] = t('Open link in new window');
+ }
+
+ return implode('<br />', $summary);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function prepareView(array $entities, $langcode, array &$items) {
+ $settings = $this->getSettings();
+
+ foreach ($entities as $id => $entity) {
+ foreach ($items[$id] as $delta => &$item) {
+
+ // Split out the link into the parts required for url(): path and options.
+ $parsed = drupal_parse_url($item['url']);
+ $item['path'] = $parsed['path'];
+ $item['options'] = array(
+ 'query' => $parsed['query'],
+ 'fragment' => $parsed['fragment'],
+ 'attributes' => &$item['attributes'],
+ );
+
+ // Add optional 'rel' attribute to link options.
+ if (!empty($settings['rel'])) {
+ $item['options']['attributes']['rel'] = $settings['rel'];
+ }
+ // Add optional 'target' attribute to link options.
+ if (!empty($settings['target'])) {
+ $item['options']['attributes']['target'] = $settings['target'];
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function viewElements(EntityInterface $entity, $langcode, array $items) {
+ $element = array();
+ $settings = $this->getSettings();
+
+ foreach ($items as $delta => $item) {
+ // By default use the full URL as the link title.
+ $link_title = $item['url'];
+
+ // If the title field value is available, use it for the link title.
+ if (empty($settings['url_only']) && !empty($item['title'])) {
+ // Unsanitizied token replacement here because $options['html'] is FALSE
+ // by default in theme_link().
+ $link_title = \Drupal::token()->replace($item['title'], array($entity->entityType() => $entity), array('sanitize' => FALSE, 'clear' => TRUE));
+ }
+
+ // Trim the link title to the desired length.
+ if (!empty($settings['trim_length'])) {
+ $link_title = truncate_utf8($link_title, $settings['trim_length'], FALSE, TRUE);
+ }
+
+ if (!empty($settings['url_only']) && !empty($settings['url_plain'])) {
+ $element[$delta] = array(
+ '#type' => 'markup',
+ '#markup' => check_plain($link_title),
+ );
+ }
+ else {
+ $element[$delta] = array(
+ '#type' => 'link',
+ '#title' => $link_title,
+ '#href' => $item['path'],
+ '#options' => $item['options'],
+ );
+ }
+ }
+
+ return $element;
+ }
+}
+