[Résolu] hook_views_query_alter + views_join + extra

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

savez-vous comment on peut facilement altérer une requête générée par views pour y ajouter une jointure sur une table qui aurait plusieurs conditions de jointure ?

J'ai besoin d'arriver à un INNER JOIN qui corresponde à ça :
INNER JOIN {field_data_field_album_image_on_wall} field_data_field_album_image_on_wall ON field_data_field_album_images_coll.entity_id = field_data_field_album_image_on_wall.entity_id AND field_data_field_album_image_on_wall.field_album_image_on_wall_value = 1 AND field_data_field_album_image_on_wall.delta = field_data_field_album_images_coll.delta

Je tente de faire cette jointure avec le hook_views_query_alter mais il semble que la documentation de views_join ne soit pas à jour...

extra: An array of extra conditions on the join. Each condition is either a string that's directly added, or an array of items

J'ai essayé avec des conditions sous forme de chaînes de caractères :

<?php
/*
 * Implementation of hook_views_query_alter()
 */
function MON_MODULE_views_query_alter(&$view, &$query) {
  if (
$view->human_name == 'MA_VUE' && $view->current_display == 'MON_AFFICHAGE') {
   
$join = new views_join();
   
$join->type  = 'INNER';
   
$join->table = 'field_data_field_album_image_on_wall';
   
$join->field = 'entity_id';
   
$join->left_table = 'field_data_field_album_images_coll';
   
$join->left_field = 'entity_id';
   
// Following is not working as expected
   
$join->extra = array(
     
"field_data_field_album_image_on_wall.field_album_image_on_wall_value = 1",
     
"field_data_field_album_image_on_wall.delta = field_data_field_album_images_coll.delta",
    );
   
$query->add_relationship('field_data_field_album_image_on_wall', $join, 'node', null);
  }
}
?>

mais ça me génère ça :
INNER JOIN {field_data_field_album_image_on_wall} field_data_field_album_image_on_wall ON field_data_field_album_images_coll.entity_id = field_data_field_album_image_on_wall.entity_id AND (field_data_field_album_image_on_wall.f = 'f'  field_data_field_album_image_on_wall.f = 'f')
Donc j'ai bien 2 conditions, mais elles ne correspondent pas à ce que j'attends ; elles sont tronqués et il manque un AND entre chacune.

Du coup j'ai testé avec un tableau d'items :

<?php
/*
 * Implementation of hook_views_query_alter()
 */
function MON_MODULE_views_query_alter(&$view, &$query) {
  if (
$view->human_name == 'MA_VUE' && $view->current_display == 'MON_AFFICHAGE') {
   
$join = new views_join();
   
$join->type  = 'INNER';
   
$join->table = 'field_data_field_album_image_on_wall';
   
$join->field = 'entity_id';
   
$join->left_table = 'field_data_field_album_images_coll';
   
$join->left_field = 'entity_id';
   
   
// Following is not working as expected
   
$join->extra = array(
      array(
       
'table' => 'field_data_field_album_image_on_wall',
       
'field' => 'field_album_image_on_wall_value',
       
'value' => 1,
       
'numeric' => 1,
       
'extra type' => 'AND',
      ),
      array(
       
'table' => 'field_data_field_album_image_on_wall',
       
'field' => 'delta',
       
'value' => 'field_data_field_album_images_coll.delta',
       
'numeric' => 1,
       
'extra type' => 'AND',
      ),
    );
   
$query->add_relationship('field_data_field_album_image_on_wall', $join, 'node', null);
  }
}
?>

ce qui me génère :
INNER JOIN {field_data_field_album_image_on_wall} field_data_field_album_image_on_wall ON field_data_field_album_images_coll.entity_id = field_data_field_album_image_on_wall.entity_id AND (field_data_field_album_image_on_wall.field_album_image_on_wall_value = '1'  field_data_field_album_image_on_wall.delta = 'field_data_field_album_images_coll.delta')
Bon là on est pas trop mal mais il manque toujours mon AND entre les 2 conditions et le problème maintenant ce sont ces foutues apostrophes autour de mes valeurs même en spécifiant numeric = 1 contrairement à ce que dit la doc...

numeric: If true, the value will not be surrounded in quotes.

Est-ce que quelqu'un a une solution simple pour arriver à faire ceci ?

Merci pour votre précieuse aide !

Forum : 
Version de Drupal : 
Tags :