Views 3 rimuove il filtro esposto a livello di codice


9

Ho diversi tipi di nodi, ognuno dei quali fa riferimento a diversi termini di tassonomia del vocabolario. Per la categoria che mostra uso il modulo taxonomy_display.

Ad esempio, abbiamo due categorie: stecche e palle da biliardo.

Stecche ha prezzo da, prezzo a e filtri di tipo legno. Ma le palle non hanno un filtro di tipo legno.

Quindi devo rimuovere il filtro del tipo di legno se taxonomy_term tid si riferiva al vocabolario delle palle da biliardo.

Pertanto, devo rimuovere uno dei tanti filtri esposti a livello di codice.

function modulename_views_pre_view(&$view, &$display_id, &$args) {
  // Some custom logic wich field_info_instances checking ...
  $filter_field = 'filter_id';
  // Removes from everywhere where i can find filter or filters properties
  unset($view->display[$view->current_display]->display_options['filters'][$filter_field]);
  unset($view->display[$view->current_display]->handler->options['filters'][$filter_field]);
  unset($view->display_handler->display->display_options['filters'][$filter_field]);
  unset($view->display_handler->options['filters'][$filter_field]);
}

Il campo filtro viene rimosso correttamente, ma ho un avviso php:

  Notice: Undefined index: field_wood_reference_tid in function views_handler_filter_term_node_tid->exposed_validate()

Inoltre provo a rimuovere il campo in hook_pre_execute (), ma con lo stesso risultato:

function modulename_views_pre_execute(&$view) {
  $filter_field = 'filter_id';
  unset($view->display_handler->handlers['filter'][$filter_field]);
  unset($view->filter[$filter_field]);
}

Prova anche con il metodo override_option () come qui - http://groups.drupal.org/node/82219 , ma nessun risultato.

Eventuali suggerimenti? Aiuto per favore =)


Grazie a tutti per la risposta, ma non ho ancora una risposta. Forse qualcosa non è chiaro? = (


Hai provato hook_views_pre_render () ? Puoi anche mostrare / nascondere i filtri pertinenti in base alla selezione con jQuery.
enzipher,

Ciao, capisco che la tua soluzione funziona bene, ma non esiste il modo giusto . Quindi posso nasconderlo usando anche le condizioni CSS ... Sto cercando di spiegare. Ogni tipo di codice dovrebbe essere collocato dove dovrebbe essere. Per questo problema, se nascondo il filtro esposto prima o dopo il rendering, le viste lo elaborano comunque. E se provo ad aggiungere una stringa di query, smt like ?filter_id=val, le viste restituiscono un display vuoto o un errore di scelta illegale ...
Oleg Sherbakov

Hai provato la mia risposta?
Mathankumar,

Non ho bisogno di modificare la forma (so che la tua variante funziona), voglio modificare l'oggetto view con un risultato simile al tuo, ma prima delle build del modulo.
Oleg Sherbakov,

Risposte:



1

Ecco lo snippet testato che ti consentirà di rimuovere i filtri dalle viste esposte utilizzando il modulo alter come menzionato da Scott Thomas,

/**
 *Implements hook_form_FORM_ID_alter().
 */
function hook_form_views_exposed_form_alter(&$form, &$form_state) {
  $filter_field = 'filter_id';
  // Get the filters list for the current view. Here page_1 is the display ID.
  $filters = $form_state['view']->get_items('filter', 'page_1');
  if (isset($filters[$filter_field])) {
    $info_key = 'filter-' . $filter_field;
    unset($form[$filter_field], $form['#info'][$info_key]);
  }     
}

Oltre a rimuovere il campo del modulo, è necessario rimuovere anche le informazioni per un filtro particolare disponibile in $ form ['# info'], in modo da rimuovere anche l'etichetta. Se rimuovi solo l'elemento del modulo, l'etichetta del filtro verrà visualizzata anche se il campo è stato rimosso, quindi assicurati sempre di rimuovere anche queste informazioni.

Modificalo in base alle tue necessità. Se vuoi eseguire questo per una vista particolare, aggiungi una condizione anche per quello,

if ($form_state['view']->name == 'view_name') {
  // DO your operation.
}

Qui $ form_state ['view'] ti darà l'oggetto vista corrente che è in fase di elaborazione.

Spero che sia di aiuto.


Questa è stata l'unica soluzione che mi ha nascosto le etichette e i widget di campo, e ha funzionato in una forma di filtro esposto in un blocco.
xenofilo

1

Seguire i passaggi seguenti

  1. Innanzitutto scrivi un hook_form_alter in un modulo personalizzato
  2. Quindi prova il seguente pezzo di codice

    unset ($ form [ '# info'] [ 'your_field_name']); $ form ['your_field_name'] ['# access'] = 'FALSE';

Spero che aiuti.


1

Puoi rimuovere il filtro esposto anche usando il file modello.

Usa questo comando:

cp sites/all/modules/contrib/views/theme/views-view.tpl.php sites/all/themes/costa/templates/views/views-view--<machine_name>.tpl.php

Nel file modello trova questo codice:

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

E rimuovilo. Il filtro esposto verrà rimosso dalla visualizzazione, ma continuerà a funzionare passando argomenti appropriati nell'URL.


Grazie per la risposta, ma aspetto D8 che utilizza l'API del modulo principale per la creazione di filtri esposti :)
Oleg Sherbakov,

0

Correggimi se sbaglio perché non sono sicuro di comprendere appieno il tuo problema. Quindi desideri nascondere un filtro esposto in una vista in base al valore di un altro filtro esposto? In tal caso, puoi provare il modulo Filtri dipendenti di Views . L'ho usato più volte e fa il lavoro.

Puoi controllare la recensione del nostro demone Lullabot su questo modulo.

Se hai davvero bisogno di farlo nel codice, l'opzione Exposed dovrebbe funzionare: filter [$ filter_id] -> options ['Exposed]] = FALSE;


