You are here

function views_content_views_content_type_render in Chaos Tool Suite (ctools) 7

Same name and namespace in other branches
  1. 6 views_content/plugins/content_types/views.inc \views_content_views_content_type_render()

Output function for the 'views' content type.

Outputs a view based on the module and delta supplied in the configuration.

File

views_content/plugins/content_types/views.inc, line 89

Code

function views_content_views_content_type_render($subtype, $conf, $panel_args, $contexts) {
  if (!is_array($contexts)) {
    $contexts = array(
      $contexts,
    );
  }
  $view = _views_content_views_update_conf($conf, $subtype);
  if (empty($view) || !is_object($view) || empty($view->display_handler)) {
    return;
  }
  if (!$view->display_handler
    ->access($GLOBALS['user'])) {
    return;
  }
  $arguments = explode('/', $_GET['q']);
  $args = $conf['args'];
  foreach ($arguments as $id => $arg) {
    $args = str_replace("%{$id}", $arg, $args);
  }
  foreach ($panel_args as $id => $arg) {
    if (is_string($arg)) {
      $args = str_replace("@{$id}", $arg, $args);
    }
  }
  $args = preg_replace(',/?(%\\d|@\\d),', '', $args);
  $args = $args ? explode('/', $args) : array();
  if ($conf['panel_args'] && is_array($panel_args)) {
    $args = array_merge($panel_args, $args);
  }
  if (isset($conf['context']) && is_array($conf['context'])) {
    foreach ($conf['context'] as $count => $context_info) {
      if (!strpos($context_info, '.')) {

        // Old skool: support pre-converter contexts as well.
        $cid = $context_info;
        $converter = '';
      }
      else {
        list($cid, $converter) = explode('.', $context_info, 2);
      }
      if (!empty($contexts[$cid])) {
        $arg = ctools_context_convert_context($contexts[$cid], $converter, array(
          'sanitize' => FALSE,
        ));
        array_splice($args, $count, 0, array(
          $arg,
        ));
      }
      else {

        // Make sure we put an argument in even if it was not there.
        $arg = NULL;
      }
    }
  }
  $view
    ->set_arguments($args);
  if ($conf['url']) {
    $view->override_path = $conf['url'];
  }
  $block = new stdClass();
  $block->module = 'views';
  $block->delta = $view->name . '-' . $view->current_display;
  if (!empty($conf['link_to_view'])) {
    $block->title_link = $view
      ->get_url();
  }
  if (!empty($conf['more_link'])) {
    $block->more = array(
      'href' => $view
        ->get_url(),
    );
    $view->display_handler
      ->set_option('use_more', FALSE);
  }

  // Only set use_pager if they differ, this way we can avoid overwriting the
  // pager type that Views uses.
  if ($conf['override_pager_settings']) {
    if (method_exists($view, 'init_pager')) {

      // Views 3 version.
      $view
        ->set_items_per_page($conf['nodes_per_page']);
      $view
        ->set_offset($conf['offset']);
      $pager = $view->display_handler
        ->get_option('pager');
      if ($conf['use_pager'] && ($pager['type'] == 'none' || $pager['type'] == 'some')) {
        $pager['type'] = 'full';
      }
      elseif (!$conf['use_pager']) {
        $pager['type'] = $view
          ->get_items_per_page() ? 'some' : 'none';
      }
      if ($conf['use_pager']) {
        if (!isset($pager['options']['id']) || $pager['options']['id'] != $conf['pager_id']) {
          $pager['options']['id'] = $conf['pager_id'];
        }
      }
      $view->display_handler
        ->set_option('pager', $pager);
    }
    else {
      if (!$view->display_handler
        ->get_option('use_pager') || empty($conf['use_pager'])) {
        $view->display_handler
          ->set_option('use_pager', $conf['use_pager']);
      }
      $view->display_handler
        ->set_option('pager_element', $conf['pager_id']);
      $view->display_handler
        ->set_option('items_per_page', $conf['nodes_per_page']);
      $view->display_handler
        ->set_option('offset', $conf['offset']);
    }
  }
  $stored_feeds = drupal_add_feed();
  $block->content = $view
    ->preview();
  $block->title = $view
    ->get_title();
  if (empty($view->result) && !$view->display_handler
    ->get_option('empty') && empty($view->style_plugin->definition['even empty'])) {
    return;
  }
  if (!empty($conf['feed_icons'])) {
    $new_feeds = drupal_add_feed();
    if ($diff = array_diff(array_keys($new_feeds), array_keys($stored_feeds))) {
      foreach ($diff as $url) {
        $block->feeds[$url] = $new_feeds[$url];
      }
    }
  }
  $view
    ->destroy();
  return $block;
}