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