You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
14 KiB
248 lines
14 KiB
<?php |
|
if (!defined('__TYPECHO_ROOT_DIR__')) exit; |
|
/** |
|
* 评论设置 |
|
* |
|
* @category typecho |
|
* @package Widget |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
* @version $Id$ |
|
*/ |
|
|
|
/** |
|
* 评论设置组件 |
|
* |
|
* @author qining |
|
* @category typecho |
|
* @package Widget |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
*/ |
|
class Widget_Options_Discussion extends Widget_Abstract_Options implements Widget_Interface_Do |
|
{ |
|
/** |
|
* 输出表单结构 |
|
* |
|
* @access public |
|
* @return Typecho_Widget_Helper_Form |
|
*/ |
|
public function form() |
|
{ |
|
/** 构建表格 */ |
|
$form = new Typecho_Widget_Helper_Form($this->security->getIndex('/action/options-discussion'), |
|
Typecho_Widget_Helper_Form::POST_METHOD); |
|
|
|
/** 评论日期格式 */ |
|
$commentDateFormat = new Typecho_Widget_Helper_Form_Element_Text('commentDateFormat', NULL, $this->options->commentDateFormat, |
|
_t('评论日期格式'), _t('这是一个默认的格式,当你在模板中调用显示评论日期方法时, 如果没有指定日期格式, 将按照此格式输出.') . '<br />' |
|
. _t('具体写法请参考 <a href="http://www.php.net/manual/zh/function.date.php">PHP 日期格式写法</a>.')); |
|
$commentDateFormat->input->setAttribute('class', 'w-40 mono'); |
|
$form->addInput($commentDateFormat); |
|
|
|
/** 评论列表数目 */ |
|
$commentsListSize = new Typecho_Widget_Helper_Form_Element_Text('commentsListSize', NULL, $this->options->commentsListSize, |
|
_t('评论列表数目'), _t('此数目用于指定显示在侧边栏中的评论列表数目.')); |
|
$commentsListSize->input->setAttribute('class', 'w-20'); |
|
$form->addInput($commentsListSize->addRule('isInteger', _t('请填入一个数字'))); |
|
|
|
$commentsShowOptions = array( |
|
'commentsShowCommentOnly' => _t('仅显示评论, 不显示 Pingback 和 Trackback'), |
|
'commentsMarkdown' => _t('在评论中使用 Markdown 语法'), |
|
'commentsShowUrl' => _t('评论者名称显示时自动加上其个人主页链接'), |
|
'commentsUrlNofollow' => _t('对评论者个人主页链接使用 <a href="http://en.wikipedia.org/wiki/Nofollow">nofollow 属性</a>'), |
|
'commentsAvatar' => _t('启用 <a href="http://gravatar.com">Gravatar</a> 头像服务, 最高显示评级为 %s 的头像', |
|
'</label><select id="commentsShow-commentsAvatarRating" name="commentsAvatarRating"> |
|
<option value="G"' . ('G' == $this->options->commentsAvatarRating ? ' selected="true"' : '') . '>G - 普通</option> |
|
<option value="PG"' . ('PG' == $this->options->commentsAvatarRating ? ' selected="true"' : '') . '>PG - 13岁以上</option> |
|
<option value="R"' . ('R' == $this->options->commentsAvatarRating ? ' selected="true"' : '') . '>R - 17岁以上成人</option> |
|
<option value="X"' . ('X' == $this->options->commentsAvatarRating ? ' selected="true"' : '') . '>X - 限制级</option></select> |
|
<label for="commentsShow-commentsAvatarRating">'), |
|
'commentsPageBreak' => _t('启用分页, 并且每页显示 %s 篇评论, 在列出时将 %s 作为默认显示', |
|
'</label><input type="text" value="' . $this->options->commentsPageSize |
|
. '" class="text num text-s" id="commentsShow-commentsPageSize" name="commentsPageSize" /><label for="commentsShow-commentsPageSize">', |
|
'</label><select id="commentsShow-commentsPageDisplay" name="commentsPageDisplay"> |
|
<option value="first"' . ('first' == $this->options->commentsPageDisplay ? ' selected="true"' : '') . '>' . _t('第一页') . '</option> |
|
<option value="last"' . ('last' == $this->options->commentsPageDisplay ? ' selected="true"' : '') . '>' . _t('最后一页') . '</option></select>' |
|
. '<label for="commentsShow-commentsPageDisplay">'), |
|
'commentsThreaded' => _t('启用评论回复, 以 %s 层作为每个评论最多的回复层数', |
|
'</label><input name="commentsMaxNestingLevels" type="text" class="text num text-s" value="' . $this->options->commentsMaxNestingLevels . '" id="commentsShow-commentsMaxNestingLevels" /> |
|
<label for="commentsShow-commentsMaxNestingLevels">') . '</label></span><span class="multiline">' |
|
. _t('将 %s 的评论显示在前面', '<select id="commentsShow-commentsOrder" name="commentsOrder"> |
|
<option value="DESC"' . ('DESC' == $this->options->commentsOrder ? ' selected="true"' : '') . '>' . _t('较新的') . '</option> |
|
<option value="ASC"' . ('ASC' == $this->options->commentsOrder ? ' selected="true"' : '') . '>' . _t('较旧的') . '</option></select><label for="commentsShow-commentsOrder">') |
|
); |
|
|
|
$commentsShowOptionsValue = array(); |
|
if ($this->options->commentsShowCommentOnly) { |
|
$commentsShowOptionsValue[] = 'commentsShowCommentOnly'; |
|
} |
|
|
|
if ($this->options->commentsMarkdown) { |
|
$commentsShowOptionsValue[] = 'commentsMarkdown'; |
|
} |
|
|
|
if ($this->options->commentsShowUrl) { |
|
$commentsShowOptionsValue[] = 'commentsShowUrl'; |
|
} |
|
|
|
if ($this->options->commentsUrlNofollow) { |
|
$commentsShowOptionsValue[] = 'commentsUrlNofollow'; |
|
} |
|
|
|
if ($this->options->commentsAvatar) { |
|
$commentsShowOptionsValue[] = 'commentsAvatar'; |
|
} |
|
|
|
if ($this->options->commentsPageBreak) { |
|
$commentsShowOptionsValue[] = 'commentsPageBreak'; |
|
} |
|
|
|
if ($this->options->commentsThreaded) { |
|
$commentsShowOptionsValue[] = 'commentsThreaded'; |
|
} |
|
|
|
$commentsShow = new Typecho_Widget_Helper_Form_Element_Checkbox('commentsShow', $commentsShowOptions, |
|
$commentsShowOptionsValue, _t('评论显示')); |
|
$form->addInput($commentsShow->multiMode()); |
|
|
|
/** 评论提交 */ |
|
$commentsPostOptions = array( |
|
'commentsRequireModeration' => _t('所有评论必须经过审核'), |
|
'commentsWhitelist' => _t('评论者之前须有评论通过了审核'), |
|
'commentsRequireMail' => _t('必须填写邮箱'), |
|
'commentsRequireURL' => _t('必须填写网址'), |
|
'commentsCheckReferer' => _t('检查评论来源页 URL 是否与文章链接一致'), |
|
'commentsAntiSpam' => _t('开启反垃圾保护'), |
|
'commentsAutoClose' => _t('在文章发布 %s 天以后自动关闭评论', |
|
'</label><input name="commentsPostTimeout" type="text" class="text num text-s" value="' . intval($this->options->commentsPostTimeout / (24 * 3600)) . '" id="commentsPost-commentsPostTimeout" /> |
|
<label for="commentsPost-commentsPostTimeout">'), |
|
'commentsPostIntervalEnable' => _t('同一 IP 发布评论的时间间隔限制为 %s 分钟', |
|
'</label><input name="commentsPostInterval" type="text" class="text num text-s" value="' . round($this->options->commentsPostInterval / (60), 1) . '" id="commentsPost-commentsPostInterval" /> |
|
<label for="commentsPost-commentsPostInterval">') |
|
); |
|
|
|
$commentsPostOptionsValue = array(); |
|
if ($this->options->commentsRequireModeration) { |
|
$commentsPostOptionsValue[] = 'commentsRequireModeration'; |
|
} |
|
|
|
if ($this->options->commentsWhitelist) { |
|
$commentsPostOptionsValue[] = 'commentsWhitelist'; |
|
} |
|
|
|
if ($this->options->commentsRequireMail) { |
|
$commentsPostOptionsValue[] = 'commentsRequireMail'; |
|
} |
|
|
|
if ($this->options->commentsRequireURL) { |
|
$commentsPostOptionsValue[] = 'commentsRequireURL'; |
|
} |
|
|
|
if ($this->options->commentsCheckReferer) { |
|
$commentsPostOptionsValue[] = 'commentsCheckReferer'; |
|
} |
|
|
|
if ($this->options->commentsAntiSpam) { |
|
$commentsPostOptionsValue[] = 'commentsAntiSpam'; |
|
} |
|
|
|
if ($this->options->commentsAutoClose) { |
|
$commentsPostOptionsValue[] = 'commentsAutoClose'; |
|
} |
|
|
|
if ($this->options->commentsPostIntervalEnable) { |
|
$commentsPostOptionsValue[] = 'commentsPostIntervalEnable'; |
|
} |
|
|
|
$commentsPost = new Typecho_Widget_Helper_Form_Element_Checkbox('commentsPost', $commentsPostOptions, |
|
$commentsPostOptionsValue, _t('评论提交')); |
|
$form->addInput($commentsPost->multiMode()); |
|
|
|
/** 允许使用的HTML标签和属性 */ |
|
$commentsHTMLTagAllowed = new Typecho_Widget_Helper_Form_Element_Textarea('commentsHTMLTagAllowed', NULL, |
|
$this->options->commentsHTMLTagAllowed, |
|
_t('允许使用的HTML标签和属性'), _t('默认的用户评论不允许填写任何的HTML标签, 你可以在这里填写允许使用的HTML标签.') . '<br />' |
|
. _t('比如: %s', ': <code><a href=""> <img src=""> <blockquote></code>')); |
|
$commentsHTMLTagAllowed->input->setAttribute('class', 'mono'); |
|
$form->addInput($commentsHTMLTagAllowed); |
|
|
|
/** 提交按钮 */ |
|
$submit = new Typecho_Widget_Helper_Form_Element_Submit('submit', NULL, _t('保存设置')); |
|
$submit->input->setAttribute('class', 'btn primary'); |
|
$form->addItem($submit); |
|
|
|
return $form; |
|
} |
|
|
|
/** |
|
* 执行更新动作 |
|
* |
|
* @access public |
|
* @return void |
|
*/ |
|
public function updateDiscussionSettings() |
|
{ |
|
/** 验证格式 */ |
|
if ($this->form()->validate()) { |
|
$this->response->goBack(); |
|
} |
|
|
|
$settings = $this->request->from('commentDateFormat', 'commentsListSize', 'commentsPageSize', 'commentsPageDisplay', 'commentsAvatar', |
|
'commentsOrder', 'commentsMaxNestingLevels', 'commentsUrlNofollow', 'commentsPostTimeout', 'commentsUniqueIpInterval', 'commentsWhitelist', 'commentsRequireMail', 'commentsAvatarRating', |
|
'commentsPostTimeout', 'commentsPostInterval', 'commentsRequireModeration', 'commentsRequireURL', 'commentsHTMLTagAllowed', 'commentsStopWords', 'commentsIpBlackList'); |
|
$settings['commentsShow'] = $this->request->getArray('commentsShow'); |
|
$settings['commentsPost'] = $this->request->getArray('commentsPost'); |
|
|
|
$settings['commentsShowCommentOnly'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsShowCommentOnly'); |
|
$settings['commentsMarkdown'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsMarkdown'); |
|
$settings['commentsShowUrl'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsShowUrl'); |
|
$settings['commentsUrlNofollow'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsUrlNofollow'); |
|
$settings['commentsAvatar'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsAvatar'); |
|
$settings['commentsPageBreak'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsPageBreak'); |
|
$settings['commentsThreaded'] = $this->isEnableByCheckbox($settings['commentsShow'], 'commentsThreaded'); |
|
|
|
$settings['commentsPageSize'] = intval($settings['commentsPageSize']); |
|
$settings['commentsMaxNestingLevels'] = min(7, max(2, intval($settings['commentsMaxNestingLevels']))); |
|
$settings['commentsPageDisplay'] = ('first' == $settings['commentsPageDisplay']) ? 'first' : 'last'; |
|
$settings['commentsOrder'] = ('DESC' == $settings['commentsOrder']) ? 'DESC' : 'ASC'; |
|
$settings['commentsAvatarRating'] = in_array($settings['commentsAvatarRating'], array('G', 'PG', 'R', 'X')) |
|
? $settings['commentsAvatarRating'] : 'G'; |
|
|
|
$settings['commentsRequireModeration'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsRequireModeration'); |
|
$settings['commentsWhitelist'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsWhitelist'); |
|
$settings['commentsRequireMail'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsRequireMail'); |
|
$settings['commentsRequireURL'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsRequireURL'); |
|
$settings['commentsCheckReferer'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsCheckReferer'); |
|
$settings['commentsAntiSpam'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsAntiSpam'); |
|
$settings['commentsAutoClose'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsAutoClose'); |
|
$settings['commentsPostIntervalEnable'] = $this->isEnableByCheckbox($settings['commentsPost'], 'commentsPostIntervalEnable'); |
|
|
|
$settings['commentsPostTimeout'] = intval($settings['commentsPostTimeout']) * 24 * 3600; |
|
$settings['commentsPostInterval'] = round($settings['commentsPostInterval'], 1) * 60; |
|
|
|
unset($settings['commentsShow']); |
|
unset($settings['commentsPost']); |
|
|
|
foreach ($settings as $name => $value) { |
|
$this->update(array('value' => $value), $this->db->sql()->where('name = ?', $name)); |
|
} |
|
|
|
$this->widget('Widget_Notice')->set(_t("设置已经保存"), 'success'); |
|
$this->response->goBack(); |
|
} |
|
|
|
/** |
|
* 绑定动作 |
|
* |
|
* @access public |
|
* @return void |
|
*/ |
|
public function action() |
|
{ |
|
$this->user->pass('administrator'); |
|
$this->security->protect(); |
|
$this->on($this->request->isPost())->updateDiscussionSettings(); |
|
$this->response->redirect($this->options->adminUrl); |
|
} |
|
}
|
|
|