1 typecho插件Digg
搭建typecho時,在官網下載了一個插件Digg是一個頂踩插件,安裝好後在後臺可以激活並配置,但是前臺沒變化。這是怎麼回事?
開始以爲時自己配置不對,反反覆覆了插件使用教程沒搞明白怎麼回事,於是懷疑代碼有問題,去看了插件編寫教程,HelloWord。詳細在這裏。
1. 插件分析
插件功能,是爲了實現用戶登錄後,在後臺菜單導航欄輸出歡迎話語,所以我們要做的,就是找找後臺菜單文件,是否有提供到此類功能的插件接口。一般來說,用哪個接口來實現功能,是要看我們要寫的插件,用到哪一方面的功能,或者實現哪些效果來判斷,再到對應的文件去尋找。很幸運,我們在 /admin/menu.php 中找到了以下接口,大概在第7行左右:
<?php Typecho_Plugin::factory('admin/menu.php')->navBar(); ?>
這就是我們要在激活插件裏要寫入的接口代碼。插件接口,常以下面的兩種方式出現:
Typecho_Plugin::factory()->function();
$this->pluginHandle()->function();
我們找好接口代碼後,下面便開始編寫我們的插件代碼。
2. 編寫代碼
平常編寫代碼的順序,基本按照默認辦法出現的順序來編寫。所以,我們先開始寫激活接口代碼:
public static function activate()
{
Typecho_Plugin::factory('admin/menu.php')->navBar = array('HelloWorld_Plugin', 'render');
}
在插件得activate函數裏會讓程序得一個插件函數調用自己插件裏得函數render。
但是Digg插件裏得activate函數除了操作數據庫外沒有其他得代碼,這怎麼影響到前臺的顯示了。繼續看代碼。Digg裏有一個output函數
/**
* 輸出方法
*
* @access public
* @return void or array
*/
public static function output($return = false, $dump = false)
{
//防止未激活插件輸出錯誤信息,可註釋掉
$all = Typecho_Plugin::export();
if (!array_key_exists('Digg', $all['activated'])) {
return;
}
//獲取相關設置
$setting = Helper::options()->plugin('Digg');
$items = explode('|', $setting->items);
$items_echo = explode('|', $setting->items_echo);
if (count($items) != count($items_echo) || empty($items[0])) {
echo "插件項目配置錯誤";
return;
}
//digg 提交地址
$post_url = Typecho_Common::url('action/Digg', Helper::options()->index);
//digg 表情地址
$img_url = Helper::options()->pluginUrl . '/Digg/img/';
//獲取日誌digg數據
$db = Typecho_Db::get();
$cid = Typecho_Widget::widget('Widget_Archive')->cid;
$rows = $db->fetchAll($db->select('item', 'count')->from('table.digg')->where('cid = ?', $cid));
$result = array();
$result['items'] = @array_combine($items, $items_echo);
$result['imgurl'] = $img_url;
$result['cid'] = $cid;
$result['count'] = 0;
foreach ($rows as $k => $v) {
if (isset($result['items'][$v['item']])) {
$result['count'] += $v['count'];
$result[0][$v['item']] = $v;
}
}
//print_r($result);
unset($rows);
//輸出js及css
echo $setting->src;
/* 用法1 <?php Digg_Plugin::output(); ?> 按插件自定義格式輸出 也可自己修改輸出格式*/
if (!$return) {
echo "<div id=\"digg\" class=\"clearfix\">";
foreach ($items as $k => $v) {
echo '<a href="javascript:digg(\'' . $v . '\',\'' . $cid . '\');" id="digg-' .$v. '">';
echo $result['items'][$v];
echo '(<span id="' . 'digg-' . $v . '-num">' . (isset($result[0][$v]) ? $result[0][$v]['count'] : 0 ) . '</span>)</a>';
}
echo '</div>';
return;
}
/* 用法2 <?php Digg_Plugin::output(true); ?> 將digg數據以數組形式返回,自定義html結構 可外加參數true查看返回數據*/
if ($dump) var_dump($result); //var_dump
return $result;
}
裏面註釋了用法1和用法2。這才明白過來,使用用法1
<?php Digg_Plugin::output(); ?>
放到前臺得模板頁面裏,如下圖
這樣前臺首頁的每個文章就有頂踩功能了。