You are here

QuickQuicktabs.inc in Quick Tabs 7.3

File

plugins/QuickQuicktabs.inc
View source
<?php

/**
 * Renders the content using the original Quicktabs mechanism of previous versions.
 * Includes support for ajax rendered content.
 */
class QuickQuicktabs extends QuickRenderer {
  public function render() {
    $quickset = $this->quickset;
    $render_array = array();
    $active_tab = $quickset
      ->getActiveTab();
    if ($tabs = $this
      ->build_tablinks($active_tab)) {
      $render_array['#attached'] = $this
        ->add_attached();
      $qt_name = $quickset
        ->getName();
      $settings = $quickset
        ->getSettings();
      $contents = $quickset
        ->getContents();
      $render_array['content'] = array(
        '#theme' => 'qt_quicktabs',
        '#options' => array(
          'attributes' => array(
            'id' => 'quicktabs-' . $qt_name,
            'class' => 'quicktabs-wrapper quicktabs-style-' . drupal_html_class($settings['style']),
          ),
        ),
        'tabs' => array(
          '#theme' => 'qt_quicktabs_tabset',
          '#options' => array(
            'active' => $active_tab,
            'style' => drupal_html_class($settings['style']),
          ),
          'tablinks' => $tabs,
        ),
        // The main content area, each quicktab container needs a unique id.
        'container' => array(
          '#prefix' => '<div id="quicktabs-container-' . $qt_name . '" class="quicktabs_main quicktabs-style-' . drupal_html_class($settings['style']) . '">',
          '#suffix' => '</div>',
          'divs' => array(),
        ),
      );

      // If in ajax mode, we'll only be rendering one tab, otherwise all of them.
      if ($settings['ajax']) {

        // check in case of $active_tab=QUICKTABS_DELTA_NONE
        $tabs_to_render = isset($contents[$active_tab]) ? array(
          $active_tab => $contents[$active_tab],
        ) : array();
      }
      else {
        $tabs_to_render = $contents;
      }
      foreach ($tabs_to_render as $key => $tab) {
        if (!empty($tab)) {
          $attribs = array(
            'id' => 'quicktabs-tabpage-' . $qt_name . '-' . $key,
            'class' => array(
              'quicktabs-tabpage',
              $active_tab == $key ? '' : 'quicktabs-hide',
            ),
          );
          $render_array['content']['container']['divs'][] = array(
            '#prefix' => '<div ' . drupal_attributes($attribs) . '>',
            '#suffix' => '</div>',
            'content' => $tab
              ->render(),
          );
        }
      }
    }
    return $render_array;
  }

  /**
   * Build the actual tab links, with appropriate href, title and attributes.
   *
   * @param $active_tab The index of the active tab.
   */
  protected function build_tablinks($active_tab) {
    $quickset = $this->quickset;
    $settings = $quickset
      ->getSettings();
    $tabs = array();
    foreach ($quickset
      ->getContents() as $i => $tab) {
      if (!empty($tab)) {
        $tablink = array(
          '#type' => 'link',
          '#title' => $quickset
            ->translateString($tab
            ->getTitle(), 'tab', $i),
          '#href' => $_GET['q'],
          '#options' => $this
            ->construct_link_options($i),
        );
        if ($settings['ajax']) {
          $tab_settings = $tab
            ->getSettings();
          $ajax_keys = $tab
            ->getAjaxKeys();
          $ajax_args = array();
          foreach ($ajax_keys as $key) {
            $ajax_args[] = $tab_settings[$key];
          }
          $ajax_path = $quickset
            ->getAjaxPath($i, $tab
            ->getType());
          $ajax_href = $ajax_path . '/' . implode('/', $ajax_args);
          $tablink['#ajax'] = array(
            'progress' => array(
              'message' => '',
              'type' => 'throbber',
            ),
            'path' => $ajax_href,
          );
        }
        $tabs[$i] = $tablink;
      }
    }
    return $tabs;
  }

