Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions com.woltlab.wcf/page.xml
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,16 @@
<allowSpidersToIndex>1</allowSpidersToIndex>
<requireObjectID>1</requireObjectID>
</page>
<page identifier="com.woltlab.wcf.UserArticleList">
<pageType>system</pageType>
<controller>wcf\page\UserArticleListPage</controller>
<name language="de">Artikel eines bestimmten Benutzers</name>
<name language="en">Articles of Certain User</name>
<handler>wcf\system\page\handler\UserArticleListPageHandler</handler>
<parent>com.woltlab.wcf.ArticleList</parent>
<options>module_article</options>
<requireObjectID>1</requireObjectID>
</page>
<page identifier="com.woltlab.wcf.Article">
<pageType>system</pageType>
<controller>wcf\page\ArticlePage</controller>
Expand Down
10 changes: 10 additions & 0 deletions com.woltlab.wcf/templates/userArticleList.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{capture assign='contentTitle'}{lang}wcf.article.userArticles{/lang}{/capture}
{capture assign='pageTitle'}{lang}wcf.article.userArticles{/lang}{/capture}

{include file='header'}

<div class="section {$listView->getContainerCssClassName()}">
{unsafe:$listView->render()}
</div>

{include file='footer'}
60 changes: 60 additions & 0 deletions wcfsetup/install/files/lib/page/UserArticleListPage.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

namespace wcf\page;

use wcf\data\user\User;
use wcf\http\Helper;
use wcf\system\listView\user\UserArticleListView;
use wcf\system\WCF;

