class ViewsBlock extends Block {
protected $viewOutput = array(
'content' => '',
'subject' => '',
'path' => NULL,
);
function __construct($plugin_name, array $data) {
parent::__construct($plugin_name, $data);
$this->settings += array(
'allowed' => array(),
'path_override' => FALSE,
);
}
protected function setDefaultsFromView(View $view) {
$pager = $view->display_handler->get_option('pager');
$this->settings = array_merge(array(
'link_to_view' => $view->display_handler->get_option('link_to_view'),
'more_link' => $view->display_handler->get_option('use_more'),
'use_pager' => $pager['type'] != 'none' && $pager['type'] != 'some',
'pager_id' => isset($pager['options']['id']) ? $pager['options']['id'] : 0,
'items_per_page' => !empty($pager['options']['items_per_page']) ? $pager['options']['items_per_page'] : 10,
'offset' => !empty($pager['options']['offset']) ? $pager['options']['offset'] : 0,
'path' => $view->get_path(),
'fields_override' => $view->display_handler->get_option('fields_override'),
), $this->settings);
}
function getAdminTitle() {
if (!empty($this->settings['admin_label'])) {
return check_plain($this->settings['admin_label']);
}
list($view_name, $display_id) = explode('-', $this->delta);
if ($view = views_get_view($view_name)) {
$view->set_display($display_id);
if ($block_description = $view->display_handler->get_option('block_description')) {
$info = t($block_description);
}
elseif ($view->display[$display_id]->display_title == $view->display_handler->definition['title']) {
$info = t('View: @view', array('@view' => $view->get_human_name()));
}
else {
$info = t('View: @view (@display)', array('@view' => $view->get_human_name(), '@display' => $view->display[$display_id]->display_title));
}
}
return $info;
}
function prepare() {
parent::prepare();
list($view_name, $display_id) = explode('-', $this->delta);
if ($view = views_get_view($view_name)) {
if (!$view->access($display_id)) {
$view->destroy();
return;
}
$this->setDefaultsFromView($view);
$view->set_display($display_id);
$view->display_handler->set_override_options($this->settings);
$args = array();
$arguments = $view->display_handler->get_option('arguments');
foreach ($view->display_handler->get_argument_input() as $id => $argument) {
switch ($argument['type']) {
case 'layout':
foreach ($this->contexts as $context) {
$args[] = $context->argument;
}
break;
case 'fixed':
$args[] = $argument['fixed'];
break;
case 'user':
$args[] = (isset($this->settings['arguments'][$id]) && strlen($this->settings['arguments'][$id])) ? $this->settings['arguments'][$id] : NULL;
break;
case 'wildcard':
$args[] = isset($arguments[$id]['wildcard']) ? $arguments[$id]['wildcard'] : '*';
break;
case 'url':
if (isset($argument['position'])) {
$arg = (int) $argument['position'];
$args[] = arg($arg);
}
break;
case 'none':
default:
$args[] = NULL;
break;
}
}
while (count($args) && end($args) === NULL) {
array_pop($args);
}
$view->set_arguments($args);
$allow = $view->display_handler->get_option('allow');
if ($allow['path_override'] && !empty($this->settings['path'])) {
$view->override_path = $this->settings['path'];
}
elseif ($path = $view->display_handler->get_option('inherit_path')) {
$view->override_path = $_GET['q'];
}
if ($allow['more_link']) {
if (empty($this->settings['more_link'])) {
$view->display_handler->set_option('use_more', FALSE);
}
else {
$view->display_handler->set_option('use_more', TRUE);
$view->get_total_rows = TRUE;
}
}
if ($allow['items_per_page'] && isset($this->settings['items_per_page'])) {
$view->set_items_per_page($this->settings['items_per_page']);
}
if ($allow['offset']) {
$view->set_offset($this->settings['offset']);
}
if ($allow['use_pager']) {
$pager = $view->display_handler->get_option('pager');
if ($this->settings['use_pager'] && ($pager['type'] == 'none' || $pager['type'] == 'some')) {
$pager['type'] = 'full';
}
elseif (!$this->settings['use_pager'] && $pager['type'] != 'none' && $pager['type'] != 'some') {
$pager['type'] = $view->get_items_per_page() || !empty($pager['options']['items_per_page']) ? 'some' : 'none';
}
if ($this->settings['use_pager']) {
if (!isset($pager['options']['id']) || (isset($this->settings['pager_id']) && $pager['options']['id'] != $this->settings['pager_id'])) {
$pager['options']['id'] = (int) $this->settings['pager_id'];
}
}
$view->display_handler->set_option('pager', $pager);
}
if ($allow['fields_override']) {
if ($this->settings['fields_override']) {
$fields = $view->get_items('field');
foreach ($fields as $field => $field_display) {
$fields[$field]['exclude'] = empty($this->settings['fields_override'][$field]);
}
$view->display_handler->set_option('fields', $fields);
}
}
if ($allow['exposed_form'] && !empty($this->settings['exposed'])) {
foreach ($this->settings['exposed'] as $filter_name => $filter_value) {
if (!is_array($filter_value)) {
$this->settings['exposed'][$filter_name] = $filter_value;
}
}
$view->set_exposed_input($this->settings['exposed']);
}
$output = $view->execute_display($display_id);
if ($output) {
if (is_string($output['content'])) {
$output['content'] = array(
'#markup' => $output['content'],
);
}
if (($allow['link_to_view'] && !empty($this->settings['link_to_view'])) ||
(!$allow['link_to_view'] && $view->display_handler->get_option('link_to_view'))) {
$output['path'] = $view->get_url();
}
views_add_contextual_links($output['content'], 'block', $view, $display_id);
$this->viewOutput = $output;
}
$view->destroy();
}
}
function getTitle() {
$title = parent::getTitle();
if ($this->settings['title_display'] === LAYOUT_TITLE_DEFAULT) {
$title = $this->viewOutput['subject'];
}
if ($title && isset($this->viewOutput['path'])) {
$title = l($title, $this->viewOutput['path'], array('html' => TRUE));
}
return $title;
}
function getContent() {
return $this->viewOutput['content'];
}
function form(&$form, &$form_state) {
parent::form($form, $form_state);
list($name, $display_id) = explode('-', $this->delta);
$view = views_get_view($name);
if (empty($view)) {
$form['markup'] = array('#markup' => t('Broken/missing/deleted view.'));
return;
}
$view->set_display($display_id);
if ($view->current_display == 'default') {
$form['markup'] = array('#markup' => t('Broken/missing/deleted view display.'));
return;
}
$allow = $view->display_handler->get_option('allow');
$this->setDefaultsFromView($view);
$form['arguments']['#tree'] = TRUE;
foreach ($view->display_handler->get_argument_input() as $id => $argument) {
if ($argument['type'] == 'user') {
$form['arguments'][$id] = array(
'#type' => 'textfield',
'#default_value' => isset($this->settings['arguments'][$id]) ? $this->settings['arguments'][$id] : '',
'#title' => check_plain($argument['label']),
);
}
}
if ($allow['link_to_view']) {
$form['link_to_view'] = array(
'#type' => 'checkbox',
'#default_value' => isset($this->settings['link_to_view']) ? $this->settings['link_to_view'] : $view->display_handler->get_option('link_to_view'),
'#title' => t('Link title to view page path'),
'#states' => array(
'visible' => array(
'form.layout-block-configure-form :input[name="title_display"]' => array('!value' => LAYOUT_TITLE_NONE),
),
),
);
}
if ($allow['more_link']) {
$form['more_link'] = array(
'#type' => 'checkbox',
'#default_value' => isset($this->settings['more_link']) ? $this->settings['more_link'] : $view->display_handler->get_option('use_more'),
'#description' => t('The text of this link will be "@more". The text can be modified within the view configuration.', array('@more' => $view->display_handler->use_more_text())),
'#title' => t('Provide a "more" link.'),
);
}
if ($allow['path_override']) {
$form['path_override'] = array(
'#type' => 'checkbox',
'#default_value' => $this->settings['path_override'],
'#title' => t('Override path'),
'#description' => t('Use a different path for the more link, pager, and other links.')
);
$form['path'] = array(
'#type' => 'textfield',
'#default_value' => isset($this->settings['path']) ? $this->settings['path'] : $view->get_path(),
'#title' => t('Override path'),
'#size' => 30, '#states' => array(
'visible' => array(
':input[name="path_override"]' => array('checked' => TRUE),
),
),
);
}
$view->init_style();
if (empty($this->settings['exposed'])) {
$this->settings['exposed'] = array();
}
if ($allow['exposed_form']) {
$exposed_form_state = array(
'view' => &$view,
'display' => &$view->display[$display_id],
);
$view->set_exposed_input($this->settings['exposed']);
$exposed_form_state['exposed_form_plugin'] = $view->display_handler->get_plugin('exposed_form');
$view->init_handlers();
$exposed_form = array();
$exposed_form = views_exposed_form($exposed_form, $exposed_form_state);
foreach ($exposed_form['#info'] as $id => $info) {
$form['exposed'][$id] = array(
'#type' => 'item',
'#id' => 'views-exposed-block',
);
if (!empty($info['label'])) {
$form['exposed'][$id]['#title'] = $info['label'];
}
if (!empty($info['operator']) && !empty($exposed_form[$info['operator']])) {
$form['exposed'][$id][$info['operator']] = $exposed_form[$info['operator']];
$form['exposed'][$id][$info['operator']]['#parents'] = array('exposed', $info['operator']);
$form['exposed'][$id][$info['operator']]['#default_value'] = isset($this->settings['exposed'][$info['operator']]) ? $this->settings['exposed'][$info['operator']] : '';
}
$form['exposed'][$id][$info['value']] = $exposed_form[$info['value']];
$form['exposed'][$id][$info['value']]['#parents'] = array('exposed', $info['value']);
$form['exposed'][$id][$info['value']]['#default_value'] = isset($this->settings['exposed'][$info['value']]) ? $this->settings['exposed'][$info['value']] : '';
}
}
if (isset($exposed_form['sort_by'])) {
$form['exposed']['sort_by'] = $exposed_form['sort_by'];
}
if (isset($exposed_form['sort_order'])) {
$form['exposed']['sort_order'] = $exposed_form['sort_order'];
}
if (!empty($form['exposed'])) {
$form['exposed'] += array(
'#title' => t('Filter options'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#tree' => TRUE,
);
}
if ($allow['fields_override'] && $view->style_plugin->uses_fields()) {
$form['fields_override'] = array(
'#type' => 'fieldset',
'#title' => t('Fields to display'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#tree' => TRUE,
);
foreach ($view->display_handler->get_handlers('field') as $field => $handler) {
$title = $handler->ui_name();
if ($handler->options['label']) {
$title .= ' (' . check_plain($handler->options['label']) . ')';
}
$form['fields_override'][$field] = array(
'#type' => 'checkbox',
'#title' => $title,
'#default_value' => isset($this->settings['fields_override'][$field]) ? $this->settings['fields_override'][$field] : !$handler->options['exclude'],
);
}
}
if ($allow['use_pager']) {
$form['pager']['use_pager'] = array(
'#type' => 'checkbox',
'#title' => t('Use pager'),
'#default_value' => $this->settings['use_pager'],
);
$form['pager']['pager_id'] = array(
'#type' => 'number',
'#default_value' => $this->settings['pager_id'],
'#title' => t('Pager ID'),
'#step' => 1,
'#min' => 0,
'#max' => 999,
'#states' => array(
'visible' => array(
'input[name="use_pager"]' => array('checked' => TRUE),
),
),
);
}
if ($allow['items_per_page']) {
$form['pager']['items_per_page'] = array(
'#type' => 'number',
'#default_value' => $this->settings['items_per_page'],
'#title' => t('Number of items'),
'#min' => 0,
'#max' => 1000,
'#description' => t('Select the number of items to display, or 0 to display all results.'),
);
}
if ($allow['offset']) {
$form['pager']['offset'] = array(
'#type' => 'textfield',
'#default_value' => $this->settings['offset'],
'#title' => t('Offset'),
'#size' => 4,
'#description' => t('Enter the number of items to skip; enter 0 to skip no items.'),
);
}
if (!empty($form['pager'])) {
$form['pager'] += array(
'#type' => 'fieldset',
'#title' => t('Pager options'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#tree' => FALSE,
);
}
}
function formValidate($form, &$form_state) {
parent::formValidate($form, $form_state);
}
function formSubmit($form, &$form_state) {
parent::formSubmit($form, $form_state);
$keys = array(
'link_to_view',
'more_link',
'use_pager',
'pager_id',
'items_per_page',
'offset',
'path_override',
'path',
'arguments',
'fields_override',
'exposed',
);
foreach ($keys as $key) {
if (isset($form_state['values'][$key])) {
$this->settings[$key] = $form_state['values'][$key];
}
}
}
}