1<?php
2/**
3 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
4 * @author     Jonas Fourquier <jonas@tuxfamily.org>
5 */
6
7if(!defined('DOKU_INC')) die();
8
9if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
10require_once(DOKU_PLUGIN.'action.php');
11
12class action_plugin_page4release extends DokuWiki_Action_Plugin {
13
14    function getInfo() {
15        return confToHash(dirname(__FILE__).'/info.txt');
16    }
17
18    function register(&$contr) {
19        $contr->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'indexer', array());
20    }
21
22    function indexer(&$event, $param) {
23        global $conf, $ACT, $ID;
24        if ($ACT != 'preview' && !$REV) {
25            $page4release = unserialize(io_readFile($conf['indexdir'].'/page4release.idx', false));
26            $filename = array_pop(explode(':',$ID));
27            $release = p_get_metadata($ID, 'page4release',True);
28            if ((is_array($page4release)) && (array_key_exists($filename, $page4release))) {
29                // Le nom de page se trouve déjà dans l'index
30                if (    (array_key_exists($ID,$page4release[$filename]) && ($page4release[$filename][$ID] != $release))
31                     || (!array_key_exists($ID,$page4release[$filename]) && ($release))
32                   ) {
33                    // La page qu'on modifie se trouve déjà dans l'index et release à été modifié.
34                    // OU
35                    // La page qu'on modifie ne se trouve pas dans l'index et une release est spécifié.
36                    // Parcours l'ensemble des ID avec le même filename pour purger leur cache.
37                    foreach ($page4release[$filename] as $otherId=>$otherRelease) {
38                        if ($otherId != $ID)
39                            p_set_metadata($otherId, array('cache' => 'expire'), False, False);
40                    }
41                }
42                if ($release)
43                    // contient une chaine, ajout / met a jour l'index
44                    $page4release[$filename][$ID] = $release;
45                else
46                    // ne contient plus de chaine, y supprime de l'index
47                    unset($page4release[$filename][$ID]);
48            } elseif ($release) {
49                // Ne se trouve pas encore dans l'index mais contient une chaine, y ajoute
50                $page4release[$filename] = array($ID => $release);
51            }
52            io_saveFile($conf['indexdir'].'/page4release.idx', serialize($page4release));
53        }
54    }
55}
56