xref: /plugin/combo/action/pagesystemmutation.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
1*4cadd4f8SNickeau<?php
2*4cadd4f8SNickeau
3*4cadd4f8SNickeauuse ComboStrap\CacheDependencies;
4*4cadd4f8SNickeauuse ComboStrap\Event;
5*4cadd4f8SNickeauuse ComboStrap\FileSystems;
6*4cadd4f8SNickeauuse ComboStrap\LocalPath;
7*4cadd4f8SNickeauuse ComboStrap\Page;
8*4cadd4f8SNickeauuse ComboStrap\PagePath;
9*4cadd4f8SNickeauuse ComboStrap\Site;
10*4cadd4f8SNickeau
11*4cadd4f8SNickeau
12*4cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
13*4cadd4f8SNickeau
14*4cadd4f8SNickeau/**
15*4cadd4f8SNickeau * When a page is added or deleted from the file system
16*4cadd4f8SNickeau */
17*4cadd4f8SNickeauclass action_plugin_combo_pagesystemmutation extends DokuWiki_Action_Plugin
18*4cadd4f8SNickeau{
19*4cadd4f8SNickeau
20*4cadd4f8SNickeau
21*4cadd4f8SNickeau    public const PAGE_SYSTEM_MUTATION_EVENT_NAME = 'page_system_mutation';
22*4cadd4f8SNickeau
23*4cadd4f8SNickeau    const TYPE_ATTRIBUTE = "type";
24*4cadd4f8SNickeau    const TYPE_CREATION = "creation";
25*4cadd4f8SNickeau    const TYPE_DELETION = "deletion";
26*4cadd4f8SNickeau
27*4cadd4f8SNickeau
28*4cadd4f8SNickeau    public function register(Doku_Event_Handler $controller)
29*4cadd4f8SNickeau    {
30*4cadd4f8SNickeau
31*4cadd4f8SNickeau
32*4cadd4f8SNickeau        /**
33*4cadd4f8SNickeau         * To delete sidebar (cache) cache when a page was modified in a namespace
34*4cadd4f8SNickeau         * https://combostrap.com/sideslots
35*4cadd4f8SNickeau         */
36*4cadd4f8SNickeau        $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'createFileSystemMutation', array());
37*4cadd4f8SNickeau
38*4cadd4f8SNickeau        /**
39*4cadd4f8SNickeau         * process the Async event
40*4cadd4f8SNickeau         */
41*4cadd4f8SNickeau        $controller->register_hook(self::PAGE_SYSTEM_MUTATION_EVENT_NAME, 'AFTER', $this, 'handleFileSystemMutation');
42*4cadd4f8SNickeau
43*4cadd4f8SNickeau    }
44*4cadd4f8SNickeau
45*4cadd4f8SNickeau    /**
46*4cadd4f8SNickeau     * @param $event
47*4cadd4f8SNickeau     * @throws Exception
48*4cadd4f8SNickeau     * @link https://www.dokuwiki.org/devel:event:io_wikipage_write
49*4cadd4f8SNickeau     */
50*4cadd4f8SNickeau    function createFileSystemMutation($event)
51*4cadd4f8SNickeau    {
52*4cadd4f8SNickeau
53*4cadd4f8SNickeau        $data = $event->data;
54*4cadd4f8SNickeau        $pageName = $data[2];
55*4cadd4f8SNickeau
56*4cadd4f8SNickeau        /**
57*4cadd4f8SNickeau         * Modification to the secondary slot are not processed
58*4cadd4f8SNickeau         */
59*4cadd4f8SNickeau        if (in_array($pageName, Site::getSecondarySlotNames())) return;
60*4cadd4f8SNickeau
61*4cadd4f8SNickeau
62*4cadd4f8SNickeau        /**
63*4cadd4f8SNickeau         * File creation
64*4cadd4f8SNickeau         *
65*4cadd4f8SNickeau         * ```
66*4cadd4f8SNickeau         * Page creation may be detected by checking if the file already exists and the revision is false.
67*4cadd4f8SNickeau         * ```
68*4cadd4f8SNickeau         * From https://www.dokuwiki.org/devel:event:io_wikipage_write
69*4cadd4f8SNickeau         *
70*4cadd4f8SNickeau         */
71*4cadd4f8SNickeau        $rev = $data[3];
72*4cadd4f8SNickeau        $filePath = $data[0][0];
73*4cadd4f8SNickeau        $file = LocalPath::createFromPath($filePath);
74*4cadd4f8SNickeau        if (!FileSystems::exists($file) && $rev === false) {
75*4cadd4f8SNickeau            Event::createEvent(
76*4cadd4f8SNickeau                action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME,
77*4cadd4f8SNickeau                [
78*4cadd4f8SNickeau                    self::TYPE_ATTRIBUTE => self::TYPE_CREATION,
79*4cadd4f8SNickeau                    PagePath::getPersistentName() => $file->toDokuPath()->toString()
80*4cadd4f8SNickeau                ]
81*4cadd4f8SNickeau            );
82*4cadd4f8SNickeau            return;
83*4cadd4f8SNickeau        }
84*4cadd4f8SNickeau
85*4cadd4f8SNickeau        /**
86*4cadd4f8SNickeau         * File deletion
87*4cadd4f8SNickeau         * (No content)
88*4cadd4f8SNickeau         *
89*4cadd4f8SNickeau         * ```
90*4cadd4f8SNickeau         * Page deletion may be detected by checking for empty page content.
91*4cadd4f8SNickeau         * On update to an existing page this event is called twice, once for the transfer of the old version to the attic (rev will have a value)
92*4cadd4f8SNickeau         * and once to write the new version of the page into the wiki (rev is false)
93*4cadd4f8SNickeau         * ```
94*4cadd4f8SNickeau         * From https://www.dokuwiki.org/devel:event:io_wikipage_write
95*4cadd4f8SNickeau         */
96*4cadd4f8SNickeau        $append = $data[0][2];
97*4cadd4f8SNickeau        if (!$append) {
98*4cadd4f8SNickeau
99*4cadd4f8SNickeau            $content = $data[0][1];
100*4cadd4f8SNickeau            if (empty($content) && $rev === false) {
101*4cadd4f8SNickeau                // Deletion
102*4cadd4f8SNickeau                Event::createEvent(
103*4cadd4f8SNickeau                    action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME,
104*4cadd4f8SNickeau                    [
105*4cadd4f8SNickeau                        self::TYPE_ATTRIBUTE => self::TYPE_DELETION,
106*4cadd4f8SNickeau                        PagePath::getPersistentName() => $file->toDokuPath()->toString()
107*4cadd4f8SNickeau                    ]
108*4cadd4f8SNickeau                );
109*4cadd4f8SNickeau            }
110*4cadd4f8SNickeau        }
111*4cadd4f8SNickeau
112*4cadd4f8SNickeau    }
113*4cadd4f8SNickeau
114*4cadd4f8SNickeau    public function handleFileSystemMutation($event)
115*4cadd4f8SNickeau    {
116*4cadd4f8SNickeau
117*4cadd4f8SNickeau        /**
118*4cadd4f8SNickeau         * We need to re-render the slot
119*4cadd4f8SNickeau         * that are {@link \ComboStrap\CacheDependencies::PAGE_SYSTEM_DEPENDENCY}
120*4cadd4f8SNickeau         * dependent
121*4cadd4f8SNickeau         */
122*4cadd4f8SNickeau        $data = $event->data;
123*4cadd4f8SNickeau
124*4cadd4f8SNickeau        /**
125*4cadd4f8SNickeau         * Re-render
126*4cadd4f8SNickeau         */
127*4cadd4f8SNickeau        $path = $data[PagePath::getPersistentName()];
128*4cadd4f8SNickeau        CacheDependencies::reRenderSecondarySlotsIfNeeded(
129*4cadd4f8SNickeau            $path,
130*4cadd4f8SNickeau            CacheDependencies::PAGE_SYSTEM_DEPENDENCY,
131*4cadd4f8SNickeau            self::PAGE_SYSTEM_MUTATION_EVENT_NAME
132*4cadd4f8SNickeau        );
133*4cadd4f8SNickeau
134*4cadd4f8SNickeau    }
135*4cadd4f8SNickeau
136*4cadd4f8SNickeau
137*4cadd4f8SNickeau}
138*4cadd4f8SNickeau
139*4cadd4f8SNickeau
140*4cadd4f8SNickeau
141