検索結果: タグ「drupal」

Voting APIのビューで「You have an error in your SQL syntax」エラー

2009年6月21日 07:58 » オープンソース

DrupalのVoting APIモジュールで提供されるビューを使っていたら、急に

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC, DESC LIMIT 0, 5' at line 1 query: SELECT node.nid, value, node.title AS node_title, node.changed AS node_changed, votingapi_cache_vote_percent_average.value AS votingapi_cache_vote_percent_average_value FROM node node ORDER BY DESC, DESC LIMIT 0, 5

のようなエラーが出てビューが消えてしまう問題に遭遇した。
SQL文を見るとわかる通り、直接の問題はORDER BYにカラム名が抜けてしまっていること。

ビューの管理画面に行ってみると、該当のビューの「並び替え」フィールド名がここでもやはり空白になってしまっていた。

voting apiのビューのフィールド情報はvotingapi_views.incに入っている。(具体的には、votingapi_views_tablesという関数で定義されている。)

このファイルはvotingapi.moduleの中で、

function votingapi_init() {
  if (module_exists('views')) {
    require_once(drupal_get_path('module', 'votingapi') .'/votingapi_views.inc');
  }
}

と、votingapi_init関数の中で読み込まれる仕組みだ。

では、ビューの管理画面で選択できるフィールドはどうやって取得されているのだろう?
ビュー管理画面のコードであるviews_ui.moduleを見ると、フィールドの取得にはviews_cache.incの_views_get_fields関数が呼び出され、この関数はさらに_views_get_tables関数を呼び出していることがわかった。
で、この_views_get_tablesの中に

$table_data = module_invoke_all('views_tables');

という行があり、今有効になっている全てのモジュールのviews_tablesフック関数(xxx_views_tables)が実行される。

ということは、ここで先ほど出てきたvotingapi_views_tablesが実行されれば、voting apiのフィールドが正常に取得されるはず。

さて、この時点でvotingapi_views_tablesが実行されるためには、当然これ以前にvotingapi_views_tablesが存在していなければならない。

votingapi_views_tablesが存在するためには、votingapi_views.incが読み込まれなければならないので、つまりvotingapi_init関数がすでに実行されていなければならないことになる。

というわけで、実行される順番が

votingapi_views.incの読み込み(votingapi_init関数の実行) → _views_get_tables関数

であればOKで、逆にこの順番が守られていなかったらvotingapiのビューのフィールドが正常に取得されない。

そこで、votingapi_views.incを呼び出す文をvotingapi_init関数の外に記述してみた。

if (module_exists('views')) {
  require_once(drupal_get_path('module', 'votingapi') .'/votingapi_views.inc');
}

...

function votingapi_init() {
}

すると、votingapi.moduleファイルが読み込まれた時点でvotingapi_views.incファイルも読み込まれるようになる。
.moduleファイルの読み込まれる順番はモジュールの「ウェイト」でコントロールされていて、votingapiはデフォルトで0、viewsは10であるためvotingapiが先に実行される。

修正した結果

votingapi_views.incの読み込み(votingapi.moduleの読み込み) → _views_get_tables関数

となり、ビューのキャッシュをクリアしたら見事にVoting APIビューが復活した。

Ads

アーカイブ

ページの上部へ