1 <?php
2 
3 use dokuwiki\Extension\AdminPlugin;
4 use dokuwiki\Form\Form;
5 use FYKOS\dokuwiki\Extension\PluginNewsFeed\Model\ModelStream;
6 use FYKOS\dokuwiki\Extension\PluginNewsFeed\Model\ModelNews;
7 
8 /**
9  * Class admin_plugin_newsfeed_push
10  * @author Michal Červeňák <miso@fykos.cz>
11  */
12 class admin_plugin_newsfeed_push extends AdminPlugin {
13 
14     private helper_plugin_newsfeed $helper;
15 
16     public function __construct() {
17         $this->helper = $this->loadHelper('newsfeed');
18     }
19 
20     public function getMenuSort(): int {
21         return 291;
22     }
23 
24     public function forAdminOnly(): bool {
25         return false;
26     }
27 
28     public function getMenuText($lang): string {
29         return $this->getLang('push_menu');
30     }
31 
32     public function handle() {
33         global $INPUT;
34 
35         if (!checkSecurityToken()) {
36             return;
37         }
38         $stream = $this->helper->serviceStream->findByName($INPUT->param('news')['stream']);
39         $newsId = $INPUT->param('news')['id'];
40 
41         if ($stream && $newsId) {
42             $targetStreamId = $stream->streamId;
43             $streamIds = [$targetStreamId];
44             if ($INPUT->str('all_dependence')) {
45                 $this->helper->fullParentDependence($targetStreamId, $streamIds);
46             }
47 
48             foreach ($streamIds as $streamId) {
49                 $this->helper->servicePriority->store($newsId, $streamId);
50             }
51             header('Location: ' . $_SERVER['REQUEST_URI']);
52             exit();
53         }
54     }
55 
56     public function html(): void {
57         global $INPUT;
58         $streamName = $INPUT->param('news')['stream'];
59         $stream = $this->helper->serviceStream->findByName($streamName);
60         echo '<h1>' . $this->getLang('push_menu') . '</h1>';
61         echo '<div class="info">' . $this->getLang('push_in_stream') . ': ' . $stream->name . '</div>';
62 
63         $streams = $this->helper->serviceStream->getAll();
64         echo $this->getChangeStreamForm($streams)->toHTML();
65 
66         if ($stream->name) {
67             echo '<h2>' . $this->getLang('push_menu') . ': ' . $stream->name . '</h2>';
68 
69             $newsInStream = $this->newsToId($stream->getNews());
70             $allNews = $this->helper->serviceNews->getAll();
71             foreach ($this->newsToId($allNews) as $id) {
72                 if (array_search($id, $newsInStream) === false) {
73                     $news = $this->helper->serviceNews->getById($id);
74                     echo $news->render('even', ' ', ' ', false);
75                     echo $this->newsAddForm($stream->name, $id);
76                     echo '<hr class="clearfix"/>';
77                     tpl_flush();
78                 }
79             }
80         }
81     }
82 
83     /**
84      * @param $news ModelNews[]
85      * @return integer[]
86      */
87     private function newsToId(array $news): array {
88         return array_map(function (ModelNews $value) {
89             return $value->newsId;
90         }, $news);
91     }
92 
93     /**
94      * @param $streamValues ModelStream[]
95      * @return Form
96      *
97      */
98     private function getChangeStreamForm(array $streamValues = []): Form {
99         $form = new Form();
100         $form->addDropdown('news[stream]', array_map(function (ModelStream $value) {
101             return $value->name;
102         }, $streamValues), $this->getLang('stream'));
103         $form->addButton('submit', $this->getLang('push_choose_stream'));
104         return $form;
105     }
106 
107     private function newsAddForm(string $stream, int $newsId): string {
108         $newsForm = new Form();
109         $newsForm->setHiddenField('do', 'admin');
110         $newsForm->setHiddenField('page', 'newsfeed_push');
111         $newsForm->setHiddenField('news[do]', 'push');
112         $newsForm->setHiddenField('news[id]', $newsId);
113         $newsForm->setHiddenField('news[stream]', $stream);
114         $newsForm->addCheckbox('all_dependence', $this->getLang('alw_dep'));
115         $newsForm->addButton('submit', $this->getLang('btn_push_news') . $stream);
116         return $newsForm->toHTML();
117     }
118 }
119