Skip to content

Commit 7bb76f6

Browse files
authored
Merge pull request #232 from HanashiDev/version/2.3
Version 2.3 (WSC 6.2)
2 parents b6e939a + d57db77 commit 7bb76f6

18 files changed

+421
-197
lines changed

acptemplates/faqQuestionList.tpl

Lines changed: 17 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,38 @@
11
{include file='header' pageTitle='wcf.acp.menu.link.faq.questions.list'}
22

3-
<script data-relocate="true">
4-
require(['WoltLabSuite/Core/Ui/Sortable/List'], function (UiSortableList) {
5-
new UiSortableList({
6-
containerId: 'questionList',
7-
className: 'wcf\\data\\faq\\QuestionAction',
8-
offset: {$startIndex}
9-
});
10-
});
11-
</script>
12-
133
<header class="contentHeader">
144
<div class="contentHeaderTitle">
155
<h1 class="contentTitle">{lang}wcf.acp.menu.link.faq.questions.list{/lang}</h1>
166
</div>
177

188
<nav class="contentHeaderNavigation">
199
<ul>
10+
{if $gridView->countRows() > 1}
11+
<li>
12+
<button type="button" class="button jsChangeShowOrder">{icon name='up-down'} <span>{lang}wcf.global.changeShowOrder{/lang}</span></button>
13+
</li>
14+
{/if}
2015
<li><a href="{link controller='FaqQuestionAdd'}{/link}" class="button">{icon name='plus' size=16} <span>{lang}wcf.acp.menu.link.faq.questions.add{/lang}</span></a></li>
2116

2217
{event name='contentHeaderNavigation'}
2318
</ul>
2419
</nav>
2520
</header>
2621

27-
<form method="post" action="{link controller='FaqQuestionList'}{/link}">
28-
<section class="section">
29-
<h2 class="sectionTitle">{lang}wcf.global.filter{/lang}</h2>
30-
31-
<div class="row rowColGap formGrid">
32-
<dl class="col-xs-12 col-md-4">
33-
<dt></dt>
34-
<dd>
35-
<select name="categoryID" id="categoryID">
36-
<option value="0">{lang}wcf.acp.faq.category{/lang}</option>
37-
38-
{foreach from=$categoryNodeList item=category}
39-
<option value="{$category->categoryID}"{if $category->categoryID == $categoryID} selected{/if}>{if $category->getDepth() > 1}{unsafe:"&nbsp;&nbsp;&nbsp;&nbsp;"|str_repeat:($category->getDepth() - 1)}{/if}{$category->getTitle()}</option>
40-
{/foreach}
41-
</select>
42-
</dd>
43-
</dl>
44-
45-
<dl class="col-xs-12 col-md-4">
46-
<dt></dt>
47-
<dd>
48-
<input type="text" id="question" name="question" value="{$question}" placeholder="{lang}wcf.faq.question.question.title{/lang}" class="long">
49-
</dd>
50-
</dl>
51-
52-
<dl class="col-xs-12 col-md-4">
53-
<dt></dt>
54-
<dd>
55-
<input type="text" id="answer" name="answer" value="{$answer}" placeholder="{lang}wcf.faq.question.answer.title{/lang}" class="long">
56-
</dd>
57-
</dl>
58-
59-
{event name='filterFields'}
60-
</div>
61-
62-
<div class="formSubmit">
63-
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
64-
{csrfToken}
65-
</div>
66-
</section>
67-
</form>
68-
69-
{hascontent}
70-
<div class="paginationTop">
71-
{content}
72-
{assign var='linkParameters' value=''}
73-
{if $categoryID}{capture append=linkParameters}&categoryID={$categoryID}{/capture}{/if}
74-
{if $question}{capture append=linkParameters}&question={unsafe:$question|rawurlencode}{/capture}{/if}
75-
{if $answer}{capture append=linkParameters}&answer={unsafe:$answer|rawurlencode}{/capture}{/if}
76-
77-
{pages print=true assign=pagesLinks controller="FaqQuestionList" link="pageNo=%d&sortField=$sortField&sortOrder=$sortOrder$linkParameters"}
78-
{/content}
79-
</div>
80-
{/hascontent}
81-
82-
{if $objects|count}
83-
<div class="section sortableListContainer" id="questionList">
84-
<ol class="sortableList jsObjectActionContainer jsReloadPageWhenEmpty" data-object-id="0" start="{($pageNo - 1) * $itemsPerPage + 1}" data-object-action-class-name="wcf\data\faq\QuestionAction">
85-
{foreach from=$objects item=question}
86-
<li class="sortableNode sortableNoNesting jsQuestion jsObjectActionObject" data-object-id="{$question->questionID}">
87-
<span class="sortableNodeLabel">
88-
({$question->getCategory()->getTitle()})&nbsp;
89-
<a href="{link controller='FaqQuestionEdit' object=$question}{/link}">{$question->getTitle()}</a>
22+
<div class="section">
23+
{unsafe:$gridView->render()}
24+
</div>
9025

