xref: /plugin/footerv2/action.php (revision 6065ea596917e1fd790d76208464ed2caca7662c)
1f09b1d21SJuergen-aus-Zuendorf<?php
2c83cd936SJuergen-aus-Zuendorf
3f09b1d21SJuergen-aus-Zuendorf/**
4c83cd936SJuergen-aus-Zuendorf
5f09b1d21SJuergen-aus-Zuendorf * DokuWiki Plugin footer (Action Component)
6c83cd936SJuergen-aus-Zuendorf
7f09b1d21SJuergen-aus-Zuendorf *
8c83cd936SJuergen-aus-Zuendorf
9f09b1d21SJuergen-aus-Zuendorf * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
10c83cd936SJuergen-aus-Zuendorf
11f09b1d21SJuergen-aus-Zuendorf *
12c83cd936SJuergen-aus-Zuendorf
13f09b1d21SJuergen-aus-Zuendorf * Original: from Plugin headerfooter, author Li Zheng <lzpublic@qq.com>
14c83cd936SJuergen-aus-Zuendorf
15f09b1d21SJuergen-aus-Zuendorf * Modified by Juergen H-J-Schuemmer@Web.de
16c83cd936SJuergen-aus-Zuendorf
17f09b1d21SJuergen-aus-Zuendorf * Only the footer component is supported in this plugin because the header functionality breaks the section edit mode
18c83cd936SJuergen-aus-Zuendorf
19f09b1d21SJuergen-aus-Zuendorf */
20f09b1d21SJuergen-aus-Zuendorf
21c83cd936SJuergen-aus-Zuendorf
22f09b1d21SJuergen-aus-Zuendorf// must be run within Dokuwiki
23c83cd936SJuergen-aus-Zuendorf
24f09b1d21SJuergen-aus-Zuendorfif(!defined('DOKU_INC')) die();
25f09b1d21SJuergen-aus-Zuendorf
26c83cd936SJuergen-aus-Zuendorf
27*6065ea59Sscottleechuaclass action_plugin_footerv2 extends DokuWiki_Action_Plugin {
28c83cd936SJuergen-aus-Zuendorf
29f09b1d21SJuergen-aus-Zuendorf   public function register(Doku_Event_Handler $controller) {
30f09b1d21SJuergen-aus-Zuendorf
31c83cd936SJuergen-aus-Zuendorf
32f09b1d21SJuergen-aus-Zuendorf      $controller->register_hook('PARSER_WIKITEXT_PREPROCESS', 'AFTER', $this, 'handle_parser_wikitext_preprocess');
33f09b1d21SJuergen-aus-Zuendorf
34c83cd936SJuergen-aus-Zuendorf     // aus Seite "https://github.com/MrBertie/pagequery/commit/6cae014dc7cc779c0be8d0a660af42407b414806":
35c83cd936SJuergen-aus-Zuendorf
36c83cd936SJuergen-aus-Zuendorf     $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, '_purgecache');
37c83cd936SJuergen-aus-Zuendorf
38f09b1d21SJuergen-aus-Zuendorf   }
39c83cd936SJuergen-aus-Zuendorf
40f09b1d21SJuergen-aus-Zuendorf   public function handle_parser_wikitext_preprocess(Doku_Event &$event, $param) {
41c83cd936SJuergen-aus-Zuendorf
42f09b1d21SJuergen-aus-Zuendorf       global $INFO;
43c83cd936SJuergen-aus-Zuendorf
44f09b1d21SJuergen-aus-Zuendorf       global $ID;
45c83cd936SJuergen-aus-Zuendorf
46f09b1d21SJuergen-aus-Zuendorf       global $conf;
47f09b1d21SJuergen-aus-Zuendorf
48f09b1d21SJuergen-aus-Zuendorf       //what does this mean???
49c83cd936SJuergen-aus-Zuendorf
50f09b1d21SJuergen-aus-Zuendorf       if ($INFO['id'] != '') return; // Jede Seite wird zweimal ausgeführt. Wenn die ID leer ist, ist es der echte Text, andernfalls ist es das Menü.
51f09b1d21SJuergen-aus-Zuendorf
52c83cd936SJuergen-aus-Zuendorf
53f09b1d21SJuergen-aus-Zuendorf       //helper array needed for parsePageTemplate
54c83cd936SJuergen-aus-Zuendorf
55f09b1d21SJuergen-aus-Zuendorf       //so that replacement like shown here is possible: https://www.dokuwiki.org/namespace_templates#replacement_patterns
56c83cd936SJuergen-aus-Zuendorf
57f09b1d21SJuergen-aus-Zuendorf       $data = array(
58c83cd936SJuergen-aus-Zuendorf
59f09b1d21SJuergen-aus-Zuendorf           'id'       => $ID, // the id of the page to be created
60c83cd936SJuergen-aus-Zuendorf
61f09b1d21SJuergen-aus-Zuendorf           'tpl'      => '', // the text used as template
62c83cd936SJuergen-aus-Zuendorf
63f09b1d21SJuergen-aus-Zuendorf       );
64f09b1d21SJuergen-aus-Zuendorf
65c83cd936SJuergen-aus-Zuendorf
66f09b1d21SJuergen-aus-Zuendorf      // Auslesen der Konfiguration für das Präfix der Vorlage-Dateien:
67c83cd936SJuergen-aus-Zuendorf
68f09b1d21SJuergen-aus-Zuendorf      $pre_nsp = $this->getConf('prefix_namespace');
69c83cd936SJuergen-aus-Zuendorf
70f09b1d21SJuergen-aus-Zuendorf      if ($pre_nsp != '') {
71c83cd936SJuergen-aus-Zuendorf
72f09b1d21SJuergen-aus-Zuendorf         $pre_nsp = '/'.$pre_nsp.'_';
73c83cd936SJuergen-aus-Zuendorf
74f09b1d21SJuergen-aus-Zuendorf      } else {
75c83cd936SJuergen-aus-Zuendorf
76f09b1d21SJuergen-aus-Zuendorf         $pre_nsp = '/_';   // Defaultwert 1 Unterstrich für Namespace
77c83cd936SJuergen-aus-Zuendorf
78f09b1d21SJuergen-aus-Zuendorf      };
79c83cd936SJuergen-aus-Zuendorf
80f09b1d21SJuergen-aus-Zuendorf      $pre_sub = $this->getConf('prefix_subnamespace');
81c83cd936SJuergen-aus-Zuendorf
82f09b1d21SJuergen-aus-Zuendorf      if ($pre_sub != '') {
83c83cd936SJuergen-aus-Zuendorf
84f09b1d21SJuergen-aus-Zuendorf         $pre_sub = '/'.$pre_sub.'_';
85c83cd936SJuergen-aus-Zuendorf
86f09b1d21SJuergen-aus-Zuendorf      } else {
87c83cd936SJuergen-aus-Zuendorf
88f09b1d21SJuergen-aus-Zuendorf         $pre_sub = '/__';  // Defaultwert 2 Unterstriche für Sub-Namespace
89c83cd936SJuergen-aus-Zuendorf
90f09b1d21SJuergen-aus-Zuendorf      };
91f09b1d21SJuergen-aus-Zuendorf
92c83cd936SJuergen-aus-Zuendorf
93f09b1d21SJuergen-aus-Zuendorf       $footerpath = '';
94c83cd936SJuergen-aus-Zuendorf
95f09b1d21SJuergen-aus-Zuendorf      $templatename = 'footer.txt';   // Name der Vorlage
96c83cd936SJuergen-aus-Zuendorf
97f09b1d21SJuergen-aus-Zuendorf       $path = dirname(wikiFN($ID));
98c83cd936SJuergen-aus-Zuendorf
99f09b1d21SJuergen-aus-Zuendorf       if (@file_exists($path.$pre_nsp.$templatename)) {
100c83cd936SJuergen-aus-Zuendorf
101f09b1d21SJuergen-aus-Zuendorf           $footerpath = $path.$pre_nsp.$templatename;
102c83cd936SJuergen-aus-Zuendorf
103f09b1d21SJuergen-aus-Zuendorf       } else {
104c83cd936SJuergen-aus-Zuendorf
105f09b1d21SJuergen-aus-Zuendorf           // search upper namespaces for templates
106c83cd936SJuergen-aus-Zuendorf
107f09b1d21SJuergen-aus-Zuendorf           $len = strlen(rtrim($conf['datadir'], '/'));
108c83cd936SJuergen-aus-Zuendorf
109f09b1d21SJuergen-aus-Zuendorf           while (strlen($path) >= $len) {
110c83cd936SJuergen-aus-Zuendorf
111f09b1d21SJuergen-aus-Zuendorf               if (@file_exists($path.$pre_sub.$templatename)) {
112c83cd936SJuergen-aus-Zuendorf
113f09b1d21SJuergen-aus-Zuendorf                   $footerpath = $path.$pre_sub.$templatename;
114c83cd936SJuergen-aus-Zuendorf
115f09b1d21SJuergen-aus-Zuendorf                   break;
116c83cd936SJuergen-aus-Zuendorf
117f09b1d21SJuergen-aus-Zuendorf               }
118f09b1d21SJuergen-aus-Zuendorf
119c83cd936SJuergen-aus-Zuendorf               $path = substr($path, 0, strrpos($path, '/'));
120c83cd936SJuergen-aus-Zuendorf
121c83cd936SJuergen-aus-Zuendorf           }
122c83cd936SJuergen-aus-Zuendorf
123c83cd936SJuergen-aus-Zuendorf       }
124c83cd936SJuergen-aus-Zuendorf
125c83cd936SJuergen-aus-Zuendorf
126f09b1d21SJuergen-aus-Zuendorf       if (!empty($footerpath)) {
127c83cd936SJuergen-aus-Zuendorf
128c5828f78SJuergen-aus-Zuendorf         $content = $event->data;
129c83cd936SJuergen-aus-Zuendorf
130c5828f78SJuergen-aus-Zuendorf         if(strpos($content,"~~NOFOOTER~~") == false) {
131c83cd936SJuergen-aus-Zuendorf
132c5828f78SJuergen-aus-Zuendorf            // Prüfung. ob der Befehl "~~NOFOOTER~~" im Quelltext enthalten ist
133c83cd936SJuergen-aus-Zuendorf
134f09b1d21SJuergen-aus-Zuendorf            $footer = file_get_contents($footerpath);
135c83cd936SJuergen-aus-Zuendorf
136f09b1d21SJuergen-aus-Zuendorf            if ($footer !== false) {
137c83cd936SJuergen-aus-Zuendorf
138f09b1d21SJuergen-aus-Zuendorf               $data['tpl'] = cleanText($footer);
139c83cd936SJuergen-aus-Zuendorf
140f09b1d21SJuergen-aus-Zuendorf               $footer = parsePageTemplate($data);
141c83cd936SJuergen-aus-Zuendorf
142f09b1d21SJuergen-aus-Zuendorf               if ($this->getConf('separation') == 'paragraph') {
143c83cd936SJuergen-aus-Zuendorf
144f09b1d21SJuergen-aus-Zuendorf                  // Wenn Absätze zum Teilen verwendet werden
145c83cd936SJuergen-aus-Zuendorf
146f09b1d21SJuergen-aus-Zuendorf                  $footer = rtrim($footer, " \r\n\\") . "\n\n";
147c83cd936SJuergen-aus-Zuendorf
148f09b1d21SJuergen-aus-Zuendorf               }
149c83cd936SJuergen-aus-Zuendorf
150f09b1d21SJuergen-aus-Zuendorf               $event->data .= $footer;
151c83cd936SJuergen-aus-Zuendorf
152f09b1d21SJuergen-aus-Zuendorf            }
153c83cd936SJuergen-aus-Zuendorf
154c83cd936SJuergen-aus-Zuendorf            /*
155c83cd936SJuergen-aus-Zuendorf
156c83cd936SJuergen-aus-Zuendorf            // Code übernommen von Seite "https://www.dokuwiki.org/devel:event_handlers_code#caching":
157c83cd936SJuergen-aus-Zuendorf
158c83cd936SJuergen-aus-Zuendorf            $event->preventDefault();  // stop dokuwiki carrying out its own checks
159c83cd936SJuergen-aus-Zuendorf
160c83cd936SJuergen-aus-Zuendorf            $event->stopPropagation(); // avoid other handlers of this event, changing our decision here
161c83cd936SJuergen-aus-Zuendorf
162c83cd936SJuergen-aus-Zuendorf            $event->result = false;    // don't use the cached version
163c83cd936SJuergen-aus-Zuendorf
164c83cd936SJuergen-aus-Zuendorf            */
165c83cd936SJuergen-aus-Zuendorf
166c5828f78SJuergen-aus-Zuendorf         } else {
167c83cd936SJuergen-aus-Zuendorf
168c5828f78SJuergen-aus-Zuendorf            $event->data = str_replace('~~NOFOOTER~~','',$content);
169c83cd936SJuergen-aus-Zuendorf
170c5828f78SJuergen-aus-Zuendorf            // Befehl "~~NOFOOTER~~" soll nicht angezeigt werden
171c83cd936SJuergen-aus-Zuendorf
172c5828f78SJuergen-aus-Zuendorf         }
173c83cd936SJuergen-aus-Zuendorf
174c83cd936SJuergen-aus-Zuendorf      }
175c83cd936SJuergen-aus-Zuendorf
176c83cd936SJuergen-aus-Zuendorf   }
177c83cd936SJuergen-aus-Zuendorf
178c83cd936SJuergen-aus-Zuendorf
179c83cd936SJuergen-aus-Zuendorf   // Codeschnipsel aus Seite "https://github.com/MrBertie/pagequery/commit/6cae014dc7cc779c0be8d0a660af42407b414806":
180c83cd936SJuergen-aus-Zuendorf
181c83cd936SJuergen-aus-Zuendorf   /**
182c83cd936SJuergen-aus-Zuendorf
183c83cd936SJuergen-aus-Zuendorf    * Check for pages changes and eventually purge cache.
184c83cd936SJuergen-aus-Zuendorf
185c83cd936SJuergen-aus-Zuendorf    *
186c83cd936SJuergen-aus-Zuendorf
187c83cd936SJuergen-aus-Zuendorf    * @author Samuele Tognini <samuele@samuele.netsons.org>
188c83cd936SJuergen-aus-Zuendorf
189c83cd936SJuergen-aus-Zuendorf    *
190c83cd936SJuergen-aus-Zuendorf
191c83cd936SJuergen-aus-Zuendorf    * @param Doku_Event $event
192c83cd936SJuergen-aus-Zuendorf
193c83cd936SJuergen-aus-Zuendorf    * @param mixed     $param not defined
194c83cd936SJuergen-aus-Zuendorf
195c83cd936SJuergen-aus-Zuendorf    */
196c83cd936SJuergen-aus-Zuendorf
197c83cd936SJuergen-aus-Zuendorf   function _purgecache(&$event, $param) {
198c83cd936SJuergen-aus-Zuendorf
199c83cd936SJuergen-aus-Zuendorf       global $ID;
200c83cd936SJuergen-aus-Zuendorf
201c83cd936SJuergen-aus-Zuendorf       global $conf;
202c83cd936SJuergen-aus-Zuendorf
203c83cd936SJuergen-aus-Zuendorf       /** @var cache_parser $cache */
204c83cd936SJuergen-aus-Zuendorf
205c83cd936SJuergen-aus-Zuendorf       $cache = &$event->data;
206c83cd936SJuergen-aus-Zuendorf
207c83cd936SJuergen-aus-Zuendorf
208c83cd936SJuergen-aus-Zuendorf       if(!isset($cache->page)) return;
209c83cd936SJuergen-aus-Zuendorf
210c83cd936SJuergen-aus-Zuendorf       //purge only xhtml cache
211c83cd936SJuergen-aus-Zuendorf
212c83cd936SJuergen-aus-Zuendorf       if($cache->mode != "xhtml") return;
213c83cd936SJuergen-aus-Zuendorf
214c83cd936SJuergen-aus-Zuendorf       //Check if it is an pagequery page
215c83cd936SJuergen-aus-Zuendorf
216c83cd936SJuergen-aus-Zuendorf       if(!p_get_metadata($ID, 'pagequery')) return;
217c83cd936SJuergen-aus-Zuendorf
218c83cd936SJuergen-aus-Zuendorf       $aclcache = $this->getConf('aclcache');
219c83cd936SJuergen-aus-Zuendorf
220c83cd936SJuergen-aus-Zuendorf       if($conf['useacl']) {
221c83cd936SJuergen-aus-Zuendorf
222c83cd936SJuergen-aus-Zuendorf           $newkey = false;
223c83cd936SJuergen-aus-Zuendorf
224c83cd936SJuergen-aus-Zuendorf           if($aclcache == 'user') {
225c83cd936SJuergen-aus-Zuendorf
226c83cd936SJuergen-aus-Zuendorf               //Cache per user
227c83cd936SJuergen-aus-Zuendorf
228c83cd936SJuergen-aus-Zuendorf               if($_SERVER['REMOTE_USER']) $newkey = $_SERVER['REMOTE_USER'];
229c83cd936SJuergen-aus-Zuendorf
230c83cd936SJuergen-aus-Zuendorf           } else if($aclcache == 'groups') {
231c83cd936SJuergen-aus-Zuendorf
232c83cd936SJuergen-aus-Zuendorf               //Cache per groups
233c83cd936SJuergen-aus-Zuendorf
234c83cd936SJuergen-aus-Zuendorf               global $INFO;
235c83cd936SJuergen-aus-Zuendorf
236c83cd936SJuergen-aus-Zuendorf               if($INFO['userinfo']['grps']) $newkey = implode('#', $INFO['userinfo']['grps']);
237c83cd936SJuergen-aus-Zuendorf
238c83cd936SJuergen-aus-Zuendorf           }
239c83cd936SJuergen-aus-Zuendorf
240c83cd936SJuergen-aus-Zuendorf           if($newkey) {
241c83cd936SJuergen-aus-Zuendorf
242c83cd936SJuergen-aus-Zuendorf               $cache->key .= "#".$newkey;
243c83cd936SJuergen-aus-Zuendorf
244c83cd936SJuergen-aus-Zuendorf               $cache->cache = getCacheName($cache->key, $cache->ext);
245c83cd936SJuergen-aus-Zuendorf
246c83cd936SJuergen-aus-Zuendorf           }
247c83cd936SJuergen-aus-Zuendorf
248c83cd936SJuergen-aus-Zuendorf       }
249c83cd936SJuergen-aus-Zuendorf
250c83cd936SJuergen-aus-Zuendorf       //Check if a page is more recent than purgefile.
251c83cd936SJuergen-aus-Zuendorf
252c83cd936SJuergen-aus-Zuendorf       if(@filemtime($cache->cache) < @filemtime($conf['cachedir'].'/purgefile')) {
253c83cd936SJuergen-aus-Zuendorf
254c83cd936SJuergen-aus-Zuendorf           $event->preventDefault();
255c83cd936SJuergen-aus-Zuendorf
256c83cd936SJuergen-aus-Zuendorf           $event->stopPropagation();
257c83cd936SJuergen-aus-Zuendorf
258c83cd936SJuergen-aus-Zuendorf           $event->result = false;
259c83cd936SJuergen-aus-Zuendorf
260f09b1d21SJuergen-aus-Zuendorf       }
261f09b1d21SJuergen-aus-Zuendorf   }
262f09b1d21SJuergen-aus-Zuendorf}