J'ai besoin de découvrir la requête SQL qui est exécutée par une certaine requête. Le module Vues peut afficher le SQL lors de la configuration de la vue mais apparemment la requête n'est pas la requête réelle qui est exécutée dans tous les cas .
Je suis conscient que le module Devel peut afficher les requêtes de base de données, mais il n'y a aucun moyen avec devel d'afficher les requêtes réelles sauf en cliquant sur le lien 'A' associé à chaque requête et il y a des centaines de eux .
Comment puis-je trouver la requête réelle que la vue exécute? La vue est affichée sous forme de bloc.
Vous devez utiliser hook_views_pre_execute et avec Devel installé utiliser dpq
pour afficher la chaîne SQL:
function hook_views_pre_execute(&$view) {
dpq($view->build_info['query']);
}
Pas besoin de patchs ou de crochets.
// Run the view.
$view = views_get_view('frontpage');
$view->set_display('page');
$view->pre_execute();
$view->execute();
/* Magic Below Here */
// Get query from the view.
$query = $view->query->query();
// Format SelectQueryInterface into a string.
$string = (string) $query;
// Replace arguments.
$arguments = $query->arguments();
if (!empty($arguments) && is_array($arguments)) {
foreach ($arguments as $placeholder => &$value) {
if (is_string($value)) {
$value = "'$value'";
}
}
$string = strtr($string, $arguments);
}
// Format the query string for more readable output.
$string = str_replace(array(' {', "\n{"), ' ', $string);
$string = str_replace(array('} ', "}\n"), ' AS ', $string);
$string = str_replace(', ', ",\n ", $string);
$string = str_replace(' AND ', "\n AND ", $string);
$string = str_replace(' ON ', "\n ON ", $string);
$string = str_replace('SELECT ', "SELECT\n ", $string);
$string = str_replace('ORDER BY ', "ORDER BY\n ", $string);
// echo $string;
echo str_replace(' ', ' ', nl2br($string));
Donne cela en sortie
SELECT
node.sticky AS node_sticky,
node.created AS node_created,
node.nid AS nid,
'frontpage:page' AS view_name
FROM node AS node
WHERE (( (node.promote <> 0)
AND (node.status = 1) ))
ORDER BY
node_sticky DESC,
node_created DESC
LIMIT 10 OFFSET 0
function hook_views_pre_execute(&$view) {
if ($view->name == 'XYZ') {
$query = (string)$view->build_info['query'];
echo $query;
}
}
Veuillez essayer ce patch:
--- a/sites/all/modules/views/plugins/views_plugin_query_default.inc
+++ b/sites/all/modules/views/plugins/views_plugin_query_default.inc
@@ -1393,6 +1393,19 @@ class views_plugin_query_default extends views_plugin_query {
$query->range($offset, $limit);
}
+ $query_string = (string)$query;
+ $query_string = str_replace('{', '', $query_string);
+ $query_string = str_replace('}', '', $query_string);
+ $query_params = $query->getArguments();
+ foreach($query_params as $placeholder => $value) {
+ if(!is_numeric($value)) {
+ $query_string = str_replace($placeholder, "'$value'", $query_string);
+ }
+ else {
+ $query_string = str_replace($placeholder, $value, $query_string);
+ }
+ }
+ drupal_set_message($query_string);
$result = $query->execute();
$view->result = array();
// Obtenez les résultats par nom de vue et filtre contextuel nid ici
$viewr = views_get_view('top_block_on_product_display');
$args[] = $myarg;
$display_id = 'default';
$viewr->set_arguments($args);
$viewr->set_display($display_id);
$viewr->execute();
$view_content = $viewr->result;
Voir le doc pour plus de référence: https://api.drupal.org/api/views/views.module/function/views_get_view_result/7.x-3.x