プラグイン作成のテクニック集です。plugindev:tipsandtricks (en)を基にしています。
global $blog; $currentBlogid = $blog->getID();
以上のようなコードを書くと、スキンでどのblogが選択されているか求めることができます。
複数のblogで構築されたサイトで、そのうち1つに含まれるアイテムやコメントなどが必要なときに有効です。
global $blog; $catid = $blog->getSelectedCategory();
以上のようなコードを書くと、スキンでどのカテゴリーが選択されているか求めることができます。
リクエスト変数を取得するために、Nucleusには以下のコードにあるような関数が用意されています。 $_POSTや$HTTP_POST_VARSの代わりにこれらの関数を使うことで、PHPの設定に依らずに同じデータを取得することができます。
$var = getVar('name'); // $_GET $var = postVar('name'); // $_POST $var = cookieVar('name'); // $_COOKIES $var = serverVar('name'); // $_SERVER $var = requestVar('name'); // $_REQUEST (GET、POST または COOKIE) $var = intGetVar('name'); // 基本的にgetVarと同じですが、int型に変換された値が返されます。(intvalが使われます) $var = intPostVar('name'); // intval(postVar('name'))と同等です。 $var = intRequestVar('name'); $var = intCookieVar('name');
これらの関数は、常にmagic_quotesの影響を排除した値を返します。 (magic_quotes_gpcはPHPにあるオプションの1つで、有効な場合は’が\’に自動で変換されます。) また、これらの関数はNucleusが動作するどのバージョンのPHPでも動作します(PHP 4.0.6以上)。
Nucleus内のページのURLを作成するときには以下のような関数が使用できます。
createItemLink($itemid, $params); createMemberLink($memberid, $params); createCategoryLink($catid, $params); createArchiveListLink($blogid, $params); createArchiveLink($blogid, $archive, params); createBlogLink($blogurl, $params); createBlogidLink($blogid, $params);
これらの関数ではURLモード(FancyURLかそうでないか)が考慮されます。
引数$paramsはオプションで、連想配列です。
$params = array('catid' => 5, 'highlight' => 'foo'); echo createItemLink($itemid, $params);
上のコードを実行した場合、FancyURLでは以下のような出力がなされます。
http://www.example.org/item/1234/catid/5/highlight/foo
通常の場合は以下のような出力になります。
http://www.example.org/index.php?itemid=1234&catid=5&highlight=foo
基本は
createCategoryLink($catid, array('subcatid'=>$subcatid));
ですが、次のように書いた方がより確実でしょう
global $manager; if ($manager->pluginInstalled('NP_MultipleCategories')) { $mcategory =& $manager->getPlugin('NP_MultipleCategories'); if (method_exists($mcategories, "getRequestName")) { $subrequest = $mcategories->getRequestName(); } if (!$subrequest) $subrequest = 'subcatid'; createCategoryLink($catid, array($subrequest => $subcatid); }
$blog = new BLOG($blogid)
の代わりに
global $manager; $blog =& $manager->getBlog($blogid);
や
$blog =& $manager->getBlog(getBlogIDFromName('secondBlog'));
を使用してみてください。
これらの関数を使用することで、リクエスト中に同じblogのオブジェクトが複数作られることを防ぐことができ、また、データベースから同じblogの情報が複数回読み込まれることを防ぐことができます。
$item = ITEM::getItem(1234);
の代わりに
$item =& $manager->getItem(1234);
を使ってください。
メリットはgetBlogの場合と同様です。
install()メソッドで以下のようにして新しいオプションを作ります。
$this->createOption('cleardb', 'Clear database on uninstall?', 'yesno', 'no');
そしてuninstall()メソッドを以下のようにします。
if($this->getOption('cleardb') == "yes") { sql_query( 'DROP TABLE IF EXISTS ' . sql_table($your_table_name) ); }
また、新しいテーブルを作る際はCREATE TABLE IF NOT EXISTSを使って、再インストール時の上書きを防止することも必要です。
自分自身が持っている関数以外に、他のプラグインの関数を呼び出して使用することも出来ます
次のような呼び出そうとしているプラグインがインストールされているかどうかをチェックするファンクションを作っておくと便利です
function pluginCheck($pluginName) { global $manager; if (!$manager->pluginInstalled('NP_'.$pluginName)) return; $plugin =& $manager->getPlugin('NP_'.$pluginName); return $plugin; }
以下のコードは NP_CustomURL の GoogleSitemap の処理部分です
NP_GoogleSitemap のプラグインオプションの値を取得しています
$SiteMapP = $this->pluginCheck('GoogleSitemap'); if ($SiteMapP) { $PcSitemaps = $SiteMapP->getAllBlogOptions('PcSitemap'); foreach ($PcSitemaps as $PCsitemap) { if ($PCsitemap) $feedurl[] = $PCsitemap; } $MobSitemaps = $SiteMapP->getAllBlogOptions('MobileSitemap'); foreach ($MobSitemaps as $Mobsitemap) { if ($Mobsitemap) $feedurl[] = $Mobsitemap; } }
引き続き NP_CustomURL から、トラックバック処理部分
URL からトラックバックを受けたアイテムの itemid を取得し、NP_TrackBack のファンクションに渡して、処理結果をトラックバック元にレスポンスとして返しています
function _trackback($bid, $path) { $blog_id = intval($bid); $TrackBack = $this->pluginCheck('TrackBack'); if ($TrackBack) { if (substr($path, -5, 5) == '.html') { $linkObj = array ('linkparam' => 'item', 'bid' => $blog_id, 'name' => $path); $item_id = $this->getRequestPathInfo($linkObj); if ($item_id) { $tb_id = intval($item_id); } else { doError(_NO_SUCH_URI); } } else { $tb_id = intval($path); } $errorMsg = $TrackBack->handlePing($tb_id); if ($errorMsg != '') { $TrackBack->xmlResponse($errorMsg); } else { $TrackBack->xmlResponse(); } } exit; }