You are here

class QuickQuicktabs in Quick Tabs 7.3

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

Hierarchy

Expanded class hierarchy of QuickQuicktabs

1 string reference to 'QuickQuicktabs'
quicktabs_quicktabs_renderers in ./quicktabs.module
Implements hook_quicktabs_renderers().

File

plugins/QuickQuicktabs.inc, line 7

View source
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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
QuickQuicktabs::add_attached protected function Add any necessary js, css and libraries for the render array.
QuickQuicktabs::build_tablinks protected function Build the actual tab links, with appropriate href, title and attributes.
QuickQuicktabs::construct_link_options protected function Helper function to construct link options for tab links.
QuickQuicktabs::render public function The only method that renderer plugins must implement. Overrides QuickRenderer::render
QuickRenderer::$quickset protected property
QuickRenderer::getTitle public function Accessor method for the title.
QuickRenderer::optionsForm public static function Method for returning the form elements to display for this renderer type on the admin form. 2
QuickRenderer::__construct public function Constructor