You are here

class FaqViewer in Frequently Asked Questions 8

Controlls the display of questions and answers.

Hierarchy

Expanded class hierarchy of FaqViewer

3 files declare their use of FaqViewer
faq.hide_answer.inc in includes/faq.hide_answer.inc
FAQ page callbacks for the "hide answer" layouts.
faq.questions_inline.inc in includes/faq.questions_inline.inc
FAQ page callbacks for the "questions inline" layouts.
faq.questions_top.inc in includes/faq.questions_top.inc
FAQ page callbacks for the "questions top" layouts.

File

src/FaqViewer.php, line 13

Namespace

Drupal\faq
View source
class FaqViewer {

  /**
   * Helper function to setup the faq question.
   *
   * @param array &$data
   *   Array reference to store display data in.
   * @param \Drupal\node\NodeInterface $node
   *   The node object.
   * @param string $path
   *   The path/url which the question should link to if links are disabled.
   * @param string $anchor
   *   Link anchor to use in question links.
   */
  public static function viewQuestion(&$data, NodeInterface $node, $path = NULL, $anchor = NULL) {
    $faq_settings = \Drupal::config('faq.settings');
    $disable_node_links = $faq_settings
      ->get('disable_node_links');
    $question = '';

    // Don't link to faq node, instead provide no link, or link to current page.
    if ($disable_node_links) {
      if (empty($path) && empty($anchor)) {
        $question = $node
          ->getTitle();
      }
      elseif (empty($path)) {

        // Can't seem to use l() function with empty string as screen-readers
        // don't like it, so create anchor name manually.
        $question = '<a id="' . $anchor . '"></a>' . $node
          ->getTitle();
      }
      else {
        $options = array();
        if ($anchor) {
          $options['attributes'] = array(
            'id' => $anchor,
          );
        }
        $question = Link::fromTextAndUrl($node
          ->getTitle(), $path, $options)
          ->toString();
      }
    }
    else {
      $node_id = $node
        ->id();
      if (empty($anchor)) {
        $question = Link::fromTextAndUrl($node
          ->getTitle(), "node/{$node_id})")
          ->toString();
      }
      else {
        $url = $node
          ->toUrl()
          ->setOptions(array(
          "attributes" => array(
            "id" => "{$anchor}",
          ),
        ));
        $question = Link::fromTextAndUrl($node
          ->getTitle(), $url)
          ->toString();
      }
    }
    $question = '<span datatype="" property="dc:title">' . $question . '</span>';
    $detailed_question = $node
      ->get('field_detailed_question')->value;
    if ($faq_settings
      ->get('display') != 'hide_answer' && !empty($detailed_question) && $faq_settings
      ->get('question_length') == 'both') {
      $question .= '<div class="faq-detailed-question">' . $detailed_question . '</div>';
    }
    $data['question'] = new FormattableMarkup($question, []);
  }

  /**
   * Helper function to setup the faq answer.
   *
   * @param array &$data
   *   Array reference to store display data in.
   * @param Drupal\node\NodeInterface $node
   *   The node object.
   * @param string $back_to_top
   *   An array containing the "back to top" link.
   * @param bool $teaser
   *   Whether or not to use teasers.
   * @param bool $links
   *   Whether or not to show node links.
   */
  public static function viewAnswer(&$data, NodeInterface $node, $teaser) {
    $faq_settings = \Drupal::config('faq.settings');

    // TODO: hide 'submitted by ... on ...'
    $view_mode = $teaser ? 'teaser' : 'full';
    $node_build = \Drupal::entityTypeManager()
      ->getViewBuilder('node')
      ->view($node, $view_mode);
    hide($node_build['title']);
    if (!$faq_settings
      ->get('question_long_form')) {
      hide($node_build['field_detailed_question']);
    }
    $content = \Drupal::service('renderer')
      ->render($node_build);
    $content .= FaqViewer::initBackToTop();
    $data['body'] = new FormattableMarkup($content, []);
  }

  /**
   * Helper function to setup the "back to top" link.
   *
   * @param string $path
   *   The path/url where the "back to top" link should bring the user too.  This
   *   could be the 'faq-page' page or one of the categorized faq pages, e.g 'faq-page/123'
   *   where 123 is the tid.
   * @return
   *   An array containing the "back to top" link.
   */
  public static function initBackToTop() {
    $faq_settings = \Drupal::config('faq.settings');
    $back_to_top = '';
    $back_to_top_text = trim($faq_settings
      ->get('back_to_top'));
    if (!empty($back_to_top_text)) {
      $options = array(
        'attributes' => array(
          'title' => t('Go back to the top of the page.'),
        ),
        'html' => TRUE,
        'fragment' => 'top',
      );
      $back_to_top = Link::fromTextAndUrl($back_to_top_text, Url::fromUserInput('#', $options))
        ->toString();
    }
    return $back_to_top;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FaqViewer::initBackToTop public static function Helper function to setup the "back to top" link.
FaqViewer::viewAnswer public static function Helper function to setup the faq answer.
FaqViewer::viewQuestion public static function Helper function to setup the faq question.