-
Notifications
You must be signed in to change notification settings - Fork 0
/
Plugin.php
358 lines (330 loc) · 13.6 KB
/
Plugin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
<?php
/**
* 友情链接插件
*
* @package Links
* @author Hanny
* @version 1.1.2
* @dependence 14.10.10-*
* @link http://www.imhan.com
*
* 历史版本
* version 1.1.1 at 2014-12-14
* 修改支持Typecho 1.0
* 修正Typecho 1.0下不能删除的BUG
*
* version 1.1.0 at 2013-12-08
* 修改支持Typecho 0.9
* version 1.0.4 at 2010-06-30
* 修正数据表的前缀问题
* 在Pattern里加上所有的数据表字段
* version 1.0.3 at 2010-06-20
* 修改图片链接的支持方式。
* 增加链接分类功能
* 增加自定义字段,以便用户自定义扩展
* 增加多种链接输出方式。
* 增加较详细的帮助文档
* 增加在自定义页面引用标签,方便友情链接页面的引用
*
* version 1.0.2 at 2010-05-16
* 增加SQLite支持
*
* version 1.0.1 at 2009-12-27
* 增加显示链接描述
* 增加首页链接数量限制功能
* 增加图片链接功能
* version 1.0.0 at 2009-12-12
* 实现友情链接的基本功能
* 包括: 添加 删除 修改 排序
*/
class Links_Plugin implements Typecho_Plugin_Interface
{
/**
* 激活插件方法,如果激活失败,直接抛出异常
*
* @access public
* @return string
* @throws Typecho_Plugin_Exception
*/
public static function activate()
{
$info = Links_Plugin::linksInstall();
Helper::addPanel(3, 'Links/manage-links.php', '友情链接', '管理友情链接', 'administrator');
Helper::addAction('links-edit', 'Links_Action');
Typecho_Plugin::factory('Widget_Abstract_Contents')->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 = "<li><a href=\"{url}\" title=\"{title}\" target=\"_blank\">{name}</a></li>\n";
} else if ($pattern == "SHOW_IMG") {
$pattern = "<li><a href=\"{url}\" title=\"{title}\" target=\"_blank\"><img src=\"{image}\" alt=\"{name}\" /></a></li>\n";
} else if ($pattern == "SHOW_MIX") {
$pattern = "<li><a href=\"{url}\" title=\"{title}\" target=\"_blank\"><img src=\"{image}\" alt=\"{name}\" /><span>{name}</span></a></li>\n";
} else if ($pattern == 'SHOW_INDEX'){
$pattern = "<a href=\"{url}\" class=\"badge badge-secondary\" style=\"margin-right: 15px;\" target=\"_blank\" title=\"{description}\">{name}</a>";
} else if ($pattern == 'SHOW_LINKS') {
$pattern = <<<LINKS
<div class="col-md-6 col-lg-3 mb-5 mb-lg-0">
<a class="link-item-inner effect-apollo" href="{url}" target="_blank" title="{description}">
<div class="px-4">
<img src="{image}"
class="rounded-circle img-center img-fluid shadow shadow-lg--hover" style="width:80px;">
<div class="text-center">
<h5 class="title">
<span class="d-block mb-1">
{name}
</span>
</h5>
</div>
</div>
</a>
</div>
LINKS;
}
$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("/<links\s*(\d*)\s*(\w*)>\s*(.*?)\s*<\/links>/is", array('Links_Plugin', 'parseCallback'), $text);
} else {
return $text;
}
}
}