You are here

class DrupalTextMetaTag in Metatag 7

Text-based meta tag controller.

Hierarchy

Expanded class hierarchy of DrupalTextMetaTag

15 string references to 'DrupalTextMetaTag'
metatag_app_links_metatag_info in metatag_app_links/metatag_app_links.metatag.inc
Implements hook_metatag_info().
metatag_dc_advanced_metatag_info in metatag_dc_advanced/metatag_dc_advanced.metatag.inc
Implements hook_metatag_info(). Dublin Core Elements taken from http://purl.org/dc/elements/1.1/.
metatag_dc_metatag_info in metatag_dc/metatag_dc.metatag.inc
Implements hook_metatag_info(). Dublin Core Elements taken from http://purl.org/dc/elements/1.1/.
metatag_facebook_metatag_info in metatag_facebook/metatag_facebook.metatag.inc
Implements hook_metatag_info().
metatag_get_info in ./metatag.module
Get the meta tag information array of a meta tag.

... See full list

File

./metatag.inc, line 442
Metatag primary classes.

View source
class DrupalTextMetaTag extends DrupalDefaultMetaTag {

  /**
   * {@inheritdoc}
   */
  public function getForm(array $options = array()) {
    $options += array(
      'token types' => array(),
    );
    $form['value'] = isset($this->info['form']) ? $this->info['form'] : array();
    $form['value'] += array(
      '#type' => 'textfield',
      '#title' => $this->info['label'],
      '#description' => !empty($this->info['description']) ? $this->info['description'] : '',
      '#default_value' => isset($this->data['value']) ? $this->data['value'] : '',
      '#element_validate' => array(
        'token_element_validate',
      ),
      '#token_types' => $options['token types'],
      '#maxlength' => 1024,
    );

    // Optional handling for items that allow multiple values.
    if (!empty($this->info['multiple'])) {
      $form['value']['#description'] .= ' ' . t('Multiple values may be used, separated by a comma. Note: Tokens that return multiple values will be handled automatically.');
    }

    // Optionally limit the field to a certain length.
    $maxlength = $this
      ->maxlength();
    if (!empty($maxlength)) {
      $form['value']['#description'] .= ' ' . t('This will be truncated to a maximum of %max characters.', array(
        '%max' => $maxlength,
      ));
    }

    // Optional handling for images.
    if (!empty($this->info['image'])) {
      $form['value']['#description'] .= ' ' . t('This will be able to extract the URL from an image field.');
    }

    // Optional handling for languages.
    if (!empty($this->info['is_language'])) {
      $form['value']['#description'] .= ' ' . t('This will not be displayed if it is set to the "Language neutral" (i.e. "und").');
    }

    // Optional support for select_or_other.
    if ($form['value']['#type'] == 'select' && !empty($this->info['select_or_other']) && module_exists('select_or_other')) {
      $form['value']['#type'] = 'select_or_other';
      $form['value']['#other'] = t('Other (please type a value)');
      $form['value']['#multiple'] = FALSE;
      $form['value']['#other_unknown_defaults'] = 'other';
      $form['value']['#other_delimiter'] = FALSE;
      $form['value']['#theme'] = 'select_or_other';
      $form['value']['#select_type'] = 'select';
      $form['value']['#element_validate'] = array(
        'select_or_other_element_validate',
      );
    }

    // Support for dependencies, using Form API's #states system.
    // @see metatag.api.php.
    // @see https://api.drupal.org/drupal_process_states
    if (!empty($this->info['dependencies'])) {
      foreach ($this->info['dependencies'] as $specs) {
        $form['value']['#states']['visible'][':input[name*="[' . $specs['dependency'] . '][' . $specs['attribute'] . ']"]'] = array(
          $specs['condition'] => $specs['value'],
        );
      }
    }
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function getValue(array $options = array()) {
    $options += array(
      'instance' => '',
      'token data' => array(),
      // Remove any remaining token after the string is parsed.
      'clear' => TRUE,
      'sanitize' => variable_get('metatag_token_sanitize', FALSE),
      'raw' => FALSE,
    );

    // If the value wasn't set there's no point in proceeding.
    if (!isset($this->data['value'])) {
      return '';
    }
    $value = $this->data['value'];
    if (empty($options['raw'])) {

      // Keep a copy of the original body value from before the summary string
      // is extracted, so that this doesn't break output from other modules.
      $old_value = NULL;

      // There can be problems extracting the [node:summary] token due to
      // certain modules using custom placeholders, e.g. Media WYSIWYG. To avoid
      // that problem, the string needs to be filtered using tidyValue() before
      // the tokens are processed.
      if (strpos($value, '[node:summary]') !== FALSE) {

        // Make sure there is a node to work with.
        if (isset($options['token data']['node'])) {

          // Get language to use for selecting body field value.
          $lang = field_language('node', $options['token data']['node'], 'body');
          if (!empty($options['token data']['node']->body[$lang][0]['value'])) {
            $old_value = $options['token data']['node']->body[$lang][0]['value'];

            // Pre-tidy the node body for token_replace if it's not empty.
            $options['token data']['node']->body[$lang][0]['value'] = $this
              ->tidyValue($old_value);
          }
        }
      }

      // Give other modules the opportunity to use hook_metatag_pattern_alter()
      // to modify defined token patterns and values before replacement.
      drupal_alter('metatag_pattern', $value, $options['token data'], $this->info['name']);
      $value = token_replace($value, $options['token data'], $options);

      // Put back the original value, if one was retained earlier.
      if (!is_null($old_value)) {
        $options['token data']['node']->body[$lang][0]['value'] = $old_value;
      }
    }

    // Special handling for language meta tags.
    if (!empty($this->info['is_language'])) {

      // If the meta tag value equals LANGUAGE_NONE, i.e. "und", then don't
      // output it.
      if (is_string($value) && $value == LANGUAGE_NONE) {
        $value = '';
      }
    }

    // Special handling for images and other URLs.
    if (!empty($this->info['image']) || !empty($this->info['url'])) {

      // Support multiple items, whether it's needed or not. Also remove the
      // empty values and reindex the array.
      $values = array_values(array_filter(explode(',', $value)));

      // If this meta tag does *not* allow multiple items, only keep the first
      // one.
      if (empty($this->info['multiple']) && !empty($values[0])) {
        $values = array(
          $values[0],
        );
      }
      foreach ($values as &$image_value) {

        // Remove any unwanted whitespace around the value.
        $image_value = trim($image_value);

        // If this contains embedded image tags, extract the image URLs.
        if (!empty($this->info['image']) && strip_tags($image_value) != $image_value) {
          $matches = array();
          preg_match('/src="([^"]*)"/', $image_value, $matches);
          if (!empty($matches[1])) {
            $image_value = $matches[1];
          }
        }

        // Convert the URL to an absolute URL.
        $image_value = $this
          ->convertUrlToAbsolute($image_value);

        // Replace spaces the URL encoded entity to avoid validation problems.
        $image_value = str_replace(' ', '%20', $image_value);
      }

      // Combine the multiple values into a single string.
      $value = implode(',', $values);
    }

    // Clean up the string a bit.
    $value = $this
      ->tidyValue($value);

    // Optionally truncate the value.
    $value = $this
      ->truncate($value);

    // Translate the final output string prior to output. Use the
    // 'output' i18n_string object type, and pass along the meta tag's
    // options as the context so it can be handled appropriately.
    $value = metatag_translate_metatag($value, $this->info['name'], $options, NULL, TRUE);
    return $value;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DrupalDefaultMetaTag::$data protected property The values submitted for this tag.
DrupalDefaultMetaTag::$info protected property All of the basic information about this tag.
DrupalDefaultMetaTag::$weight protected property This item's weight; used for sorting the output.
DrupalDefaultMetaTag::convertUrlToAbsolute protected function Make sure a given URL is absolute.
DrupalDefaultMetaTag::getElement public function Get the HTML tag for this meta tag. Overrides DrupalMetaTagInterface::getElement 4
DrupalDefaultMetaTag::getWeight public function Calculate the weight of this meta tag. Overrides DrupalMetaTagInterface::getWeight
DrupalDefaultMetaTag::maxlength protected function Identify the maximum length of which strings will be allowed.
DrupalDefaultMetaTag::textSummary public static function Copied from text.module with the following changes:. Overrides DrupalMetaTagInterface::textSummary
DrupalDefaultMetaTag::tidyValue protected function Remove unwanted formatting from a meta tag.
DrupalDefaultMetaTag::truncate protected function Shorten a string to a certain length using ::textSummary().
DrupalDefaultMetaTag::__construct public function Constructor. Overrides DrupalMetaTagInterface::__construct 1
DrupalTextMetaTag::getForm public function Build the form for this meta tag. Overrides DrupalDefaultMetaTag::getForm 1
DrupalTextMetaTag::getValue public function Get the string value of this meta tag. Overrides DrupalDefaultMetaTag::getValue 1