function 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;
}