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