91-
<span class="statusDisplay sortableButtonContainer">
92-
{objectAction action="toggle" isDisabled=$question->isDisabled}
93-
<a href="{link controller='FaqQuestionAdd' duplicateID=$question->questionID isMultilingual=$question->isMultilingual}{/link}" title="{lang}wcf.acp.faqQuestion.copy{/lang}" class="jsTooltip">{icon name='copy' size=16}</a>
94-
<a href="{link controller='FaqQuestionEdit' object=$question}{/link}" title="{lang}wcf.global.button.edit{/lang}" class="jsTooltip">{icon name='pencil' size=16}</a>
95-
{objectAction action="delete" objectTitle=$question->getTitle()}
96-
97-
{event name='itemButtons'}
98-
</span>
99-
</span>
100-
</li>
101-
{/foreach}
102-
</ol>
103-
</div>
104-
105-
<div class="formSubmit">
106-
<button class="button buttonPrimary" data-type="submit">{lang}wcf.global.button.saveSorting{/lang}</button>
107-
</div>
26+
<script data-relocate="true">
27+
require(["WoltLabSuite/Core/Component/ChangeShowOrder"], ({ setup }) => {
28+
{jsphrase name='wcf.global.changeShowOrder'}
10829
109-
<footer class="contentFooter">
110-
{hascontent}
111-
<div class="paginationBottom">
112-
{content}{unsafe:$pagesLinks}{/content}
113-
</div>
114-
{/hascontent}
115-
116-
<nav class="contentFooterNavigation">
117-
<ul>
118-
<li><a href="{link controller='FaqQuestionAdd'}{/link}" class="button">{icon name='plus' size=16} <span>{lang}wcf.acp.menu.link.faq.questions.add{/lang}</span></a></li>
119-
120-
{event name='contentFooterNavigation'}
121-
</ul>
122-
</nav>
123-
</footer>
124-
{else}
125-
<p class="info">{lang}wcf.global.noItems{/lang}</p>
126-
{/if}
30+
setup(
31+
document.querySelector('.jsChangeShowOrder'),
32+
'hanashi/questions/show-order',
33+
);
34+
});
35+
</script>
12736

12837
{include file='faqQuestionAddDialog'}
12938

files/lib/acp/page/FaqQuestionListPage.class.php

Lines changed: 6 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
namespace wcf\acp\page;
44

55
use Override;
6-
use wcf\data\category\CategoryNodeTree;
7-
use wcf\data\faq\QuestionList;
8-
use wcf\page\SortablePage;
6+
use wcf\page\AbstractGridViewPage;
7+
use wcf\system\gridView\AbstractGridView;
8+
use wcf\system\gridView\admin\FaqQuestionGridView;
99
use wcf\system\WCF;
10-
use wcf\util\StringUtil;
1110

