1
0
mirror of https://github.com/typecho/typecho.git synced 2025-03-20 09:59:41 +01:00

Add CommentPage widget

This commit is contained in:
joyqi 2022-04-07 12:55:19 +08:00
parent 22a8ad362e
commit a74206a89e
5 changed files with 76 additions and 70 deletions

@ -205,8 +205,8 @@ function install_get_default_routers(): array
'comment_page' =>
[
'url' => '[permalink:string]/comment-page-[commentPage:digital]',
'widget' => '\Widget\Archive',
'action' => 'render',
'widget' => '\Widget\CommentPage',
'action' => 'action',
],
'feed' =>
[

@ -15,7 +15,6 @@ class Router
/**
* 当前路由名称
*
* @access public
* @var string
*/
public static $current;
@ -23,24 +22,34 @@ class Router
/**
* 已经解析完毕的路由表配置
*
* @access private
* @var mixed
* @var array
*/
private static $routingTable = [];
/**
* 解析路径
* 是否已经匹配过,防止递归匹配
*
* @access public
* @var bool
*/
private static $matched = false;
/**
* 解析路径
*
* @param string|null $pathInfo 全路径
* @param mixed $parameter 输入参数
*
* @param bool $once 是否只匹配一次
* @return false|Widget
* @throws \Exception
*/
public static function match(?string $pathInfo, $parameter = null)
public static function match(?string $pathInfo, $parameter = null, bool $once = true)
{
if ($once && self::$matched) {
throw new RouterException("Path '{$pathInfo}' not found", 404);
}
self::$matched = true;
foreach (self::$routingTable as $key => $route) {
if (preg_match($route['regx'], $pathInfo, $matches)) {
self::$current = $key;
@ -122,7 +131,6 @@ class Router
* @param string $name 路由配置表名称
* @param array|null $value 路由填充值
* @param string|null $prefix 最终合成路径的前缀
*
* @return string
*/
public static function url(string $name, ?array $value = null, ?string $prefix = null): string
@ -141,10 +149,7 @@ class Router
/**
* 设置路由器默认配置
*
* @access public
*
* @param mixed $routes 配置信息
*
* @return void
*/
public static function setRoutes($routes)
@ -162,9 +167,6 @@ class Router
* 获取路由信息
*
* @param string $routeName 路由名称
*
* @static
* @access public
* @return mixed
*/
public static function get(string $routeName)

@ -187,7 +187,8 @@ class Archive extends Contents
'pageSize' => $this->options->pageSize,
'type' => null,
'checkPermalink' => true,
'preview' => false
'preview' => false,
'commentPage' => 0
]);
/** 用于判断是路由调用还是外部调用 */
@ -512,7 +513,6 @@ class Archive extends Contents
'page' => 'singleHandle',
'post' => 'singleHandle',
'attachment' => 'singleHandle',
'comment_page' => 'singleHandle',
'category' => 'categoryHandle',
'category_page' => 'categoryHandle',
'tag' => 'tagHandle',
@ -794,7 +794,7 @@ class Archive extends Contents
'parentId' => $this->hidden ? 0 : $this->cid,
'parentContent' => $this->row,
'respondId' => $this->respondId,
'commentPage' => $this->request->filter('int')->commentPage,
'commentPage' => $this->parameter->commentPage,
'allowComment' => $this->allow('comment')
];
@ -1358,41 +1358,6 @@ class Archive extends Contents
return $commentUrl;
}
/**
* 导入对象
*
* @param Archive $widget 需要导入的对象
*/
private function import(Archive $widget)
{
$currentProperties = get_object_vars($this);
foreach ($currentProperties as $name => $value) {
if (false !== strpos('|request|response|parameter|feed|feedType|currentFeedUrl|', '|' . $name . '|')) {
continue;
}
if (isset($widget->{$name})) {
$this->{$name} = $widget->{$name};
} else {
$method = ucfirst($name);
$setMethod = 'set' . $method;
$getMethod = 'get' . $method;
if (
method_exists($this, $setMethod)
&& method_exists($widget, $getMethod)
) {
$value = $widget->{$getMethod}();
if ($value !== null) {
$this->{$setMethod}($widget->{$getMethod}());
}
}
}
}
}
/**
* 检查链接是否正确
*
@ -1404,7 +1369,7 @@ class Archive extends Contents
$type = $this->parameter->type;
if (
in_array($type, ['index', 'comment_page', 404])
in_array($type, ['index', 404])
|| $this->makeSinglePageAsFrontPage // 自定义首页不处理
|| !$this->parameter->checkPermalink
) { // 强制关闭
@ -1500,17 +1465,6 @@ class Archive extends Contents
*/
private function singleHandle(Query $select, bool &$hasPushed)
{
if ('comment_page' == $this->parameter->type) {
$params = [];
$matched = Router::match($this->request->permalink);
if ($matched && $matched instanceof Archive && $matched->is('single')) {
$this->import($matched);
$hasPushed = true;
return;
}
}
/** 将这两个设置提前是为了保证在调用query的plugin时可以在插件中使用is判断初步归档类型 */
/** 如果需要更细判断则可以使用singleHandle来实现 */
$this->archiveSingle = true;

@ -0,0 +1,50 @@
<?php
namespace Widget;
use Exception;
use Typecho\Router;
use Typecho\Widget\Exception as WidgetException;
/**
* Comment Page Widget
*/
class CommentPage extends Base implements ActionInterface
{
/**
* Perform comment page action
*
* @throws Exception
*/
public function action()
{
$page = abs($this->request->filter('int')->get('commentPage'));
$archive = Router::match($this->request->permalink, [
'checkPermalink' => false,
'commentPage' => $page
]);
if (!($archive instanceof Archive) || !$archive->is('single')) {
throw new WidgetException(_t('请求的地址不存在'), 404);
}
$currentCommentUrl = Router::url('comment_page', [
'permalink' => $archive->pathinfo,
'commentPage' => $page
], $this->options->index);
$this->checkPermalink($currentCommentUrl);
$archive->render();
}
/**
* @param string $commentUrl
*/
private function checkPermalink(string $commentUrl)
{
if ($commentUrl != $this->request->getRequestUrl()) {
$this->response->redirect($commentUrl, true);
}
}
}

@ -181,7 +181,7 @@ class XmlRpc extends Contents implements ActionInterface, Hook
'link' => $page->permalink,
'permaLink' => $page->permalink,
'categories' => $page->categories,
'excerpt' => $page->description,
'excerpt' => $page->plainExcerpt,
'text_more' => $more,
'mt_allow_comments' => intval($page->allowComment),
'mt_allow_pings' => intval($page->allowPing),
@ -287,7 +287,7 @@ class XmlRpc extends Contents implements ActionInterface, Hook
'link' => $pages->permalink,
'permaLink' => $pages->permalink,
'categories' => $pages->categories,
'excerpt' => $pages->description,
'excerpt' => $pages->plainExcerpt,
'text_more' => $more,
'mt_allow_comments' => intval($pages->allowComment),
'mt_allow_pings' => intval($pages->allowPing),
@ -1256,7 +1256,7 @@ class XmlRpc extends Contents implements ActionInterface, Hook
'link' => $post->permalink,
'permaLink' => $post->permalink,
'categories' => $categories,
'mt_excerpt' => $post->description,
'mt_excerpt' => $post->plainExcerpt,
'mt_text_more' => $more,
'mt_allow_comments' => intval($post->allowComment),
'mt_allow_pings' => intval($post->allowPing),
@ -1306,7 +1306,7 @@ class XmlRpc extends Contents implements ActionInterface, Hook
'link' => $posts->permalink,
'permaLink' => $posts->permalink,
'categories' => $categories,
'mt_excerpt' => $posts->description,
'mt_excerpt' => $posts->plainExcerpt,
'mt_text_more' => $more,
'wp_more_text' => $more,
'mt_allow_comments' => intval($posts->allowComment),