| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | <?php/** * @file * Allows to use PHP in views. *//** * Implements hook_views_api(). */function views_php_views_api() {  return array(    'api' => 3,  );}/** * Menu access callback function; use PHP code to determine whether a user as * access. */function views_php_check_access($php_access, $view_name, $display_id, $account = NULL) {  global $user;  static $function = array();  if (!isset($account)) {    $account = $user;  }  if (!isset($function[$view_name . ':' . $display_id])) {    $function[$view_name . ':' . $display_id] = create_function('$view_name, $display_id, $account', $php_access . ';');  }  ob_start();  $access = (bool) $function[$view_name . ':' . $display_id]($view_name, $display_id, $account);  ob_end_clean();  return $access;}/** * Helper function; builds form for PHP code options of views handlers/plugins. */function views_php_form_element($handler, $checkbox = FALSE, $input, $variables = array()) {  static $default_variables;  if (!isset($default_variables)) {    $default_variables = array(      '$view'    => t('The view object.'),      '$handler' => t('The handler object.'),      '$plugin'  => t('The plugin object.'),      '$static'  => t('A variable that can be used to store reusable data per row.'),      '$row'     => t('Contains the retrieved record from the database per row.'),      '$data'    => t('Contains the retrieved record from the database for all rows.'),      '$results' => t('Array containing the view\'s result.'),      '$cache'   => t('The cache object.'),    );  }  list($name, $title, $description, $use_delimiters) = $input;  $container = array(    '#type' => 'container',    // @todo #tree => FALSE doesn't work here.    '#parents' => array('options'),  );  if (!empty($checkbox)) {    list($checkbox_name, $checkbox_title, $checkbox_description) = $checkbox;    $checkbox = array(      '#type' => 'checkbox',      '#title' => $checkbox_title,      '#description' => $checkbox_description,      '#default_value' => $handler->options[$checkbox_name] && !empty($handler->options[$name]),    );    $container['#states'] = array(      'invisible' => array(        'input[name="options[use_' . $name . ']"]' => array('checked' => FALSE),      ),    );  }  $container[$name] = array(    '#type' => 'textarea',    '#id' => drupal_html_id('edit-options-' . $name),    '#title' => $title,    '#default_value' => $handler->options[$name],    '#rows' => 5,    '#description' => $description . ' <strong>' . ($use_delimiters      ? t('Use <?php ?> delimiters to enclose PHP code.')      : t('Do not use <?php ?> delimiters.'))      . '</strong>',  );  // Only users with use PHP permission can set/modify input.  if (!user_access('use PHP for settings')) {    $container[$name]['#disabled'] = TRUE;    $container[$name]['#value'] = $container[$name]['#default_value'];    $container[$name]['#description'] .= ' <strong>' . t('You do not have permission to modify this.') . '</strong>';  }  $items = array();  foreach ($variables as $variable_name => $description) {    if (is_int($variable_name)) {      $variable_name = $description;      $description = isset($default_variables[$description]) ? $default_variables[$description] : '';    }    $items[] = l($variable_name, '', array('fragment' => $container[$name]['#id'], 'external' => TRUE)) . ': ' . $description;    if (strpos($variable_name, '$row') === 0) {      $php_value = ($input[0] == 'php_value') ? true : false;      foreach ($handler->view->display_handler->get_handlers('field') as $field => $field_handler) {        // Do not add fields that will not have data when evaluating the value code. This occurs because        // the value code is evaluated in hook_views_post_execute(), but field data is made available in hook_views_pre_render(),        // which is called after hook_views_post_execute().        if ($php_value && $field_handler->table != $field_handler->view->base_table) {          continue;        }        $items[] = l($variable_name . '->' . $field, '', array('fragment' => $container[$name]['#id'], 'external' => TRUE)) . ': ' . $field_handler->ui_name();      }    }  }  $container[$name . '_variables'] = array(    '#type' => 'fieldset',    '#title' => t('Available variables'),    '#collapsible' => TRUE,    '#collapsed' => TRUE,    '#attributes' => array('class' => array('views-php-variables')),    '#attached' => array(      'js' => array(drupal_get_path('module', 'views_php') . '/views_php.js'),    )  );  $container[$name . '_variables']['variables'] = array(    '#theme' => 'item_list',    '#items' => $items,  );  if (!empty($checkbox)) {    return array($checkbox_name => $checkbox, $name => $container);  }  return array($name => $container);}/** * Implements hook_views_pre_execute(). */function views_php_views_pre_execute($view) {  // Seize control over the query plugin if a views handler requested so.  if (!empty($view->views_php)) {    $query = new views_php_plugin_query();    $query->php_wrap($view->query);  }}/** * Implements hook_views_post_execute(). */function views_php_views_post_render($view) {  // Restore original query plugin if it was wrapped.  if ($view->query instanceof views_php_plugin_wrapper) {    $view->query->php_unwrap();  }}
 |