diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 3141b3c..6b64a76 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -143,6 +143,13 @@ "null": false, "foreignTable": "account", "foreignKey": "account_id" + }, + "news_seen_news": { + "name": "news_seen_news", + "type": "INT", + "null": false, + "foreignTable": "news", + "foreignKey": "news_id" } } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 7e654d8..60178d6 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -70,39 +70,38 @@ final class BackendController extends Controller implements DashboardElementInte if ($request->getData('ptype') === 'p') { $view->setData('news', - $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '<') + $data = $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '<') ->limit(25)->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('news', - $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '>') + $data = $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '>') ->limit(25)->execute() ); } else { $view->setData('news', - $mapperQuery->where('id', 0, '>') + $data = $mapperQuery->where('id', 0, '>') ->limit(25)->execute() ); } - $seen = NewsSeenMapper::get()->where('seenBy', $request->header->account)->execute(); - $view->setData('seen', $seen->seenAt); - - // @async - // @todo: Seen needs field which defines which news article is seen!!!! - if ($seen instanceof NullNewsSeen) { - $seen = new NewsSeen(); - $seen->seenBy = (int) $request->header->account; - $seen->seenAt = new \DateTime('now'); - - NewsSeenMapper::create()->execute($seen); - } else { - $newSeen = clone $seen; - $newSeen->seenAt = new \DateTime('now'); - - NewsSeenMapper::update()->execute($newSeen); + $ids = []; + foreach ($data as $news) { + $ids[] = $news->getId(); } + $seenObjects = NewsSeenMapper::getAll() + ->where('seenBy', $request->header->account) + ->where('news', $ids, 'in') + ->execute(); + + $seen = []; + foreach ($seenObjects as $seenObject) { + $seen[] = $seenObject->news; + } + + $view->setData('seen', $seen); + return $view; } @@ -172,6 +171,20 @@ final class BackendController extends Controller implements DashboardElementInte return $view; } + $seen = NewsSeenMapper::get() + ->where('news', (int) $request->getData('id')) + ->where('seenBy', $request->header->account) + ->execute(); + + if ($seen instanceof NullNewsSeen) { + $seen = new NewsSeen(); + $seen->seenBy = (int) $request->header->account; + $seen->news = (int) $request->getData('id'); + $seen->seenAt = new \DateTime('now'); + + NewsSeenMapper::create()->execute($seen); + } + $view->setTemplate('/Modules/News/Theme/Backend/news-single'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1000601001, $request, $response)); $view->addData('news', $article); diff --git a/Models/NewsSeen.php b/Models/NewsSeen.php index bfb0508..d708d2b 100755 --- a/Models/NewsSeen.php +++ b/Models/NewsSeen.php @@ -36,6 +36,8 @@ class NewsSeen public int $seenBy = 0; + public int $news = 0; + /** * Constructor. * diff --git a/Models/NewsSeenMapper.php b/Models/NewsSeenMapper.php index 2bab3a3..1fa4b6d 100755 --- a/Models/NewsSeenMapper.php +++ b/Models/NewsSeenMapper.php @@ -23,11 +23,6 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @license OMS License 1.0 * @link https://orange-management.org * @since 1.0.0 - * - * @todo Orange-Management/oms-News#??? - * Too complicated select. - * I think the default getAll etc. is too complicated and has too many joins which are not really required. - * Check and fix! */ final class NewsSeenMapper extends DataMapperFactory { @@ -38,9 +33,10 @@ final class NewsSeenMapper extends DataMapperFactory * @since 1.0.0 */ public const COLUMNS = [ - 'news_seen_id' => ['name' => 'news_seen_id', 'type' => 'int', 'internal' => 'id'], - 'news_seen_at' => ['name' => 'news_seen_at', 'type' => 'DateTime', 'internal' => 'seenAt'], - 'news_seen_by' => ['name' => 'news_seen_by', 'type' => 'int', 'internal' => 'seenBy'], + 'news_seen_id' => ['name' => 'news_seen_id', 'type' => 'int', 'internal' => 'id'], + 'news_seen_at' => ['name' => 'news_seen_at', 'type' => 'DateTime', 'internal' => 'seenAt'], + 'news_seen_news' => ['name' => 'news_seen_news', 'type' => 'int', 'internal' => 'news'], + 'news_seen_by' => ['name' => 'news_seen_by', 'type' => 'int', 'internal' => 'seenBy'], ]; /** diff --git a/Theme/Backend/news-dashboard.tpl.php b/Theme/Backend/news-dashboard.tpl.php index 8debe4f..e9c452c 100755 --- a/Theme/Backend/news-dashboard.tpl.php +++ b/Theme/Backend/news-dashboard.tpl.php @@ -18,7 +18,7 @@ use phpOMS\Utils\Parser\Markdown\Markdown; /** @var \phpOMS\Views\View $this */ /** @var \Modules\News\Models\NewsArticle[] $newsList */ $newsList = $this->getData('news'); -$seenAt = $this->getData('seen'); +$seen = $this->getData('seen') ?? []; $previous = empty($newsList) ? '{/prefix}news/dashboard' : '{/prefix}news/dashboard?{?}&id=' . \reset($newsList)->getId() . '&ptype=p'; $next = empty($newsList) ? '{/prefix}news/dashboard' : '{/prefix}news/dashboard?{?}&id=' . \end($newsList)->getId() . '&ptype=n'; @@ -32,13 +32,13 @@ echo $this->getData('nav')->render(); ?> ?>
- getTimestamp() < $news->publish->getTimestamp() ? '' : ''; ?> + getId(), $seen)) ? '' : ''; ?> printHtml($news->title); ?> printHtml($news->createdBy->name3 . ' ' . $news->createdBy->name2 . ' ' . $news->createdBy->name1); ?> - publish->format('Y-m-d'); ?> - getTimestamp() < $news->publish->getTimestamp() ? '' : ''; ?> + ' : ''; ?>