contentEx = array('Links_Plugin', 'parse'); Typecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx = array('Links_Plugin', 'parse'); Typecho_Plugin::factory('Widget_Abstract_Comments')->contentEx = array('Links_Plugin', 'parse'); return _t($info); } /** * 禁用插件方法,如果禁用失败,直接抛出异常 * * @static * @access public * @return void * @throws Typecho_Plugin_Exception */ public static function deactivate() { Helper::removeAction('links-edit'); Helper::removePanel(3, 'Links/manage-links.php'); } /** * 获取插件配置面板 * * @access public * @param Typecho_Widget_Helper_Form $form 配置面板 * @return void */ public static function config(Typecho_Widget_Helper_Form $form) {} /** * 个人用户的配置面板 * * @access public * @param Typecho_Widget_Helper_Form $form * @return void */ public static function personalConfig(Typecho_Widget_Helper_Form $form) {} public static function linksInstall() { $installDb = Typecho_Db::get(); $type = explode('_', $installDb->getAdapterName()); $type = array_pop($type); $prefix = $installDb->getPrefix(); $scripts = file_get_contents('usr/plugins/Links/'.$type.'.sql'); $scripts = str_replace('typecho_', $prefix, $scripts); $scripts = str_replace('%charset%', 'utf8', $scripts); $scripts = explode(';', $scripts); try { foreach ($scripts as $script) { $script = trim($script); if ($script) { $installDb->query($script, Typecho_Db::WRITE); } } return '建立友情链接数据表,插件启用成功'; } catch (Exception $e) { print_r($e); $code = $e->getCode(); if(('Mysql' == $type || 1050 == $code) || ('SQLite' == $type && ('HY000' == $code || 1 == $code))) { try { $script = 'SELECT `lid`, `name`, `url`, `sort`, `image`, `description`, `user`, `order` from `' . $prefix . 'links`'; $installDb->query($script, Typecho_Db::READ); return '检测到友情链接数据表,友情链接插件启用成功'; } catch (Typecho_Db_Exception $e) { $code = $e->getCode(); if(('Mysql' == $type && 1054 == $code) || ('SQLite' == $type && ('HY000' == $code || 1 == $code))) { return Links_Plugin::linksUpdate($installDb, $type, $prefix); } throw new Typecho_Plugin_Exception('数据表检测失败,友情链接插件启用失败。错误号:'.$code); } } else { throw new Typecho_Plugin_Exception('数据表建立失败,友情链接插件启用失败。错误号:'.$code); } } } public static function linksUpdate($installDb, $type, $prefix) { $scripts = file_get_contents('usr/plugins/Links/Update_'.$type.'.sql'); $scripts = str_replace('typecho_', $prefix, $scripts); $scripts = str_replace('%charset%', 'utf8', $scripts); $scripts = explode(';', $scripts); try { foreach ($scripts as $script) { $script = trim($script); if ($script) { $installDb->query($script, Typecho_Db::WRITE); } } return '检测到旧版本友情链接数据表,升级成功'; } catch (Typecho_Db_Exception $e) { $code = $e->getCode(); if(('Mysql' == $type && 1060 == $code) ) { return '友情链接数据表已经存在,插件启用成功'; } throw new Typecho_Plugin_Exception('友情链接插件启用失败。错误号:'.$code); } } public static function form($action = NULL) { /** 构建表格 */ $options = Typecho_Widget::widget('Widget_Options'); $form = new Typecho_Widget_Helper_Form(Typecho_Common::url('/action/links-edit', $options->index), Typecho_Widget_Helper_Form::POST_METHOD); /** 链接名称 */ $name = new Typecho_Widget_Helper_Form_Element_Text('name', NULL, NULL, _t('链接名称*')); $form->addInput($name); /** 链接地址 */ $url = new Typecho_Widget_Helper_Form_Element_Text('url', NULL, "http://", _t('链接地址*')); $form->addInput($url); /** 链接分类 */ $sort = new Typecho_Widget_Helper_Form_Element_Text('sort', NULL, NULL, _t('链接分类'), _t('建议以英文字母开头,只包含字母与数字')); $form->addInput($sort); /** 链接图片 */ $image = new Typecho_Widget_Helper_Form_Element_Text('image', NULL, NULL, _t('链接图片'), _t('需要以http://开头,留空表示没有链接图片')); $form->addInput($image); /** 链接描述 */ $description = new Typecho_Widget_Helper_Form_Element_Textarea('description', NULL, NULL, _t('链接描述')); $form->addInput($description); /** 自定义数据 */ $user = new Typecho_Widget_Helper_Form_Element_Text('user', NULL, NULL, _t('自定义数据'), _t('该项用于用户自定义数据扩展')); $form->addInput($user); /** 链接动作 */ $do = new Typecho_Widget_Helper_Form_Element_Hidden('do'); $form->addInput($do); /** 链接主键 */ $lid = new Typecho_Widget_Helper_Form_Element_Hidden('lid'); $form->addInput($lid); /** 提交按钮 */ $submit = new Typecho_Widget_Helper_Form_Element_Submit(); $submit->input->setAttribute('class', 'btn primary'); $form->addItem($submit); $request = Typecho_Request::getInstance(); if (isset($request->lid) && 'insert' != $action) { /** 更新模式 */ $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $link = $db->fetchRow($db->select()->from($prefix.'links')->where('lid = ?', $request->lid)); if (!$link) { throw new Typecho_Widget_Exception(_t('链接不存在'), 404); } $name->value($link['name']); $url->value($link['url']); $sort->value($link['sort']); $image->value($link['image']); $description->value($link['description']); $user->value($link['user']); $do->value('update'); $lid->value($link['lid']); $submit->value(_t('编辑链接')); $_action = 'update'; } else { $do->value('insert'); $submit->value(_t('增加链接')); $_action = 'insert'; } if (empty($action)) { $action = $_action; } /** 给表单增加规则 */ if ('insert' == $action || 'update' == $action) { $name->addRule('required', _t('必须填写链接名称')); $url->addRule('required', _t('必须填写链接地址')); $url->addRule('url', _t('不是一个合法的链接地址')); $image->addRule('url', _t('不是一个合法的图片地址')); } if ('update' == $action) { $lid->addRule('required', _t('链接主键不存在')); $lid->addRule(array(new Links_Plugin, 'LinkExists'), _t('链接不存在')); } return $form; } public static function LinkExists($lid) { $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $link = $db->fetchRow($db->select()->from($prefix.'links')->where('lid = ?', $lid)->limit(1)); return $link ? true : false; } /** * 控制输出格式 */ public static function output_str($pattern=NULL, $links_num=0, $sort=NULL) { $options = Typecho_Widget::widget('Widget_Options'); if (!isset($options->plugins['activated']['Links'])) { return '友情链接插件未激活'; } if (!isset($pattern) || $pattern == "" || $pattern == NULL || $pattern == "SHOW_TEXT") { $pattern = "
  • {name}
  • \n"; } else if ($pattern == "SHOW_IMG") { $pattern = "
  • \"{name}\"
  • \n"; } else if ($pattern == "SHOW_MIX") { $pattern = "
  • \"{name}\"{name}
  • \n"; } $db = Typecho_Db::get(); $prefix = $db->getPrefix(); $options = Typecho_Widget::widget('Widget_Options'); $nopic_url = Typecho_Common::url('/usr/plugins/Links/nopic.jpg', $options->siteUrl); $sql = $db->select()->from($prefix.'links'); if (!isset($sort) || $sort == "") { $sort = NULL; } if ($sort) { $sql = $sql->where('sort=?', $sort); } $sql = $sql->order($prefix.'links.order', Typecho_Db::SORT_ASC); $links_num = intval($links_num); if ($links_num > 0) { $sql = $sql->limit($links_num); } $links = $db->fetchAll($sql); $str = ""; foreach ($links as $link) { if ($link['image'] == NULL) { $link['image'] = $nopic_url; } $str .= str_replace( array('{lid}', '{name}', '{url}', '{sort}', '{title}', '{description}', '{image}', '{user}'), array($link['lid'], $link['name'], $link['url'], $link['sort'], $link['description'], $link['description'], $link['image'], $link['user']), $pattern ); } return $str; } //输出 public static function output($pattern=NULL, $links_num=0, $sort=NULL) { echo Links_Plugin::output_str($pattern, $links_num, $sort); } /** * 解析 * * @access public * @param array $matches 解析值 * @return string */ public static function parseCallback($matches) { $db = Typecho_Db::get(); $pattern = $matches[3]; $links_num = $matches[1]; $sort = $matches[2]; return Links_Plugin::output_str($pattern, $links_num, $sort); } public static function parse($text, $widget, $lastResult) { $text = empty($lastResult) ? $text : $lastResult; if ($widget instanceof Widget_Archive || $widget instanceof Widget_Abstract_Comments) { return preg_replace_callback("/\s*(.*?)\s*<\/links>/is", array('Links_Plugin', 'parseCallback'), $text); } else { return $text; } } }