diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 6a2e93c..314c0bd 100644 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -63,5 +63,31 @@ "foreignKey": "account_id" } } + }, + "news_tag": { + "name": "news_tag", + "fields": { + "news_tag_id": { + "name": "news_tag_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "news_tag_dst": { + "name": "news_tag_dst", + "type": "INT", + "null": false, + "foreignTable": "news", + "foreignKey": "news_id" + }, + "news_tag_src": { + "name": "news_tag_src", + "type": "INT", + "null": false, + "foreignTable": "tag", + "foreignKey": "tag_id" + } + } } } \ No newline at end of file diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 85324d3..43e673a 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -27,6 +27,8 @@ use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; use phpOMS\Utils\Parser\Markdown\Markdown; +use phpOMS\Message\Http\HttpResponse; +use Modules\Tag\Models\NullTag; /** * News controller class. @@ -164,6 +166,22 @@ final class ApiController extends Controller $newsArticle->setStatus((int) ($request->getData('status') ?? NewsStatus::VISIBLE)); $newsArticle->setFeatured((bool) ($request->getData('featured') ?? true)); + if (!empty($tags = $request->getDataJson('tags'))) { + foreach ($tags as $tag) { + if (!isset($tag['id'])) { + $request->setData('title', $tag['title'], true); + $request->setData('color', $tag['color'], true); + $request->setData('language', $tag['language'], true); + + $internalResponse = new HttpResponse(); + $this->app->moduleManager->get('Tag')->apiTagCreate($request, $internalResponse, null); + $newsArticle->addTag($internalResponse->get($request->getUri()->__toString())['response']); + } else { + $newsArticle->addTag(new NullTag((int) $tag['id'])); + } + } + } + return $newsArticle; } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 6c73adc..5e16296 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -54,8 +54,17 @@ final class BackendController extends Controller implements DashboardElementInte $view->setTemplate('/Modules/News/Theme/Backend/news-dashboard'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000701001, $request, $response)); - $news = NewsArticleMapper::getNewest(50); - $view->addData('news', $news); + if ($request->getData('ptype') === '-') { + $view->setData('news', + NewsArticleMapper::withConditional('language', $response->getHeader()->getL11n()->getLanguage()) + ::getBeforePivot((int) ($request->getData('id') ?? 0), null, 25) + ); + } else { + $view->setData('news', + NewsArticleMapper::withConditional('language', $response->getHeader()->getL11n()->getLanguage()) + ::getAfterPivot((int) ($request->getData('id') ?? 0), null, 25) + ); + } return $view; } diff --git a/Models/NewsArticle.php b/Models/NewsArticle.php index 305dffa..9c0ea15 100644 --- a/Models/NewsArticle.php +++ b/Models/NewsArticle.php @@ -120,12 +120,12 @@ class NewsArticle implements ArrayableInterface, \JsonSerializable private bool $featured = false; /** - * Badge. + * Tags. * * @var Tag[] * @since 1.0.0 */ - private array $badges = []; + private array $tags = []; /** * Constructor. @@ -139,32 +139,6 @@ class NewsArticle implements ArrayableInterface, \JsonSerializable $this->publish = new \DateTime('now'); } - /** - * Get badges - * - * @return Tag[] - * - * @since 1.0.0 - */ - public function getBadges() : array - { - return $this->badges; - } - - /** - * Add badge - * - * @param Tag $badge Badge to add - * - * @return void - * - * @since 1.0.0 - */ - public function addBadge(Tag $badge) : void - { - $this->badges[] = $badge; - } - /** * Get content * @@ -431,6 +405,32 @@ class NewsArticle implements ArrayableInterface, \JsonSerializable $this->featured = $featured; } + /** + * Get tags + * + * @return array + * + * @since 1.0.0 + */ + public function getTags() : array + { + return $this->tags; + } + + /** + * Add tag + * + * @param Tag $tag Tag + * + * @return void + * + * @since 1.0.0 + */ + public function addTag(Tag $tag) : void + { + $this->tags[] = $tag; + } + /** * {@inheritdoc} */ diff --git a/Models/NewsArticleMapper.php b/Models/NewsArticleMapper.php index 43d5eb3..57d6d4f 100644 --- a/Models/NewsArticleMapper.php +++ b/Models/NewsArticleMapper.php @@ -16,6 +16,7 @@ namespace Modules\News\Models; use Modules\Admin\Models\AccountMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; +use Modules\Tag\Models\TagMapper; /** * News mapper class. @@ -60,6 +61,21 @@ final class NewsArticleMapper extends DataMapperAbstract ], ]; + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'tags' => [ + 'mapper' => TagMapper::class, + 'table' => 'news_tag', + 'self' => 'news_tag_src', + 'external' => 'news_tag_dst', + ], + ]; + /** * Primary table. * diff --git a/Theme/Backend/news-dashboard.tpl.php b/Theme/Backend/news-dashboard.tpl.php index 94f4de8..db060f5 100644 --- a/Theme/Backend/news-dashboard.tpl.php +++ b/Theme/Backend/news-dashboard.tpl.php @@ -13,6 +13,7 @@ declare(strict_types=1); use Modules\News\Models\NewsType; +use \phpOMS\Uri\UriFactory; /** * @var \phpOMS\Views\View $this @@ -20,39 +21,34 @@ use Modules\News\Models\NewsType; */ $newsList = $this->getData('news'); +$previous = empty($newsList) ? '{/prefix}news/dashboard' : '{/prefix}news/dashboard?{?}&id=' . \reset($newsList)->getId() . '&ptype=-'; +$next = empty($newsList) ? '{/prefix}news/dashboard' : '{/prefix}news/dashboard?{?}&id=' . \end($newsList)->getId() . '&ptype=+'; + echo $this->getData('nav')->render(); ?>
-
- - - - - - $news) : ++$count; - $url = \phpOMS\Uri\UriFactory::build('{/prefix}news/article?{?}&id=' . $news->getId()); - $color = 'darkred'; - if ($news->getType() === NewsType::ARTICLE) { $color = 'green'; } - elseif ($news->getType() === NewsType::HEADLINE) { $color = 'purple'; } - elseif ($news->getType() === NewsType::LINK) { $color = 'yellow'; } - ?> - -
getHtml('News'); ?>
- getHtml('Type') ?> - getHtml('Title') ?> - getHtml('Author') ?> - getHtml('Date') ?> -
isFeatured() ? '' : ''; ?> - getHtml('TYPE' . $news->getType()) ?> - printHtml($news->getTitle()); ?> - printHtml($news->getCreatedBy()->getName1()); ?> - printHtml($news->getPublish()->format('Y-m-d')); ?> - - -
getHtml('Empty', '0', '0'); ?> - -
+ getId()); ?> +
+ +
+
+ getContent(), 0, 500) . (\strlen($news->getContent()) > 500 ? '...' : ''); ?> +
+
+
+
+ getTags(); foreach ($tags as $tag) : ?> + printHtml($tag->getTitle()); ?> + + More +
+
+ +
+