11
votes

Ou opérateur dans les filtres de la vue Drupal

J'ai besoin de mettre en œuvre un opérateur entre certains filtres dans une vue de drupes. Par défaut, Drupal et's tous les filtres ensemble.

En utilisant P>

$query->group_operator 


4 Réponses :


7
votes

Malheureusement, cela reste une fonctionnalité manquante dans Vues2. Cela a longtemps été demandé à et a été promis il y a quelque temps, mais semble être un travail de travail délicat et est maintenant programmé pour Vues3 .

Entre-temps, vous pouvez essayer le vues ou module mentionné dans ce fil. À compter d'aujourd'hui, il est toujours dans le statut de développement, mais semble être activement maintenu et La file d'attente de problème ne regarde pas mal, alors vous voudrez peut-être y essayer.


1 commentaires

+1 que ce n'est pas dans Vues2. ceci-> Query-> Où [$ groupe] ['Type'] = 'ou'; ne fonctionne pas et $ ceci-> Query-> GROUP_OPERATOR = 'ou'; convertit tous les opérateurs entre les clauses à ou. Très frustrant.



2
votes

Si vous voulez le faire avec View_Query_alter Hook, vous devez utiliser $ Query-> Add_where () où vous pouvez spécifier si c'est et ou. Des vues / include / Query.inc

  /**
   * Add a simple WHERE clause to the query. The caller is responsible for
   * ensuring that all fields are fully qualified (TABLE.FIELD) and that
   * the table already exists in the query.
   *
   * @param $group
   *   The WHERE group to add these to; groups are used to create AND/OR
   *   sections. Groups cannot be nested. Use 0 as the default group.
   *   If the group does not yet exist it will be created as an AND group.
   * @param $clause
   *   The actual clause to add. When adding a where clause it is important
   *   that all tables are addressed by the alias provided by add_table or
   *   ensure_table and that all fields are addressed by their alias wehn
   *   possible. Please use %d and %s for arguments.
   * @param ...
   *   A number of arguments as used in db_query(). May be many args or one
   *   array full of args.
   */
  function add_where($group, $clause)


1 commentaires

Je l'ai essayé moi-même et en utilisant cette méthode aboutit à (filtre 1 ou filtre 2) et (filtre 3 ou Fliter 4) , qui est opposé à ce que nous recherchons: (filtre 1 et Filtre 2) ou (filtre 3 et filtre 4) .



12
votes

Si vous utilisez des vues 3 / Drupal 7 et que vous recherchez la réponse à cette question, il est cuit au four dans des vues. Lorsque cela indique "Ajouter" à côté des filtres, cliquez sur la liste déroulante, puis sur "et / ou; réorganiser". Il devrait être évident de là.


2 commentaires

+1 Pour cela, ça fait exactement ce dont j'avais besoin. Regardez également des groupes de terrain une fois que vous y arriverez. C'était la seule partie qui m'a pris quelques minutes pour réaliser


J'ai des vues 3, et je ne vois pas "et / ou;" juste "réorganiser"?



1
votes

Je l'ai ajouté en concaténant la chaîne.

Il est relativement spécifique à la mise en œuvre - les personnes devraient jouer avec le champ pour correspondre ou - Node.Title dans le code suivant et le champ pour la correspondre avec - Node_Revisions . Pendant ce cas. p>

pièce de code supplémentaire pour vous assurer que nœud_revisisions.body est dans la requête. P>

/**
 * Implementation of hook_views_api().
 */
function eventsor_views_api() { // your module name into hook_views_api
  return array(
  'api' => 2,
  // might not need the line below, but in any case, the last arg is the name of your module
  'path' => drupal_get_path('module', 'eventsor'),
 );
}

/**
 *
 * @param string $form
 * @param type $form_state
 * @param type $form_id 
 */
function eventsor_views_query_alter(&$view, &$query) {

  switch ($view->name) {
    case 'Events':
      _eventsor_composite_filter($query);
      break;
  }
}

/**
 * Add to the where clause.
 * @param type $query 
 */
function _eventsor_composite_filter(&$query) {
  // If we see "UPPER(node.title) LIKE UPPER('%%%s%%')" - then add and to it.
  if (isset($query->where)) {

    $where_count = 0;
    foreach ($query->where as $where) {
      $clause_count = 0;
      if (isset($where['clauses'])) {
        foreach ($where['clauses'] as $clause) {
          $search_where_clause = "UPPER(node.title) LIKE UPPER('%%%s%%')";
          // node_data_field_long_description.field_long_description_value
          $desirable_where_clause = "UPPER(CONCAT_WS(' ', node.title, node_revisions.body)) LIKE UPPER('%%%s%%')";
          if ($clause == $search_where_clause) {
            //  $query->add_where('or', 'revisions.body = %s'); - outside of what we are looking for
            $query->where[$where_count]['clauses'][$clause_count] = $desirable_where_clause;

            // Add the field to the view, just in case.
            if (!isset($query->fields['node_revisions_body'])) {
              $query->fields['node_revisions_body'] = array(
                'field' => 'body',
                'table' => 'node_revisions',
                'alias' => 'node_revisions_body'
              );
            }
          }
          $clause_count++;
        }
      }
      $where_count++;
    }
  }
}


0 commentaires