Vorrei nascondere il filtro esposto se il tipo di contenuto corrente non ha questo campo (filtrato). Provando il tuo frammento $view->display_handler->handlers['filter'][$filter_field]->options['exposed'] = FALSE;ho un errore fatale - PHP Fatal error: Call to undefined method stdClass::access() in .../view.inc on line 766. Penso che il suo comportamento corretto perché se il filtro non è esposto, richiede anche un valore predefinito. Qualche idea?
Oleg Sherbakov l'

pastebin.com/f1FKgUde qui è il mio codice, forse sarà più chiaro del mio inglese
Oleg Sherbakov

0

Quanto segue è stato per me all'interno di hook_form_alter:

$info_key = 'filter-' . $fieldName;
unset($form[$fieldName], $form['#info'][$info_key], $form_state['view']->display_handler->options['filters'][$fieldName], $form_state['view']->display_handler->handlers['filter'][$fieldName], $form_state['view']->filter[$fieldName]);

0

Metodo 1

Utilizzando hook_views_query_alter (). Vedi il seguente esempio:

<?php
/**
 * Implements hook_views_query_alter().
 */
function foo_views_query_alter(&$view, &$query) {

  if ($view->name == 'foo_view') {

    // Allow any distance when the postcode it is not specified.
    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') { 
      // Scan through the query.
      foreach ($query->where as $condition_group_key => &$condition_group) {
        foreach ($condition_group['conditions'] as $condition_key => &$condition) {
          $search_name = '(COALESCE(ACOS(';
          if (is_string($condition['field']) && strstr($condition['field'], $search_name) !== FALSE) {
            // Remove filter from the query.
            unset($query->where[$condition_group_key]['conditions'][$condition_key]);
          }
        } // end: foreach
      } // end: foreach
    } // end: if


    /*
     * Change the field conditions.
     * Possible field values: 1, 2, 3
     * Logic: When 3 is selected, then display 1, 2 and 3.
     */
    switch (@$view->display_handler->handlers['filter']['field_123_value']->value[0]) {

      case 3:
        foreach ($query->where as $condition_group_key => &$condition_group) {
          foreach ($condition_group['conditions'] as $condition_key => &$condition) {
            if($condition['field'] == 'field_data_field_123.field_123_value') {
              unset($query->where[$condition_group_key]['conditions'][$condition_key]);
              $query->where[] = array(
                  'conditions' => array(
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 1,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 2,
                          'operator' => "=",
                      ),
                      array(
                          'field' => 'field_data_field_123.field_123_value',
                          'value' => 3,
                          'operator' => "=",
                      ),
                  ),
                  'args' => array(),
                  'type' => 'OR',
              );
            }
          }
        } // end: foreach
        break;

    } // end: switch

  } // end: if
}

