カスタムモジュールでhook_views_pre_execute()
を使用して、Views UIによって作成されたクエリを完全に上書きしようとしています。私は新しいデータベースAPIとこの関数がどのようにSelectQueryオブジェクトを期待するかについて知っていますが、(Lullabotからの投稿で、合法だと思います)単一のクエリを作成するだけで、条件付きで何かを行うには、それをスキップして、生のSQLでdb_query()
を使用するだけで十分です。
これが私の関数です-drupal_set_message()
行は実行中ですが、ビューの出力は昇順でソートされます。これはビューUIで設定されたものです。私の理解では、この関数はUIの内容を完全に上書きするはずだったので、どうやって機能させるのですか? (現時点では、SQLを使用して、機能するかどうかを確認するために順序を変更する以外に、ファンキーなことは何もしていません。実際に、ビューUIの代わりにモジュールを使用することを正当化する必要のある他の作業があります。)
function group_speaker_carousel_views_pre_execute(&$view){
if ($view->name == 'speakers_carousel') {
drupal_set_message("view is {$view->name}");
db_query("SELECT DISTINCT node.title AS node_title, node.nid AS nid, field_speaker_node.title AS field_speaker_node_title, field_speaker_node.nid AS field_speaker_node_nid, 'node' AS field_data_field_job_title_node_entity_type, 'node' AS field_data_field_company_node_entity_type
}
FROM {node} node
LEFT JOIN {field_data_field_speaker} field_data_field_speaker ON node.nid = field_data_field_speaker.field_speaker_target_id
LEFT JOIN {node} field_speaker_node ON field_data_field_speaker.entity_id = field_speaker_node.nid
WHERE (((node.status = '1') AND (node.type IN ('speaker'))))
ORDER BY field_speaker_node_title DESC");
}
}
何も変わらない理由は、あなたがrunningdb_query()
であり、実際には何にも割り当てていないためです。メモリが機能する場合は、新しいクエリを_$view->build_info['query']
_に割り当てる必要があります(ただし、Drupal 6の場合)。
また、Viewsはdb_select()
オブジェクトを想定しているため、残念ながら、これにはVanilla _db_query
_を使用できません(私の知る限り)。
次の2つのステートメントを実行すると、これをかなり簡単にテストできます。
_// Breaks the view.
$view->build_info['query'] = db_query('SELECT nid FROM {node}');
// Does not break the query (but results are wrong obviously).
$view->build_info['query'] = db_select('node', '')->fields('n', array('nid'));
_
クエリを動的db_select()
に作り直してから、上記の例のように割り当てると、もっと楽しくなるはずです。