  /**
   * Add any necessary js, css and libraries for the render array.
   */
  protected function add_attached() {
    $attached = array(
      'css' => array(
        array(
          'data' => drupal_get_path('module', 'quicktabs') . '/css/quicktabs.css',
        ),
      ),
      'js' => array(
        array(
          'data' => drupal_get_path('module', 'quicktabs') . '/js/quicktabs.js',
        ),
        array(
          'data' => 'misc/progress.js',
          'weight' => JS_LIBRARY,
        ),
      ),
    );
    $settings = $this->quickset
      ->getSettings();

    // Add the custom style css if a custom style has been set.
    $style_css = quicktabs_get_css($settings['style']);
    if (!empty($style_css)) {
      $attached['css'][] = $style_css;
    }

    // Prepare a tab_settings array for passing the tab info to our JavaScript.
    $tab_settings = array();
    foreach ($this->quickset
      ->getContents() as $i => $content) {
      if (!empty($content)) {
        $tab_settings[$i] = $content
          ->getSettings();
      }
    }

    // Add our JS settings
    $javascript = drupal_add_js();
    if (isset($javascript['settings']['data'])) {
      foreach ($javascript['settings']['data'] as $key => $settings) {
        if (key($settings) == 'quicktabs') {
          $qtkey = $key;
          break;
        }
      }
    }
    $name = $this->quickset
      ->getName();
    if (!isset($qtkey) || isset($javascript['settings']['data'][$qtkey]['quicktabs']) && !array_key_exists('qt_' . $name, $javascript['settings']['data'][$qtkey]['quicktabs'])) {
      $quicktabs_array = array_merge(array(
        'name' => $name,
        'tabs' => $tab_settings,
      ), $settings);
      $attached['js'][] = array(
        'data' => array(
          'quicktabs' => array(
            'qt_' . $name => $quicktabs_array,
          ),
        ),
        'type' => 'setting',
      );
    }
    return $attached;
  }

  /**
   * Helper function to construct link options for tab links.
   */
  protected function construct_link_options($tabkey) {
    $qt_name = $this->quickset
      ->getName();
    $settings = $this->quickset
      ->getSettings();
    $contents = $this->quickset
      ->getContents();
    $tab_type = $contents[$tabkey]
      ->getType();
    $tab_unique_keys = $contents[$tabkey]
      ->getUniqueKeys();
    $tab_settings = $contents[$tabkey]
      ->getSettings();
    $id = 'quicktabs-tab-' . implode('-', array(
      $qt_name,
      $tabkey,
    ));
    $classes = array(
      'quicktabs-tab',
      'quicktabs-tab-' . $tab_type,
    );

    // Generate unique class for the quicktab.
    $key_contents = array();
    foreach ($tab_unique_keys as $key) {
      if (isset($tab_settings[$key])) {
        $key_content = $tab_settings[$key];
        $key_content = str_replace(array(
          '_',
          ' ',
        ), '-', $key_content);
        $key_content = preg_replace('/[^A-Za-z0-9\\-]/', '', $key_content);
        $key_contents[] = $key_content;
      }
    }
    $suffix = implode('-', $key_contents);

    // Encode class suffixes longer than 50 as hash using md5.
    if (strlen($suffix) > 50) {
      $suffix = md5($suffix);
    }
    if (strlen($suffix) > 0) {
      $classes[] = 'quicktabs-tab-' . $tab_type . '-' . $suffix;
    }

    // Need to construct the correct querystring for the tab links.
    $query = drupal_get_query_parameters(NULL, array(
      "qt-{$qt_name}",
      'q',
      'page',
    ));
    $query["qt-{$qt_name}"] = $tabkey;
    $link_options = array(
      'attributes' => array(
        'id' => $id,
        'class' => $classes,
      ),
      'query' => $query,
      'fragment' => 'qt-' . $qt_name,
      'html' => isset($settings['html']) ? $settings['html'] : FALSE,
    );
    return $link_options;
  }

}

Classes

Namesort descending Description
QuickQuicktabs Renders the content using the original Quicktabs mechanism of previous versions. Includes support for ajax rendered content.