Nucleusにプラグインを色々インストールしていると挙動がおかしくなったということはありませんか? またそのプラグイン変数を呼び出すスキンを変更すると挙動がおかしくなったり、同じスキンでもプラグイン変数を呼び出す場所によっておかしくなったりすることはありませんか?
私の場合、NP_MostViewedとNP_Newsfeedがそうでした。
NP_MostViewedの場合、これを使用していると「個別アイテムページ」を呼び出したときに別のitemidのページが表示されてしまいました。URLで確認しても正しいitemidですし、「メインの目次ページ」や「月別アーカイブページ」から呼び出すのでは無く、URLを直接入力しても同じでした。
NP_Newsfeedの場合は、テスト用のblogidでは正常に表示されるのに、それを通常のblogidで表示すると、サイトのタイトルだけ表示されて記事一覧が表示されません。しかしスキンを変更すると表示されたりします。
この2つの原因がなかなか分からずほぼあきらめていたのですが、最近になって、ようやく原因が分かりました。それがタイトルに記入していますグローバル変数です。
グローバル変数は関数の外でも参照や変更ができる変数なのですが、これがプラグイン内だけでなくプラグイン外すなわちNucleus全体でも参照や変更ができてしまいます。しかしプラグイン内でしか想定していないようなグローバル変数の使い方をしている例もときどき見受けられ、これがNucleusの挙動をおかしくしているようです。
最初に挙げた例でいいますと、NP_MostViewedの場合はNucleusでグローバル変数として定義している変数をワーク用に使用していて、その値を変更してしまっています。$itemidがそれで、これは文字通りアイテムのIDを表すグローバル変数です。しかしながら、NP_MostViewdでは、ランキングの表示時のループ時に使用する一時的な変数としてこの$itemidを使用しています。
したがって、ループの最後のidすなわちランキングの最後のidが$itemidにセットされ、これが要求と違うidが表示される原因になっているかと思われます。実際、ループ中で$itemidを使わず、$row->idのままで計算させると、別のitemidのページが表示されるといった現象は起こらなくなりました。
2つ目のNP_Newsfeedの場合は、Nucleusのグローバル変数でなく、他のプログラムで使用しているグローバル変数と衝突してしまっているために起こった不具合でした。このプラグインではRSSを解析する関数を色々定義しておりその関数を何度も呼び出しているのですが、その中でワーク用として当たり前のように使用される$iをグローバル変数として定義していまっています。これが他のプログラムでもグローバル変数として使用してしまっているようで、そのために不具合が起こってしまっています。
$iの値を見たところBBCloneが衝突してしまっているようなのですが、BBCloneのどこと衝突しているかまでは確認しておりません。BBCloneはNucleus用のプラグインでも何でもありませんが、Nucleus中のindex.phpで呼び出しているため、同一のスコープとなってしまったようです。
NP_Newsfeed中の$iの変数名を変更してやることで不具合は起こらなくなりました。
とりあえず気づいたのは上の例の2つだけですが、気づいていないだけでまだまだ問題が潜在しているかもしれません。プラグイン開発者が他のプラグインのグローバル変数まで確認することは不可能なので、何らかのルールなりガイドラインなりが必要なのでは無いでしょうか。
私の場合、NP_MostViewedとNP_Newsfeedがそうでした。
NP_MostViewedの場合、これを使用していると「個別アイテムページ」を呼び出したときに別のitemidのページが表示されてしまいました。URLで確認しても正しいitemidですし、「メインの目次ページ」や「月別アーカイブページ」から呼び出すのでは無く、URLを直接入力しても同じでした。
NP_Newsfeedの場合は、テスト用のblogidでは正常に表示されるのに、それを通常のblogidで表示すると、サイトのタイトルだけ表示されて記事一覧が表示されません。しかしスキンを変更すると表示されたりします。
この2つの原因がなかなか分からずほぼあきらめていたのですが、最近になって、ようやく原因が分かりました。それがタイトルに記入していますグローバル変数です。
グローバル変数は関数の外でも参照や変更ができる変数なのですが、これがプラグイン内だけでなくプラグイン外すなわちNucleus全体でも参照や変更ができてしまいます。しかしプラグイン内でしか想定していないようなグローバル変数の使い方をしている例もときどき見受けられ、これがNucleusの挙動をおかしくしているようです。
NP_MostViewedの場合
最初に挙げた例でいいますと、NP_MostViewedの場合はNucleusでグローバル変数として定義している変数をワーク用に使用していて、その値を変更してしまっています。$itemidがそれで、これは文字通りアイテムのIDを表すグローバル変数です。しかしながら、NP_MostViewdでは、ランキングの表示時のループ時に使用する一時的な変数としてこの$itemidを使用しています。
while($row = mysql_fetch_object($res)) {
$itemid = $row->id;
$query = "SELECT ititle FROM " . sql_table('item') . " WHERE inumber = $itemid";
$res2 = mysql_query($query);
$itemid = $row->id;
$query = "SELECT ititle FROM " . sql_table('item') . " WHERE inumber = $itemid";
$res2 = mysql_query($query);
したがって、ループの最後のidすなわちランキングの最後のidが$itemidにセットされ、これが要求と違うidが表示される原因になっているかと思われます。実際、ループ中で$itemidを使わず、$row->idのままで計算させると、別のitemidのページが表示されるといった現象は起こらなくなりました。
NP_Newsfeedの場合
2つ目のNP_Newsfeedの場合は、Nucleusのグローバル変数でなく、他のプログラムで使用しているグローバル変数と衝突してしまっているために起こった不具合でした。このプラグインではRSSを解析する関数を色々定義しておりその関数を何度も呼び出しているのですが、その中でワーク用として当たり前のように使用される$iをグローバル変数として定義していまっています。これが他のプログラムでもグローバル変数として使用してしまっているようで、そのために不具合が起こってしまっています。
$iの値を見たところBBCloneが衝突してしまっているようなのですが、BBCloneのどこと衝突しているかまでは確認しておりません。BBCloneはNucleus用のプラグインでも何でもありませんが、Nucleus中のindex.phpで呼び出しているため、同一のスコープとなってしまったようです。
NP_Newsfeed中の$iの変数名を変更してやることで不具合は起こらなくなりました。
とりあえず気づいたのは上の例の2つだけですが、気づいていないだけでまだまだ問題が潜在しているかもしれません。プラグイン開発者が他のプラグインのグローバル変数まで確認することは不可能なので、何らかのルールなりガイドラインなりが必要なのでは無いでしょうか。
No comments yet
Add Comments
Trackbacks
Trackback URL
グローバル変数とプラグイン Nucleus(ニュークリアス)ファン pinged on 2006-02-12
無料SEO対策日記さんのグローバル変数にご注意
NP_MostViewedとNP_Newsfeedの具体例が掲載されています。
NP_NewsFeedを入れてみる きままなBLOG pinged on 2005-03-08
もう一つのBLOG「今日の一枚」と、このBLOGの更新状況を相互表示したくて、NP_NewsFeedを入れて見ることにしました。
ダウンロードサイトから最新バージョン0.95を入手して、インストール。
mediaディレクトリの下...
|
最高気温33℃