123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713 |
- <?php
- function _views_create_handler($definition, $type = 'handler', $handler_type = NULL) {
- if (empty($definition['handler'])) {
- vpr('_views_create_handler - type: @type - failed: handler has not been provided.',
- array('@type' => isset($handler_type) ? ( $type . '(handler type: ' . $handler_type . ')' ) : $type)
- );
- return;
- }
-
- if (!empty($definition['override handler']) &&
- !class_exists($definition['override handler'])) {
- vpr(
- '_views_create_handler - loading override handler @type failed: class @override_handler could not be loaded. ' .
- 'Verify the class file has been registered in the corresponding .info-file (files[]).',
- array(
- '@type' => isset($handler_type) ? ( $type . '(handler type: ' . $handler_type . ')' ) : $type,
- '@override_handler' => $definition['override handler']
- )
- );
- return;
- }
- if (!class_exists($definition['handler'])) {
- vpr(
- '_views_create_handler - loading handler @type failed: class @handler could not be loaded. ' .
- 'Verify the class file has been registered in the corresponding .info-file (files[]).',
- array(
- '@type' => isset($handler_type) ? ( $type . '(handler type: ' . $handler_type . ')' ) : $type,
- '@handler' => $definition['handler']
- )
- );
- return;
- }
- if (!empty($definition['override handler'])) {
- $handler = new $definition['override handler'];
- }
- else {
- $handler = new $definition['handler'];
- }
- $handler->set_definition($definition);
- if ($type == 'handler') {
- $handler->is_handler = TRUE;
- $handler->handler_type = $handler_type;
- }
- else {
- $handler->is_plugin = TRUE;
- $handler->plugin_type = $type;
- $handler->plugin_name = $definition['name'];
- }
-
- $handler->construct();
- return $handler;
- }
- function _views_prepare_handler($definition, $data, $field, $type) {
- foreach (array('group', 'title', 'title short', 'help', 'real field') as $key) {
- if (!isset($definition[$key])) {
-
- if (!empty($data[$field][$key])) {
- $definition[$key] = $data[$field][$key];
- }
-
- elseif (!empty($data['table'][$key])) {
- $definition[$key] = $data['table'][$key];
- }
- }
- }
- return _views_create_handler($definition, 'handler', $type);
- }
- function views_get_table_join($table, $base_table) {
- $data = views_fetch_data($table);
- if (isset($data['table']['join'][$base_table])) {
- $h = $data['table']['join'][$base_table];
- if (!empty($h['handler']) && class_exists($h['handler'])) {
- $handler = new $h['handler'];
- }
- else {
- $handler = new views_join();
- }
-
- $handler->definition = $h;
- if (empty($handler->definition['table'])) {
- $handler->definition['table'] = $table;
- }
-
- if (empty($handler->definition['left_table'])) {
- $handler->definition['left_table'] = $base_table;
- }
- if (isset($h['arguments'])) {
- call_user_func_array(array(&$handler, 'construct'), $h['arguments']);
- }
- else {
- $handler->construct();
- }
- return $handler;
- }
-
- vpr("Missing join: @table @base_table", array('@table' => $table, '@base_table' => $base_table));
- }
- class views_handler extends views_object {
-
- var $view = NULL;
-
- var $query = NULL;
-
- var $handler_type = NULL;
-
- public $table_alias;
-
- var $real_field;
-
- var $relationship = NULL;
-
- function init(&$view, &$options) {
- $this->view = &$view;
- $display_id = $this->view->current_display;
-
-
-
-
- if (isset($this->actual_table)) {
- $options['table'] = $this->actual_table;
- }
- if (isset($this->actual_field)) {
- $options['field'] = $this->actual_field;
- }
- $types = views_object_types();
- $plural = $this->handler_type;
- if (isset($types[$this->handler_type]['plural'])) {
- $plural = $types[$this->handler_type]['plural'];
- }
- if ($this->view->display_handler->is_defaulted($plural)) {
- $display_id = 'default';
- }
- $this->localization_keys = array(
- $display_id,
- $this->handler_type,
- $options['table'],
- $options['id']
- );
- $this->unpack_options($this->options, $options);
-
- if (isset($options['table'])) {
- $this->table = $options['table'];
- }
- if (isset($this->definition['real field'])) {
- $this->real_field = $this->definition['real field'];
- }
- if (isset($this->definition['field'])) {
- $this->real_field = $this->definition['field'];
- }
- if (isset($options['field'])) {
- $this->field = $options['field'];
- if (!isset($this->real_field)) {
- $this->real_field = $options['field'];
- }
- }
- $this->query = &$view->query;
- }
- function option_definition() {
- $options = parent::option_definition();
- $options['id'] = array('default' => '');
- $options['table'] = array('default' => '');
- $options['field'] = array('default' => '');
- $options['relationship'] = array('default' => 'none');
- $options['group_type'] = array('default' => 'group');
- $options['ui_name'] = array('default' => '');
- return $options;
- }
-
- function ui_name($short = FALSE) {
- if (!empty($this->options['ui_name'])) {
- $title = check_plain($this->options['ui_name']);
- return $title;
- }
- $title = ($short && isset($this->definition['title short'])) ? $this->definition['title short'] : $this->definition['title'];
- return t('!group: !title', array('!group' => $this->definition['group'], '!title' => $title));
- }
-
- function get_field($field = NULL) {
- if (!isset($field)) {
- if (!empty($this->formula)) {
- $field = $this->get_formula();
- }
- else {
- $field = $this->table_alias . '.' . $this->real_field;
- }
- }
-
- if ($this->view->display_handler->use_group_by()) {
- $this->view->init_query();
- if ($this->query) {
- $info = $this->query->get_aggregation_info();
- if (!empty($info[$this->options['group_type']]['method']) && function_exists($info[$this->options['group_type']]['method'])) {
- return $info[$this->options['group_type']]['method']($this->options['group_type'], $field);
- }
- }
- }
- return $field;
- }
-
- function sanitize_value($value, $type = NULL) {
- switch ($type) {
- case 'xss':
- $value = filter_xss($value);
- break;
- case 'xss_admin':
- $value = filter_xss_admin($value);
- break;
- case 'url':
- $value = check_url($value);
- break;
- default:
- $value = check_plain($value);
- break;
- }
- return $value;
- }
-
- function case_transform($string, $option) {
- global $multibyte;
- switch ($option) {
- default:
- return $string;
- case 'upper':
- return drupal_strtoupper($string);
- case 'lower':
- return drupal_strtolower($string);
- case 'ucfirst':
- return drupal_strtoupper(drupal_substr($string, 0, 1)) . drupal_substr($string, 1);
- case 'ucwords':
- if ($multibyte == UNICODE_MULTIBYTE) {
- return mb_convert_case($string, MB_CASE_TITLE);
- }
- else {
- return ucwords($string);
- }
- }
- }
-
- function options_validate(&$form, &$form_state) { }
-
- function options_form(&$form, &$form_state) {
-
-
-
-
- $form['#pre_render'][] = 'views_ui_pre_render_add_fieldset_markup';
- $form['ui_name'] = array(
- '#type' => 'textfield',
- '#title' => t('Administrative title'),
- '#description' => t('This title will be displayed on the views edit page instead of the default one. This might be useful if you have the same item twice.'),
- '#default_value' => $this->options['ui_name'],
- '#fieldset' => 'more',
- );
-
-
- $form['more'] = array(
- '#type' => 'fieldset',
- '#title' => t('More'),
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#weight' => 150,
- );
-
- drupal_alter('views_handler_options', $this->options, $view);
- }
-
- function options_submit(&$form, &$form_state) { }
-
- function use_group_by() {
- return TRUE;
- }
-
- function groupby_form(&$form, &$form_state) {
- $view = &$form_state['view'];
- $display_id = $form_state['display_id'];
- $types = views_object_types();
- $type = $form_state['type'];
- $id = $form_state['id'];
- $form['#title'] = check_plain($view->display[$display_id]->display_title) . ': ';
- $form['#title'] .= t('Configure aggregation settings for @type %item', array('@type' => $types[$type]['lstitle'], '%item' => $this->ui_name()));
- $form['#section'] = $display_id . '-' . $type . '-' . $id;
- $view->init_query();
- $info = $view->query->get_aggregation_info();
- foreach ($info as $id => $aggregate) {
- $group_types[$id] = $aggregate['title'];
- }
- $form['group_type'] = array(
- '#type' => 'select',
- '#title' => t('Aggregation type'),
- '#default_value' => $this->options['group_type'],
- '#description' => t('Select the aggregation function to use on this field.'),
- '#options' => $group_types,
- );
- }
-
- function groupby_form_submit(&$form, &$form_state) {
- $item =& $form_state['handler']->options;
- $item['group_type'] = $form_state['values']['options']['group_type'];
- }
-
- function has_extra_options() { return FALSE; }
-
- function extra_options(&$option) { }
-
- function extra_options_form(&$form, &$form_state) { }
-
- function extra_options_validate($form, &$form_state) { }
-
- function extra_options_submit($form, &$form_state) { }
-
- function can_expose() { return FALSE; }
-
- function expose_options() { }
-
- function exposed_info() { }
-
- function exposed_form(&$form, &$form_state) { }
-
- function exposed_validate(&$form, &$form_state) { }
-
- function exposed_submit(&$form, &$form_state) { }
-
- function expose_form(&$form, &$form_state) { }
-
- function expose_validate($form, &$form_state) { }
-
- function expose_submit($form, &$form_state) { }
-
- function show_expose_button(&$form, &$form_state) { }
-
- function show_expose_form(&$form, &$form_state) {
- if (empty($this->options['exposed'])) {
- return;
- }
- $this->expose_form($form, $form_state);
-
-
-
-
- if (!empty($form_state['force_expose_options'])) {
- foreach (element_children($form['expose']) as $id) {
- if (isset($form['expose'][$id]['#default_value']) && !isset($form['expose'][$id]['#value'])) {
- $form['expose'][$id]['#value'] = $form['expose'][$id]['#default_value'];
- }
- }
- }
- }
-
- function access() {
- if (isset($this->definition['access callback']) && function_exists($this->definition['access callback'])) {
- if (isset($this->definition['access arguments']) && is_array($this->definition['access arguments'])) {
- return call_user_func_array($this->definition['access callback'], $this->definition['access arguments']);
- }
- return $this->definition['access callback']();
- }
- return TRUE;
- }
-
- function pre_query() { }
-
- function post_execute(&$values) { }
-
- function placeholder() {
- return $this->query->placeholder($this->options['table'] . '_' . $this->options['field']);
- }
-
- function set_relationship() {
-
- $this->relationship = NULL;
-
- if (empty($this->options['relationship']) || $this->options['relationship'] == 'none') {
- return;
- }
- $relationship = $this->options['relationship'];
-
- if (empty($this->view->relationship[$relationship])) {
- return;
- }
-
-
- if (empty($this->view->relationship[$relationship]->alias)) {
- return;
- }
-
- $this->relationship = $this->view->relationship[$relationship]->alias;
- }
-
- function ensure_my_table() {
- if (!isset($this->table_alias)) {
- if (!method_exists($this->query, 'ensure_table')) {
- vpr(t('Ensure my table called but query has no ensure_table method.'));
- return;
- }
- $this->table_alias = $this->query->ensure_table($this->table, $this->relationship);
- }
- return $this->table_alias;
- }
-
- function admin_summary() { }
-
- function needs_style_plugin() { return FALSE; }
-
- function is_exposed() {
- return !empty($this->options['exposed']);
- }
-
- function is_a_group() { return FALSE; }
-
- function multiple_exposed_input() { return FALSE; }
-
- function accept_exposed_input($input) { return TRUE; }
-
- function store_exposed_input($input, $status) { return TRUE; }
-
- function get_join() {
-
-
- if (empty($this->query->relationships[$this->relationship])) {
- $base_table = $this->query->base_table;
- }
- else {
- $base_table = $this->query->relationships[$this->relationship]['base'];
- }
- $join = views_get_table_join($this->table, $base_table);
- if ($join) {
- return clone $join;
- }
- }
-
- function validate() { return array(); }
-
- function broken() { }
- }
- class views_many_to_one_helper {
-
- public $placeholders = array();
- function views_many_to_one_helper(&$handler) {
- $this->handler = &$handler;
- }
- static function option_definition(&$options) {
- $options['reduce_duplicates'] = array('default' => FALSE, 'bool' => TRUE);
- }
- function options_form(&$form, &$form_state) {
- $form['reduce_duplicates'] = array(
- '#type' => 'checkbox',
- '#title' => t('Reduce duplicates'),
- '#description' => t('This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution. Shouldn\'t be set on single-value fields, as it may cause values to disappear from display, if used on an incompatible field.'),
- '#default_value' => !empty($this->handler->options['reduce_duplicates']),
- '#weight' => 4,
- );
- }
-
- function get_field() {
- if (!empty($this->formula)) {
- return $this->handler->get_formula();
- }
- else {
- return $this->handler->table_alias . '.' . $this->handler->real_field;
- }
- }
-
- function add_table($join = NULL, $alias = NULL) {
-
- $field = $this->handler->relationship . '_' . $this->handler->table . '.' . $this->handler->field;
- if (empty($join)) {
- $join = $this->get_join();
- }
-
-
- $relationship = $this->handler->relationship;
-
- if (empty($this->handler->query->relationships[$relationship])) {
- $base_table = $this->handler->query->base_table;
- }
- else {
- $base_table = $this->handler->query->relationships[$relationship]['base'];
- }
-
-
- $r_join = clone $join;
- while ($r_join->left_table != $base_table) {
- $r_join = views_get_table_join($r_join->left_table, $base_table);
- }
-
- if ($r_join->table != $join->table) {
- $relationship = $this->handler->query->add_relationship($this->handler->table . '_' . $r_join->table, $r_join, $r_join->table, $this->handler->relationship);
- }
-
- $alias = $this->handler->query->add_table($this->handler->table, $relationship, $join, $alias);
-
-
- if (empty($this->handler->view->many_to_one_tables[$field])) {
- $this->handler->view->many_to_one_tables[$field] = $this->handler->value;
- }
- else {
- $this->handler->view->many_to_one_tables[$field] = array_merge($this->handler->view->many_to_one_tables[$field], $this->handler->value);
- }
- return $alias;
- }
- function get_join() {
- return $this->handler->get_join();
- }
-
- function summary_join() {
- $field = $this->handler->relationship . '_' . $this->handler->table . '.' . $this->handler->field;
- $join = $this->get_join();
-
- $options = $this->handler->options;
- $view = &$this->handler->view;
- $query = &$this->handler->query;
- if (!empty($options['require_value'])) {
- $join->type = 'INNER';
- }
- if (empty($options['add_table']) || empty($view->many_to_one_tables[$field])) {
- return $query->ensure_table($this->handler->table, $this->handler->relationship, $join);
- }
- else {
- if (!empty($view->many_to_one_tables[$field])) {
- foreach ($view->many_to_one_tables[$field] as $value) {
- $join->extra = array(
- array(
- 'field' => $this->handler->real_field,
- 'operator' => '!=',
- 'value' => $value,
- 'numeric' => !empty($this->definition['numeric']),
- ),
- );
- }
- }
- return $this->add_table($join);
- }
- }
-
- function ensure_my_table() {
- if (!isset($this->handler->table_alias)) {
-
-
- $field = $this->handler->relationship . '_' . $this->handler->table . '.' . $this->handler->field;
- if ($this->handler->operator == 'or' && empty($this->handler->options['reduce_duplicates'])) {
- if (empty($this->handler->options['add_table']) && empty($this->handler->view->many_to_one_tables[$field])) {
-
-
- $join = $this->get_join();
- if (isset($join)) {
- $join->type = 'INNER';
- }
- $this->handler->table_alias = $this->handler->query->ensure_table($this->handler->table, $this->handler->relationship, $join);
- $this->handler->view->many_to_one_tables[$field] = $this->handler->value;
- }
- else {
- $join = $this->get_join();
- $join->type = 'LEFT';
- if (!empty($this->handler->view->many_to_one_tables[$field])) {
- foreach ($this->handler->view->many_to_one_tables[$field] as $value) {
- $join->extra = array(
- array(
- 'field' => $this->handler->real_field,
- 'operator' => '!=',
- 'value' => $value,
- 'numeric' => !empty($this->handler->definition['numeric']),
- ),
- );
- }
- }
- $this->handler->table_alias = $this->add_table($join);
- }
- return $this->handler->table_alias;
- }
-
-
- if ($this->handler->operator != 'not') {
-
- $this->handler->table_aliases = array();
- foreach ($this->handler->value as $value) {
- $join = $this->get_join();
- if ($this->handler->operator == 'and') {
- $join->type = 'INNER';
- }
- $join->extra = array(
- array(
- 'field' => $this->handler->real_field,
- 'value' => $value,
- 'numeric' => !empty($this->handler->definition['numeric']),
- ),
- );
-
-
- if (!isset($this->handler->view->many_to_one_aliases[$field][$value])) {
- if (!isset($this->handler->view->many_to_one_count[$this->handler->table])) {
- $this->handler->view->many_to_one_count[$this->handler->table] = 0;
- }
- $this->handler->view->many_to_one_aliases[$field][$value] = $this->handler->table . '_value_' . ($this->handler->view->many_to_one_count[$this->handler->table]++);
- }
- $alias = $this->handler->table_aliases[$value] = $this->add_table($join, $this->handler->view->many_to_one_aliases[$field][$value]);
-
- if (empty($this->handler->table_alias)) {
- $this->handler->table_alias = $alias;
- }
- }
- }
-
-
-
- else {
- $join = $this->get_join();
- $join->type = 'LEFT';
- $join->extra = array();
- $join->extra_type = 'OR';
- foreach ($this->handler->value as $value) {
- $join->extra[] = array(
- 'field' => $this->handler->real_field,
- 'value' => $value,
- 'numeric' => !empty($this->handler->definition['numeric']),
- );
- }
- $this->handler->table_alias = $this->add_table($join);
- }
- }
- return $this->handler->table_alias;
- }
-
- function placeholder() {
- return $this->handler->query->placeholder($this->handler->options['table'] . '_' . $this->handler->options['field']);
- }
- function add_filter() {
- if (empty($this->handler->value)) {
- return;
- }
- $this->handler->ensure_my_table();
-
- $field = $this->get_field();
- $options = $this->handler->options;
- $operator = $this->handler->operator;
- $formula = !empty($this->formula);
- $value = $this->handler->value;
- if (empty($options['group'])) {
- $options['group'] = 0;
- }
-
-
- $add_condition = TRUE;
- if ($operator == 'not') {
- $value = NULL;
- $operator = 'IS NULL';
- $add_condition = FALSE;
- }
- elseif ($operator == 'or' && empty($options['reduce_duplicates'])) {
- if (count($value) > 1) {
- $operator = 'IN';
- }
- else {
- $value = is_array($value) ? array_pop($value) : $value;
- $operator = '=';
- }
- $add_condition = FALSE;
- }
- if (!$add_condition) {
- if ($formula) {
- $placeholder = $this->placeholder();
- if ($operator == 'IN') {
- $operator = "$operator IN($placeholder)";
- }
- else {
- $operator = "$operator $placeholder";
- }
- $placeholders = array(
- $placeholder => $value,
- ) + $this->placeholders;
- $this->handler->query->add_where_expression($options['group'], "$field $operator", $placeholders);
- }
- else {
- $this->handler->query->add_where($options['group'], $field, $value, $operator);
- }
- }
- if ($add_condition) {
- $field = $this->handler->real_field;
- $clause = $operator == 'or' ? db_or() : db_and();
- foreach ($this->handler->table_aliases as $value => $alias) {
- $clause->condition("$alias.$field", $value);
- }
-
- $this->handler->query->add_where($options['group'], $clause);
- }
- }
- }
- function views_break_phrase_string($str, &$handler = NULL) {
- if (!$handler) {
- $handler = new stdClass();
- }
-
- if (!isset($handler->value)) {
- $handler->value = array();
- }
- if (!isset($handler->operator)) {
- $handler->operator = 'or';
- }
- if ($str == '') {
- return $handler;
- }
-
-
-
-
- $or_wildcard = '[^\s+,]';
- $and_wildcard = '[^+,]';
- if (preg_match("/^({$or_wildcard}+[+ ])+{$or_wildcard}+$/", $str)) {
- $handler->operator = 'or';
- $handler->value = preg_split('/[+ ]/', $str);
- }
- elseif (preg_match("/^({$and_wildcard}+,)*{$and_wildcard}+$/", $str)) {
- $handler->operator = 'and';
- $handler->value = explode(',', $str);
- }
-
- if (!empty($str) && (empty($handler->value) || !is_array($handler->value))) {
- $handler->value = array(-1);
- return $handler;
- }
-
- foreach ($handler->value as $id => $value) {
- $handler->value[$id] = (string) $value;
- }
- return $handler;
- }
- function views_break_phrase($str, &$handler = NULL) {
- if (!$handler) {
- $handler = new stdClass();
- }
-
- if (!isset($handler->value)) {
- $handler->value = array();
- }
- if (!isset($handler->operator)) {
- $handler->operator = 'or';
- }
- if (empty($str)) {
- return $handler;
- }
- if (preg_match('/^([0-9]+[+ ])+[0-9]+$/', $str)) {
-
- $handler->operator = 'or';
- $handler->value = preg_split('/[+ ]/', $str);
- }
- elseif (preg_match('/^([0-9]+,)*[0-9]+$/', $str)) {
- $handler->operator = 'and';
- $handler->value = explode(',', $str);
- }
-
- if (!empty($str) && (empty($handler->value) || !is_array($handler->value))) {
- $handler->value = array(-1);
- return $handler;
- }
-
- foreach ($handler->value as $id => $value) {
- $handler->value[$id] = intval($value);
- }
- return $handler;
- }
- function views_get_timezone() {
- global $user;
- if (variable_get('configurable_timezones', 1) && $user->uid && strlen($user->timezone)) {
- $timezone = $user->timezone;
- }
- else {
- $timezone = variable_get('date_default_timezone', 0);
- }
-
- $db_type = Database::getConnection()->databaseType();
- if (in_array($db_type, array('mysql', 'pgsql'))) {
- $offset = '+00:00';
- static $already_set = FALSE;
- if (!$already_set) {
- if ($db_type == 'pgsql') {
- db_query("SET TIME ZONE INTERVAL '$offset' HOUR TO MINUTE");
- }
- elseif ($db_type == 'mysql') {
- db_query("SET @@session.time_zone = '$offset'");
- }
- $already_set = true;
- }
- }
- return $timezone;
- }
- function views_date_sql_field($field, $field_type = 'int', $set_offset = NULL) {
- $db_type = Database::getConnection()->databaseType();
- $offset = $set_offset !== NULL ? $set_offset : views_get_timezone();
- if (isset($offset) && !is_numeric($offset)) {
- $dtz = new DateTimeZone($offset);
- $dt = new DateTime("now", $dtz);
- $offset_seconds = $dtz->getOffset($dt);
- }
- switch ($db_type) {
- case 'mysql':
- switch ($field_type) {
- case 'int':
- $field = "DATE_ADD('19700101', INTERVAL $field SECOND)";
- break;
- case 'datetime':
- break;
- }
- if (!empty($offset)) {
- $field = "($field + INTERVAL $offset_seconds SECOND)";
- }
- return $field;
- case 'pgsql':
- switch ($field_type) {
- case 'int':
- $field = "TO_TIMESTAMP($field)";
- break;
- case 'datetime':
- break;
- }
- if (!empty($offset)) {
- $field = "($field + INTERVAL '$offset_seconds SECONDS')";
- }
- return $field;
- case 'sqlite':
- if (!empty($offset)) {
- $field = "($field + '$offset_seconds')";
- }
- return $field;
- }
- }
- function views_date_sql_format($format, $field, $field_type = 'int', $set_offset = NULL) {
- $db_type = Database::getConnection()->databaseType();
- $field = views_date_sql_field($field, $field_type, $set_offset);
- switch ($db_type) {
- case 'mysql':
- $replace = array(
- 'Y' => '%Y',
- 'y' => '%y',
- 'M' => '%b',
- 'm' => '%m',
- 'n' => '%c',
- 'F' => '%M',
- 'D' => '%a',
- 'd' => '%d',
- 'l' => '%W',
- 'j' => '%e',
- 'W' => '%v',
- 'H' => '%H',
- 'h' => '%h',
- 'i' => '%i',
- 's' => '%s',
- 'A' => '%p',
- );
- $format = strtr($format, $replace);
- return "DATE_FORMAT($field, '$format')";
- case 'pgsql':
- $replace = array(
- 'Y' => 'YYYY',
- 'y' => 'YY',
- 'M' => 'Mon',
- 'm' => 'MM',
- 'n' => 'MM',
- 'F' => 'Month',
- 'D' => 'Dy',
- 'd' => 'DD',
- 'l' => 'Day',
- 'j' => 'DD',
- 'W' => 'WW',
- 'H' => 'HH24',
- 'h' => 'HH12',
- 'i' => 'MI',
- 's' => 'SS',
- 'A' => 'AM',
- );
- $format = strtr($format, $replace);
- return "TO_CHAR($field, '$format')";
- case 'sqlite':
- $replace = array(
- 'Y' => '%Y',
- 'y' => '%Y',
- 'M' => '%m',
- 'm' => '%m',
- 'n' => '%m',
- 'F' => '%m',
- 'D' => '%d',
- 'd' => '%d',
- 'l' => '%d',
- 'j' => '%d',
- 'W' => '%W',
- 'H' => '%H',
- 'h' => '%H',
- 'i' => '%M',
- 's' => '%S',
- 'A' => '',
- );
- $format = strtr($format, $replace);
- return "strftime('$format', $field, 'unixepoch')";
- }
- }
- function views_date_sql_extract($extract_type, $field, $field_type = 'int', $set_offset = NULL) {
- $db_type = Database::getConnection()->databaseType();
- $field = views_date_sql_field($field, $field_type, $set_offset);
-
-
- switch ($extract_type) {
- case('DATE'):
- return $field;
- case('YEAR'):
- return "EXTRACT(YEAR FROM($field))";
- case('MONTH'):
- return "EXTRACT(MONTH FROM($field))";
- case('DAY'):
- return "EXTRACT(DAY FROM($field))";
- case('HOUR'):
- return "EXTRACT(HOUR FROM($field))";
- case('MINUTE'):
- return "EXTRACT(MINUTE FROM($field))";
- case('SECOND'):
- return "EXTRACT(SECOND FROM($field))";
- case('WEEK'):
- switch ($db_type) {
- case('mysql'):
-
- return "WEEK($field, 3)";
- case('pgsql'):
- return "EXTRACT(WEEK FROM($field))";
- }
- case('DOW'):
- switch ($db_type) {
- case('mysql'):
-
-
- return "INTEGER(DAYOFWEEK($field) - 1)";
- case('pgsql'):
- return "EXTRACT(DOW FROM($field))";
- }
- case('DOY'):
- switch ($db_type) {
- case('mysql'):
- return "DAYOFYEAR($field)";
- case('pgsql'):
- return "EXTRACT(DOY FROM($field))";
- }
- }
- }
- class views_join {
- var $table = NULL;
- var $left_table = NULL;
- var $left_field = NULL;
- var $field = NULL;
- var $extra = NULL;
- var $type = NULL;
- var $definition = array();
-
- function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT') {
- $this->extra_type = 'AND';
- if (!empty($table)) {
- $this->table = $table;
- $this->left_table = $left_table;
- $this->left_field = $left_field;
- $this->field = $field;
- $this->extra = $extra;
- $this->type = strtoupper($type);
- }
- elseif (!empty($this->definition)) {
-
-
- $this->table = $this->definition['table'];
- $this->left_table = $this->definition['left_table'];
- $this->left_field = $this->definition['left_field'];
- $this->field = $this->definition['field'];
- if (!empty($this->definition['extra'])) {
- $this->extra = $this->definition['extra'];
- }
- if (!empty($this->definition['extra type'])) {
- $this->extra_type = strtoupper($this->definition['extra type']);
- }
- $this->type = !empty($this->definition['type']) ? strtoupper($this->definition['type']) : 'LEFT';
- }
- }
-
- function build_join($select_query, $table, $view_query) {
- if (empty($this->definition['table formula'])) {
- $right_table = $this->table;
- }
- else {
- $right_table = $this->definition['table formula'];
- }
- if ($this->left_table) {
- $left = $view_query->get_table_info($this->left_table);
- $left_field = "$left[alias].$this->left_field";
- }
- else {
-
- $left_field = $this->left_field;
- }
- $condition = "$left_field = $table[alias].$this->field";
- $arguments = array();
-
- if (isset($this->extra)) {
- if (is_array($this->extra)) {
- $extras = array();
- foreach ($this->extra as $info) {
- $extra = '';
-
-
- $join_table = '';
- if (!array_key_exists('table', $info)) {
- $join_table = $table['alias'] . '.';
- }
- elseif (isset($info['table'])) {
-
-
- if (isset($left) && $left['table'] == $info['table']) {
- $join_table = $left['alias'] . '.';
- }
- else {
- $join_table = $info['table'] . '.';
- }
- }
-
-
- if (is_array($info['value']) && count($info['value']) == 1) {
- if (empty($info['operator'])) {
- $operator = '=';
- }
- else {
- $operator = $info['operator'] == 'NOT IN' ? '!=' : '=';
- }
- $info['value'] = array_shift($info['value']);
- }
- if (is_array($info['value'])) {
-
-
- foreach ($info['value'] as $value) {
- $placeholder_i = ':views_join_condition_' . $select_query->nextPlaceholder();
- $arguments[$placeholder_i] = $value;
- }
- $operator = !empty($info['operator']) ? $info['operator'] : 'IN';
- $placeholder = '( ' . implode(', ', array_keys($arguments)) . ' )';
- }
- else {
-
- $operator = !empty($info['operator']) ? $info['operator'] : '=';
- $placeholder = ':views_join_condition_' . $select_query->nextPlaceholder();
- $arguments[$placeholder] = $info['value'];
- }
- $extras[] = "$join_table$info[field] $operator $placeholder";
- }
- if ($extras) {
- if (count($extras) == 1) {
- $condition .= ' AND ' . array_shift($extras);
- }
- else {
- $condition .= ' AND (' . implode(' ' . $this->extra_type . ' ', $extras) . ')';
- }
- }
- }
- elseif ($this->extra && is_string($this->extra)) {
- $condition .= " AND ($this->extra)";
- }
- }
- $select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
- }
- }
- class views_join_subquery extends views_join {
- function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT') {
- parent::construct($table, $left_table, $left_field, $field, $extra, $type);
- $this->left_query = $this->definition['left_query'];
- }
-
- function build_join($select_query, $table, $view_query) {
- if (empty($this->definition['table formula'])) {
- $right_table = "{" . $this->table . "}";
- }
- else {
- $right_table = $this->definition['table formula'];
- }
-
- $condition = "($this->left_query) = $table[alias].$this->field";
- $arguments = array();
-
-
- if (isset($this->extra)) {
- if (is_array($this->extra)) {
- $extras = array();
- foreach ($this->extra as $info) {
- $extra = '';
-
-
- $join_table = '';
- if (!array_key_exists('table', $info)) {
- $join_table = $table['alias'] . '.';
- }
- elseif (isset($info['table'])) {
- $join_table = $info['table'] . '.';
- }
- $placeholder = ':views_join_condition_' . $select_query->nextPlaceholder();
- if (is_array($info['value'])) {
- $operator = !empty($info['operator']) ? $info['operator'] : 'IN';
-
- if (count($info['value']) == 1) {
- $info['value'] = array_shift($info['value']);
- $operator = $operator == 'NOT IN' ? '!=' : '=';
- }
- }
- else {
- $operator = !empty($info['operator']) ? $info['operator'] : '=';
- }
- $extras[] = "$join_table$info[field] $operator $placeholder";
- $arguments[$placeholder] = $info['value'];
- }
- if ($extras) {
- if (count($extras) == 1) {
- $condition .= ' AND ' . array_shift($extras);
- }
- else {
- $condition .= ' AND (' . implode(' ' . $this->extra_type . ' ', $extras) . ')';
- }
- }
- }
- elseif ($this->extra && is_string($this->extra)) {
- $condition .= " AND ($this->extra)";
- }
- }
- $select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
- }
- }
|