検索結果: タグ「drupal」
Voting APIのビューで「You have an error in your SQL syntax」エラー
2009年6月21日 07:58 » オープンソース
DrupalのVoting APIモジュールで提供されるビューを使っていたら、急に
のようなエラーが出てビューが消えてしまう問題に遭遇した。
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');
このファイルは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
4plus Link
Profile
Junya Sano
CTO at 4plus Inc.
B.S. degree in Computer Science at Oregon State University.
Specialty in web development, especially LAMP.