12-
class FaqQuestionListPage extends SortablePage
11+
final class FaqQuestionListPage extends AbstractGridViewPage
1312
{
1413
/**
1514
* @inheritDoc
@@ -21,77 +20,22 @@ class FaqQuestionListPage extends SortablePage
2120
*/
2221
public $neededPermissions = ['admin.faq.canViewQuestion'];
2322

24-
/**
25-
* @inheritDoc
26-
*/
27-
public $objectListClassName = QuestionList::class;
28-
29-
/**
30-
* @inheritDoc
31-
*/
32-
public $validSortFields = ['questionID', 'categoryID', 'showOrder'];
33-
34-
/**
35-
* category id
36-
*/
37-
public int $categoryID = 0;
38-
39-
/**
40-
* question
41-
*/
42-
public string $question = '';
43-
44-
/**
45-
* answer
46-
*/
47-
public string $answer = '';
48-
4923
public int $showFaqAddDialog = 0;
5024

5125
#[Override]
5226
public function readParameters()
5327
{
5428
parent::readParameters();
5529

56-
if (isset($_REQUEST['categoryID'])) {
57-
$this->categoryID = (int)$_REQUEST['categoryID'];
58-
}
59-
if (!empty($_REQUEST['question'])) {
60-
$this->question = StringUtil::trim($_REQUEST['question']);
61-
}
62-
if (!empty($_REQUEST['answer'])) {
63-
$this->answer = StringUtil::trim($_REQUEST['answer']);
64-
}
6530
if (!empty($_REQUEST['showFaqAddDialog'])) {
6631
$this->showFaqAddDialog = 1;
6732
}
6833
}
6934

7035
#[Override]
71-
protected function initObjectList()
36+
protected function createGridView(): AbstractGridView
7237
{
73-
parent::initObjectList();
74-
75-
if ($this->categoryID) {
76-
$this->objectList->getConditionBuilder()->add(
77-
'faq_questions.categoryID = ?',
78-
[$this->categoryID]
79-
);
80-
}
81-
82-
if (!empty($this->question)) {
83-
$this->objectList->getConditionBuilder()->add(
84-
'faq_questions.question LIKE ?',
85-
['%' . WCF::getDB()->escapeLikeValue($this->question) . '%']
86-
);
87-
}
88-
89-
if (!empty($this->answer)) {
90-
$this->objectList->getConditionBuilder()->add(
91-
'faq_questions.answer LIKE ?',
92-
['%' . WCF::getDB()->escapeLikeValue($this->answer) . '%']
93-
);
94-
}
38+
return new FaqQuestionGridView();
9539
}
9640

9741
#[Override]
@@ -100,10 +44,6 @@ public function assignVariables()
10044
parent::assignVariables();
10145

10246
WCF::getTPL()->assign([
103-
'categoryID' => $this->categoryID,
104-
'question' => $this->question,
105-
'answer' => $this->answer,
106-
'categoryNodeList' => (new CategoryNodeTree('dev.tkirch.wsc.faq.category'))->getIterator(),
10747
'showFaqAddDialog' => $this->showFaqAddDialog,
10848
]);
10949
}

