2 namespace wcf\data\article
;
3 use wcf\data\article\content\ArticleContent
;
4 use wcf\data\article\content\ArticleContentEditor
;
5 use wcf\data\AbstractDatabaseObjectAction
;
6 use wcf\system\comment\CommentHandler
;
7 use wcf\system\language\LanguageFactory
;
8 use wcf\system\like\LikeHandler
;
9 use wcf\system\message\embedded\
object\MessageEmbeddedObjectManager
;
10 use wcf\system\search\SearchIndexManager
;
11 use wcf\system\tagging\TagEngine
;
14 * Executes article related actions.
17 * @copyright 2001-2017 WoltLab GmbH
18 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
19 * @package WoltLabSuite\Core\Data\Article
22 * @method ArticleEditor[] getObjects()
23 * @method ArticleEditor getSingleObject()
25 class ArticleAction
extends AbstractDatabaseObjectAction
{
29 protected $className = ArticleEditor
::class;
34 protected $permissionsCreate = ['admin.content.article.canManageArticle'];
39 protected $permissionsDelete = ['admin.content.article.canManageArticle'];
44 protected $permissionsUpdate = ['admin.content.article.canManageArticle'];
49 protected $requireACP = ['create', 'delete', 'update'];
55 public function create() {
56 /** @var Article $article */
57 $article = parent
::create();
59 // save article content
60 if (!empty($this->parameters
['content'])) {
61 foreach ($this->parameters
['content'] as $languageID => $content) {
62 if (!empty($content['htmlInputProcessor'])) {
63 /** @noinspection PhpUndefinedMethodInspection */
64 $content['content'] = $content['htmlInputProcessor']->getHtml();
67 /** @var ArticleContent $articleContent */
68 $articleContent = ArticleContentEditor
::create([
69 'articleID' => $article->articleID
,
70 'languageID' => $languageID ?
: null,
71 'title' => $content['title'],
72 'teaser' => $content['teaser'],
73 'content' => $content['content'],
74 'imageID' => $content['imageID']
76 $articleContentEditor = new ArticleContentEditor($articleContent);
79 if (!empty($content['tags'])) {
80 TagEngine
::getInstance()->addObjectTags('com.woltlab.wcf.article', $articleContent->articleContentID
, $content['tags'], ($languageID ?
: LanguageFactory
::getInstance()->getDefaultLanguageID()));
83 // update search index
84 SearchIndexManager
::getInstance()->set(
85 'com.woltlab.wcf.article',
86 $articleContent->articleContentID
,
87 $articleContent->content
,
88 $articleContent->title
,
93 $articleContent->teaser
96 // save embedded objects
97 if (!empty($content['htmlInputProcessor'])) {
98 /** @noinspection PhpUndefinedMethodInspection */
99 $content['htmlInputProcessor']->setObjectID($articleContent->articleContentID
);
100 if (MessageEmbeddedObjectManager
::getInstance()->registerObjects($content['htmlInputProcessor'])) {
101 $articleContentEditor->update(['hasEmbeddedObjects' => 1]);
113 public function update() {
116 // update article content
117 if (!empty($this->parameters
['content'])) {
118 foreach ($this->getObjects() as $article) {
119 foreach ($this->parameters
['content'] as $languageID => $content) {
120 if (!empty($content['htmlInputProcessor'])) {
121 /** @noinspection PhpUndefinedMethodInspection */
122 $content['content'] = $content['htmlInputProcessor']->getHtml();
125 $articleContent = ArticleContent
::getArticleContent($article->articleID
, ($languageID ?
: null));
126 $articleContentEditor = null;
127 if ($articleContent !== null) {
129 $articleContentEditor = new ArticleContentEditor($articleContent);
130 $articleContentEditor->update([
131 'title' => $content['title'],
132 'teaser' => $content['teaser'],
133 'content' => $content['content'],
134 'imageID' => $content['imageID']
139 if (empty($content['tags'])) {
140 TagEngine
::getInstance()->deleteObjectTags('com.woltlab.wcf.article', $articleContent->articleContentID
, ($languageID ?
: null));
144 /** @var ArticleContent $articleContent */
145 $articleContent = ArticleContentEditor
::create([
146 'articleID' => $article->articleID
,
147 'languageID' => $languageID ?
: null,
148 'title' => $content['title'],
149 'teaser' => $content['teaser'],
150 'content' => $content['content'],
151 'imageID' => $content['imageID']
153 $articleContentEditor = new ArticleContentEditor($articleContent);
157 if (!empty($content['tags'])) {
158 TagEngine
::getInstance()->addObjectTags('com.woltlab.wcf.article', $articleContent->articleContentID
, $content['tags'], ($languageID ?
: LanguageFactory
::getInstance()->getDefaultLanguageID()));
161 // update search index
162 SearchIndexManager
::getInstance()->set(
163 'com.woltlab.wcf.article',
164 $articleContent->articleContentID
,
165 $articleContent->content
,
166 $articleContent->title
,
171 $articleContent->teaser
174 // save embedded objects
175 if (!empty($content['htmlInputProcessor'])) {
176 /** @noinspection PhpUndefinedMethodInspection */
177 $content['htmlInputProcessor']->setObjectID($articleContent->articleContentID
);
178 if ($articleContent->hasEmbeddedObjects
!= MessageEmbeddedObjectManager
::getInstance()->registerObjects($content['htmlInputProcessor'])) {
179 $articleContentEditor->update(['hasEmbeddedObjects' => $articleContent->hasEmbeddedObjects ?
0 : 1]);
190 public function delete() {
191 $articleIDs = $articleContentIDs = [];
192 foreach ($this->getObjects() as $article) {
193 $articleIDs[] = $article->articleID
;
194 foreach ($article->getArticleContents() as $articleContent) {
195 $articleContentIDs[] = $articleContent->articleContentID
;
202 if (!empty($articleIDs)) {
204 LikeHandler
::getInstance()->removeLikes('com.woltlab.wcf.likeableArticle', $articleIDs);
206 CommentHandler
::getInstance()->deleteObjects('com.woltlab.wcf.articleComment', $articleContentIDs);
207 // delete tag to object entries
208 TagEngine
::getInstance()->deleteObjects('com.woltlab.wcf.article', $articleContentIDs);
209 // delete entry from search index
210 SearchIndexManager
::getInstance()->delete('com.woltlab.wcf.article', $articleContentIDs);