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 :
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 . P>
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. P>
+1 que ce n'est pas dans Vues2. ceci-> Query-> Où [$ groupe] ['Type'] = 'ou'; code> ne fonctionne pas et $ ceci-> Query-> GROUP_OPERATOR = 'ou'; code> convertit tous les opérateurs entre les clauses à ou. Très frustrant.
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)
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) code>, qui est opposé à ce que nous recherchons: (filtre 1 et Filtre 2) ou (filtre 3 et filtre 4) code>.
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à. P>
+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"?
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++;
}
}
}
Dans une seconde cependant à cela, il y a aussi la requête Alter pour la vue - je vais essayer cet itinéraire. Briandfending.com/content/.../a>
La requête Alter est ce que @vodde fait référence à «sale», nous essayons de modifier les clauses de requête via un appel d'API de visualisation.
Serait bien de spécifier des versions Drupal et Views.