files/lib/bootstrap/dev.tkirch.wsc.faq.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
use wcf\event\acp\menu\item\ItemCollecting;
88
use wcf\event\endpoint\ControllerCollecting;
99
use wcf\event\worker\RebuildWorkerCollecting;
10+
use wcf\system\endpoint\controller\hanashi\questions\ChangeShowOrder;
11+
use wcf\system\endpoint\controller\hanashi\questions\DeleteQuestion;
12+
use wcf\system\endpoint\controller\hanashi\questions\DisableQuestion;
13+
use wcf\system\endpoint\controller\hanashi\questions\EnableQuestion;
14+
use wcf\system\endpoint\controller\hanashi\questions\GetShowOrder;
1015
use wcf\system\endpoint\controller\hanashi\questions\search\GetSearch;
1116
use wcf\system\endpoint\controller\hanashi\questions\search\RenderSearch;
1217
use wcf\system\event\EventHandler;
@@ -83,6 +88,11 @@ static function (RebuildWorkerCollecting $event) {
8388
EventHandler::getInstance()->register(
8489
ControllerCollecting::class,
8590
static function (ControllerCollecting $event) {
91+
$event->register(new DeleteQuestion());
92+
$event->register(new DisableQuestion());
93+
$event->register(new EnableQuestion());
94+
$event->register(new GetShowOrder());
95+
$event->register(new ChangeShowOrder());
8696
$event->register(new RenderSearch());
8797
$event->register(new GetSearch());
8898
}

files/lib/data/faq/QuestionEditor.class.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public function updateShowOrder(int $showOrder): int
3737

3838
//check showOrder
3939
if ($showOrder < $this->showOrder) {
40-
$sql = "UPDATE " . static::getDatabaseTableName() . "
41-
SET showOrder = showOrder + 1
42-
WHERE showOrder >= ?
43-
AND showOrder < ?";
44-
$statement = WCF::getDB()->prepareStatement($sql);
40+
$sql = "UPDATE wcf1_faq_questions
41+
SET showOrder = showOrder + 1
42+
WHERE showOrder >= ?
43+
AND showOrder < ?";
44+
$statement = WCF::getDB()->prepare($sql);
4545
$statement->execute([
4646
$showOrder,
4747
$this->showOrder,
@@ -56,11 +56,11 @@ public function updateShowOrder(int $showOrder): int
5656
}
5757

5858
//update databse
59-
$sql = "UPDATE " . static::getDatabaseTableName() . "
60-
SET showOrder = showOrder - 1
61-
WHERE showOrder <= ?
62-
AND showOrder > ?";
63-
$statement = WCF::getDB()->prepareStatement($sql);
59+
$sql = "UPDATE wcf1_faq_questions
60+
SET showOrder = showOrder - 1
61+
WHERE showOrder <= ?
62+
AND showOrder > ?";
63+
$statement = WCF::getDB()->prepare($sql);
6464
$statement->execute([
6565
$showOrder,
6666
$this->showOrder,
@@ -76,9 +76,9 @@ public function updateShowOrder(int $showOrder): int
7676
*/
7777
public static function getShowOrder(): int
7878
{
79-
$sql = "SELECT MAX(showOrder) AS showOrder
80-
FROM " . static::getDatabaseTableName();
81-
$statement = WCF::getDB()->prepareStatement($sql);
79+
$sql = "SELECT MAX(showOrder) AS showOrder
80+
FROM wcf1_faq_questions";
81+
$statement = WCF::getDB()->prepare($sql);
8282
$statement->execute();
8383
$row = $statement->fetchArray();
8484

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace wcf\event\interaction\admin;
4+
5+
use wcf\event\IPsr14Event;
6+
use wcf\system\interaction\admin\FaqQuestionsInteractions;
7+
8+
final class FaqQuestionsInteractionCollecting implements IPsr14Event
9+
{
10+
public function __construct(public readonly FaqQuestionsInteractions $provider)
11+
{
12+
}
13+
}

files/lib/page/FaqQuestionListPage.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public function readParameters()
4545
EOT
4646
);
4747

48-
$this->category = FaqCategory::getCategory($queryParameters['id']);
48+
$this->category = FaqCategory::getCategory((int)$queryParameters['id']);
4949
} catch (MappingError) {
5050
throw new IllegalLinkException();
5151
}

files/lib/system/bbcode/FaqBBCode.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function getParsedTag(array $openingTag, $content, array $closingTag, BBC
3535
$collapse = true;
3636
}
3737

38-
return WCF::getTPL()->fetch('faqBBCode', 'wcf', [
38+
return WCF::getTPL()->render('wcf', 'faqBBCode', [
3939
'question' => $question,
4040
'collapseQuestion' => $collapse,
4141
], true);

0 commit comments

Comments
 (0)