Metodo 2

Guarda l'esempio usando hook_views_pre_execute e la funzione personalizzata che cerca di trovare la giusta condizione del campo e restituire il riferimento ad essa:

/**
 * Implements hook_views_pre_execute().
 */
function foo_views_pre_execute(&$view) {

  if ($view->name == 'foo_view') {


    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'field_data_field_123.field_123_value',
      $filter
    );

    // We want our filter to work as a bit mask.
    $filter[0]['operator'] = '&';

    unset ($filter);

    // Example of finding Proximity filter condition
    $search_name = '(COALESCE(ACOS(';

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      $search_name,
      $filter
    );

    if (empty($_GET['postcode']['postal_code']) || $_GET['postcode']['postal_code'] === 'All') {
      // Allowing any distance.
      $filter[0]['value'][':distance'] = 10000000;
    }
    else {
      $filter[0]['value'][':distance'] = 80000;
    }

    unset ($filter);


    // Fetching single record?

    foo_get_view_filter_recursively(
      $view,
      $view->build_info['query']->conditions(),
      'node.nid',
      $filter
    );

    if (!empty($_GET['nid'])) {
      $filter[0]['value'] = (int) $_GET['nid'];
    }
    else {
      $filter[0]['operator'] = '<>';
    }

    unset ($filter);                                                        

    // echo '<pre style="font-size:11px;font-family: Monaco">'; print_r($view->build_info['query']); exit;
  }
}

/**
 * Custom function to find the field condition within the view
 */
function foo_get_view_filter_recursively($view, &$conditions, $field_name, &$filter) {

  if (!empty($conditions)) {

    foreach ($conditions as &$condition) {
      if ($condition instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } else if ($condition['field'] instanceof DatabaseCondition) {
        if (foo_get_view_filter_recursively($view, $condition['field']->conditions(), $field_name, $filter)) {
          return TRUE;
        }
      } elseif (is_string($condition['field']) && strstr($condition['field'], $field_name) !== FALSE) {
        @$filter = array(&$condition);
        return TRUE;
      }
    } // end: foreach

  } // end: if

  return FALSE;
}

0

Lo sto rimuovendo dai file modello. Sostituisci views-view.tpl.php e rimuovi da esso il seguente codice:

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

0

Penso che l'operazione fosse sulla buona strada. Ho avuto una situazione simile senza filtri esposti, quindi non ho potuto utilizzare il metodo hook_form_alter. Ecco un esempio di codice per chiunque si imbatta in questo:

$view->set_item($view->current_display, 'filter', $filter_id, null);

L'oggetto view non ha una remove_itemfunzione ma indica semplicemente nel codice che è possibile impostarlo su null per rimuovere un elemento inclusi i filtri: views/includes/view.incon line 2526.

Ecco un esempio completo per chiunque abbia come target una vista e un display specifici:

/**
 * Implements HOOK_views_pre_view().
 */
function HOOK_views_pre_view(&$view) {
  if($view->name == 'VIEW_MACHINE_NAME') {
    switch($view->current_display) {
      case 'VIEW_DISPLAY_MACHINE_NAME':
        $view_filters = $view->display_handler->get_option('filters');
        foreach ($view_filters as $filter_id => $filter) {
          if ($filter_id == 'my_filter') {
            $view->set_item($view->current_display, 'filter', $filter_id, null);
          }
        }
      break;
    }
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.