/**
* Shows a list of articles by a certain user.
*
* @author Marcel Werk
* @copyright 2001-2026 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*
* @extends AbstractListViewPage<UserArticleListView>
*/
class UserArticleListPage extends AbstractListViewPage
{
/**
* @inheritDoc
*/
public $neededModules = ['MODULE_ARTICLE'];

public User $user;

#[\Override]
public function readParameters(): void
{
parent::readParameters();

$this->user = Helper::fetchObjectFromQueryParameter(User::class);
}

#[\Override]
public function assignVariables(): void
{
parent::assignVariables();

WCF::getTPL()->assign([
'user' => $this->user,
]);
}

#[\Override]
protected function createListView(): UserArticleListView
{
return new UserArticleListView($this->user->userID);
}

#[\Override]
protected function getBaseUrlParameters(): array
{
return [
'object' => $this->user,
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

namespace wcf\system\listView\user;

use wcf\data\article\AccessibleArticleList;

/**
* List view for the list of articles created by a specific user.
*
* @author Marcel Werk
* @copyright 2001-2026 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*/
class UserArticleListView extends ArticleListView
{
public function __construct(public readonly int $userID)
{
parent::__construct();
}

#[\Override]
protected function createObjectList(): AccessibleArticleList
{
$list = parent::createObjectList();
$list->getConditionBuilder()->add('article.userID = ?', [$this->userID]);

return $list;
}

#[\Override]
public function addAvailableFilters(array $filters): void
{
// Remove useless username filter.
$filters = \array_filter(
$filters,
static fn($filter) => $filter->getId() !== 'username'
);

parent::addAvailableFilters($filters);
}

#[\Override]
public function getParameters(): array
{
return [
'userID' => $this->userID,
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace wcf\system\page\handler;

use wcf\page\UserArticleListPage;
use wcf\system\cache\runtime\UserRuntimeCache;
use wcf\system\request\LinkHandler;

/**
* Page handler implementation for the page showing the articles created by a user.
*
* @author Marcel Werk
* @copyright 2001-2026 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*/
final class UserArticleListPageHandler extends AbstractLookupPageHandler implements IOnlineLocationPageHandler
{
use TUserLookupPageHandler;
use TUserOnlineLocationPageHandler;

#[\Override]
public function getLink(int $objectID): string
{
return LinkHandler::getInstance()->getControllerLink(UserArticleListPage::class, [
'object' => UserRuntimeCache::getInstance()->getObject($objectID),
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use wcf\event\user\profile\UserProfileHeaderSearchContentLinkCollecting;
use wcf\event\user\profile\UserProfileStatItemCollecting;
use wcf\page\MembersListPage;
use wcf\page\UserArticleListPage;
use wcf\system\event\EventHandler;
use wcf\system\interaction\InteractionContextMenuComponentConfiguration;
use wcf\system\interaction\StandaloneInteractionContextMenuComponent;
Expand Down Expand Up @@ -129,9 +130,19 @@ private function initStatItems(): void

private function initSearchContentLinks(): void
{
if (\MODULE_ARTICLE !== 0 && $this->user->articles !== 0) {
$this->searchContentLinks[] = new UserProfileHeaderViewSearchContentLink(
WCF::getLanguage()->get('wcf.article.articles'),
LinkHandler::getInstance()->getControllerLink(
UserArticleListPage::class,
['object' => $this->user]
)
);
}

$event = new UserProfileHeaderSearchContentLinkCollecting($this->user);
EventHandler::getInstance()->fire($event);
$this->searchContentLinks = $event->getLinks();
$this->searchContentLinks = [...$this->searchContentLinks, ...$event->getLinks()];
}

private function initInteractionContextMenu(): void
Expand Down
4 changes: 4 additions & 0 deletions wcfsetup/install/lang/de.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3320,6 +3320,7 @@ freigeschaltet. {if LANGUAGE_USE_INFORMAL_VARIANT}Du kannst{else}Sie können{/if
<item name="wcf.article.button.unpublish"><![CDATA[Veröffentlichung zurückziehen]]></item>
<item name="wcf.article.button.setCategory"><![CDATA[Kategorie ändern]]></item>
<item name="wcf.article.unreadArticles"><![CDATA[Ungelesene Artikel]]></item>
<item name="wcf.article.userArticles"><![CDATA[Artikel von {$user->username}]]></item>
<item name="wcf.article.watchedArticles"><![CDATA[Abonnierte Artikel]]></item>
</category>
<category name="wcf.attachment">
Expand Down Expand Up @@ -4393,6 +4394,7 @@ Erlaubte Dateiendungen: gif, jpg, jpeg, png, webp]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.Article"><![CDATA[Artikel <a href="{$article->getLink()}">{$article->getTitle()}</a>]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.CategoryArticleList"><![CDATA[Artikel-Kategorie <a href="{$category->getLink()}">{$category->getTitle()}</a>]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.User"><![CDATA[Benutzerprofil von <a href="{link controller='User' object=$user}{/link}" class="userLink" data-object-id="{$user->userID}">{$user->username}</a>]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.UserArticleList"><![CDATA[<a href="{link controller='UserArticleList' object=$user}{/link}">Artikel von {$user->username}</a>]]></item>
<item name="wcf.page.availableUpdates"><![CDATA[Es sind <a href="{link controller='PackageUpdate' isACP=true}{/link}">Aktualisierungen für installierte Pakete</a> verfügbar.]]></item>
<item name="wcf.page.error.permissionDenied"><![CDATA[Der Zutritt zu dieser Seite ist {if LANGUAGE_USE_INFORMAL_VARIANT}dir{else}Ihnen{/if} leider verwehrt. {if LANGUAGE_USE_INFORMAL_VARIANT}Du besitzt{else}Sie besitzen{/if} nicht die notwendigen Zugriffsrechte, um diese Seite aufrufen zu können.]]></item>
<item name="wcf.page.error.permissionDenied.title"><![CDATA[Zugriff verweigert]]></item>
Expand All @@ -4411,10 +4413,12 @@ Erlaubte Dateiendungen: gif, jpg, jpeg, png, webp]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.Article"><![CDATA[ID des Artikels]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.CategoryArticleList"><![CDATA[ID der Kategorie]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.User"><![CDATA[ID des Benutzers]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.UserArticleList"><![CDATA[ID des Benutzers]]></item>
<item name="wcf.page.pageObjectID.search"><![CDATA[ID suchen]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.Article"><![CDATA[Artikeltitel durchsuchen]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.CategoryArticleList"><![CDATA[Kategorietitel durchsuchen]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.User"><![CDATA[Benutzernamen durchsuchen]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.UserArticleList"><![CDATA[Benutzernamen durchsuchen]]></item>
<item name="wcf.page.pageObjectID.search.noResults"><![CDATA[Es wurden keine Ergebnisse gefunden.]]></item>
<item name="wcf.page.pageObjectID.search.results"><![CDATA[Suchergebnisse]]></item>
<item name="wcf.page.pageObjectID.search.terms"><![CDATA[Durchsuchen]]></item>
Expand Down
4 changes: 4 additions & 0 deletions wcfsetup/install/lang/en.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3245,6 +3245,7 @@ Your account on {@PAGE_TITLE|phrase} [URL:{link isEmail=true}{/link}] has been a
<item name="wcf.article.button.unpublish"><![CDATA[Withdraw Publication]]></item>
<item name="wcf.article.button.setCategory"><![CDATA[Set category]]></item>
<item name="wcf.article.unreadArticles"><![CDATA[Unread Articles]]></item>
<item name="wcf.article.userArticles"><![CDATA[Articles by {$user->username}]]></item>
<item name="wcf.article.watchedArticles"><![CDATA[Subscribed Articles]]></item>
</category>
<category name="wcf.attachment">
Expand Down Expand Up @@ -4339,6 +4340,7 @@ Allowed extensions: gif, jpg, jpeg, png, webp]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.Article"><![CDATA[Article <a href="{$article->getLink()}">{$article->getTitle()}</a>]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.CategoryArticleList"><![CDATA[Article category <a href="{$category->getLink()}">{$category->getTitle()}</a>]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.User"><![CDATA[User profile of <a href="{link controller='User' object=$user}{/link}" class="userLink" data-object-id="{$user->userID}">{$user->username}</a>]]></item>
<item name="wcf.page.onlineLocation.com.woltlab.wcf.UserArticleList"><![CDATA[<a href="{link controller='UserArticleList' object=$user}{/link}">Articles by {$user->username}</a>]]></item>
<item name="wcf.page.availableUpdates"><![CDATA[There are <a href="{link controller='PackageUpdate' isACP=true}{/link}">updates available</a> for installed packages.]]></item>
<item name="wcf.page.error.permissionDenied"><![CDATA[Access denied. You’re not authorized to view this page.]]></item>
<item name="wcf.page.error.permissionDenied.title"><![CDATA[Access Denied]]></item>
Expand All @@ -4357,10 +4359,12 @@ Allowed extensions: gif, jpg, jpeg, png, webp]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.Article"><![CDATA[ID of the Article]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.CategoryArticleList"><![CDATA[ID of the Category]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.User"><![CDATA[ID of the User]]></item>
<item name="wcf.page.pageObjectID.com.woltlab.wcf.UserArticleList"><![CDATA[ID of the User]]></item>
<item name="wcf.page.pageObjectID.search"><![CDATA[Search ID]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.Article"><![CDATA[Search Article Titles]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.CategoryArticleList"><![CDATA[Search Category Titles]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.User"><![CDATA[Search Usernames]]></item>
<item name="wcf.page.pageObjectID.search.com.woltlab.wcf.UserArticleList"><![CDATA[Search Usernames]]></item>
<item name="wcf.page.pageObjectID.search.noResults"><![CDATA[The search returned no results.]]></item>
<item name="wcf.page.pageObjectID.search.results"><![CDATA[Search Results]]></item>
<item name="wcf.page.pageObjectID.search.terms"><![CDATA[Search]]></item>
Expand Down
Loading