xref: /plugin/combo/action/pagesystemmutation.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
3*04fd306cSNickeauuse ComboStrap\ComboFs;
4*04fd306cSNickeauuse ComboStrap\DatabasePageRow;
54cadd4f8SNickeauuse ComboStrap\Event;
6*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
7*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
8*04fd306cSNickeauuse ComboStrap\ExecutionContext;
94cadd4f8SNickeauuse ComboStrap\FileSystems;
104cadd4f8SNickeauuse ComboStrap\LocalPath;
11*04fd306cSNickeauuse ComboStrap\LogUtility;
12*04fd306cSNickeauuse ComboStrap\MarkupCacheDependencies;
13*04fd306cSNickeauuse ComboStrap\MarkupPath;
14*04fd306cSNickeauuse ComboStrap\PageId;
154cadd4f8SNickeauuse ComboStrap\PagePath;
164cadd4f8SNickeauuse ComboStrap\Site;
17*04fd306cSNickeauuse ComboStrap\SlotSystem;
184cadd4f8SNickeau
194cadd4f8SNickeau
204cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
214cadd4f8SNickeau
224cadd4f8SNickeau/**
234cadd4f8SNickeau * When a page is added or deleted from the file system
244cadd4f8SNickeau */
254cadd4f8SNickeauclass action_plugin_combo_pagesystemmutation extends DokuWiki_Action_Plugin
264cadd4f8SNickeau{
274cadd4f8SNickeau
284cadd4f8SNickeau
294cadd4f8SNickeau    public const PAGE_SYSTEM_MUTATION_EVENT_NAME = 'page_system_mutation';
304cadd4f8SNickeau
314cadd4f8SNickeau    const TYPE_ATTRIBUTE = "type";
324cadd4f8SNickeau    const TYPE_CREATION = "creation";
334cadd4f8SNickeau    const TYPE_DELETION = "deletion";
34*04fd306cSNickeau    const CANONICAL = "combo-file-system";
354cadd4f8SNickeau
364cadd4f8SNickeau
374cadd4f8SNickeau    public function register(Doku_Event_Handler $controller)
384cadd4f8SNickeau    {
394cadd4f8SNickeau
404cadd4f8SNickeau
414cadd4f8SNickeau        /**
42*04fd306cSNickeau         *
43*04fd306cSNickeau         * And To delete sidebar (cache) cache when a page was modified in a namespace
444cadd4f8SNickeau         * https://combostrap.com/sideslots
454cadd4f8SNickeau         */
464cadd4f8SNickeau        $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'createFileSystemMutation', array());
474cadd4f8SNickeau
484cadd4f8SNickeau        /**
49*04fd306cSNickeau         * Synchronization with the combo file system
50*04fd306cSNickeau         */
51*04fd306cSNickeau        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'comboFsSynchronization', array());
52*04fd306cSNickeau
53*04fd306cSNickeau        /**
544cadd4f8SNickeau         * process the Async event
554cadd4f8SNickeau         */
564cadd4f8SNickeau        $controller->register_hook(self::PAGE_SYSTEM_MUTATION_EVENT_NAME, 'AFTER', $this, 'handleFileSystemMutation');
574cadd4f8SNickeau
584cadd4f8SNickeau    }
594cadd4f8SNickeau
604cadd4f8SNickeau    /**
614cadd4f8SNickeau     * @param $event
624cadd4f8SNickeau     * @throws Exception
634cadd4f8SNickeau     * @link https://www.dokuwiki.org/devel:event:io_wikipage_write
64*04fd306cSNickeau     *
65*04fd306cSNickeau     * On update to an existing page this event is called twice, once for the transfer of the old version to the attic
66*04fd306cSNickeau     * (rev will have a value)
67*04fd306cSNickeau     * and once to write the new version of the page into the wiki (rev is false)
684cadd4f8SNickeau     */
694cadd4f8SNickeau    function createFileSystemMutation($event)
704cadd4f8SNickeau    {
714cadd4f8SNickeau
724cadd4f8SNickeau        $data = $event->data;
734cadd4f8SNickeau        $pageName = $data[2];
744cadd4f8SNickeau
754cadd4f8SNickeau        /**
764cadd4f8SNickeau         * Modification to the secondary slot are not processed
774cadd4f8SNickeau         */
78*04fd306cSNickeau        if (in_array($pageName, SlotSystem::getSlotNames())) return;
794cadd4f8SNickeau
804cadd4f8SNickeau
814cadd4f8SNickeau        /**
82*04fd306cSNickeau         * TODO ?: the common uses the  common_wikipage_save instead ?
83*04fd306cSNickeau         *   https://www.dokuwiki.org/devel:event:common_wikipage_save
844cadd4f8SNickeau         * File creation
854cadd4f8SNickeau         *
864cadd4f8SNickeau         * ```
874cadd4f8SNickeau         * Page creation may be detected by checking if the file already exists and the revision is false.
884cadd4f8SNickeau         * ```
894cadd4f8SNickeau         * From https://www.dokuwiki.org/devel:event:io_wikipage_write
904cadd4f8SNickeau         *
914cadd4f8SNickeau         */
924cadd4f8SNickeau        $rev = $data[3];
934cadd4f8SNickeau        $filePath = $data[0][0];
94*04fd306cSNickeau        $file = LocalPath::createFromPathString($filePath);
954cadd4f8SNickeau        if (!FileSystems::exists($file) && $rev === false) {
964cadd4f8SNickeau            Event::createEvent(
974cadd4f8SNickeau                action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME,
984cadd4f8SNickeau                [
994cadd4f8SNickeau                    self::TYPE_ATTRIBUTE => self::TYPE_CREATION,
100*04fd306cSNickeau                    PagePath::getPersistentName() => $file->toWikiPath()->toAbsoluteId()
1014cadd4f8SNickeau                ]
1024cadd4f8SNickeau            );
1034cadd4f8SNickeau            return;
1044cadd4f8SNickeau        }
1054cadd4f8SNickeau
1064cadd4f8SNickeau        /**
1074cadd4f8SNickeau         * File deletion
1084cadd4f8SNickeau         * (No content)
1094cadd4f8SNickeau         *
1104cadd4f8SNickeau         * ```
1114cadd4f8SNickeau         * Page deletion may be detected by checking for empty page content.
112*04fd306cSNickeau         * On update to an existing page this event is called twice, once for the transfer
113*04fd306cSNickeau         * of the old version to the attic (rev will have a value)
1144cadd4f8SNickeau         * and once to write the new version of the page into the wiki (rev is false)
1154cadd4f8SNickeau         * ```
1164cadd4f8SNickeau         * From https://www.dokuwiki.org/devel:event:io_wikipage_write
1174cadd4f8SNickeau         */
1184cadd4f8SNickeau        $append = $data[0][2];
1194cadd4f8SNickeau        if (!$append) {
1204cadd4f8SNickeau
1214cadd4f8SNickeau            $content = $data[0][1];
1224cadd4f8SNickeau            if (empty($content) && $rev === false) {
1234cadd4f8SNickeau                // Deletion
1244cadd4f8SNickeau                Event::createEvent(
1254cadd4f8SNickeau                    action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME,
1264cadd4f8SNickeau                    [
1274cadd4f8SNickeau                        self::TYPE_ATTRIBUTE => self::TYPE_DELETION,
128*04fd306cSNickeau                        PagePath::getPersistentName() => $file->toWikiPath()->toAbsoluteId()
1294cadd4f8SNickeau                    ]
1304cadd4f8SNickeau                );
1314cadd4f8SNickeau            }
1324cadd4f8SNickeau        }
1334cadd4f8SNickeau
1344cadd4f8SNickeau    }
1354cadd4f8SNickeau
1364cadd4f8SNickeau    public function handleFileSystemMutation($event)
1374cadd4f8SNickeau    {
1384cadd4f8SNickeau
1394cadd4f8SNickeau        /**
1404cadd4f8SNickeau         * We need to re-render the slot
141*04fd306cSNickeau         * that are {@link \ComboStrap\MarkupCacheDependencies::PAGE_SYSTEM_DEPENDENCY}
1424cadd4f8SNickeau         * dependent
1434cadd4f8SNickeau         */
1444cadd4f8SNickeau        $data = $event->data;
1454cadd4f8SNickeau
1464cadd4f8SNickeau        /**
1474cadd4f8SNickeau         * Re-render
1484cadd4f8SNickeau         */
149*04fd306cSNickeau        $pathAddedOrDeleted = $data[PagePath::getPersistentName()];
150*04fd306cSNickeau        MarkupCacheDependencies::reRenderSideSlotIfNeeded(
151*04fd306cSNickeau            $pathAddedOrDeleted,
152*04fd306cSNickeau            MarkupCacheDependencies::PAGE_SYSTEM_DEPENDENCY,
1534cadd4f8SNickeau            self::PAGE_SYSTEM_MUTATION_EVENT_NAME
1544cadd4f8SNickeau        );
1554cadd4f8SNickeau
1564cadd4f8SNickeau    }
1574cadd4f8SNickeau
158*04fd306cSNickeau    /**
159*04fd306cSNickeau     * Store into the Combo file system
160*04fd306cSNickeau     * @param $event
161*04fd306cSNickeau     * @return void
162*04fd306cSNickeau     */
163*04fd306cSNickeau    public function comboFsSynchronization($event)
164*04fd306cSNickeau    {
165*04fd306cSNickeau
166*04fd306cSNickeau        $id = $event->data['id'];
167*04fd306cSNickeau        $markup = MarkupPath::createMarkupFromId($id);
168*04fd306cSNickeau
169*04fd306cSNickeau        $changedType = $event->data['changeType'];
170*04fd306cSNickeau        switch ($changedType) {
171*04fd306cSNickeau            // creation
172*04fd306cSNickeau            case DOKU_CHANGE_TYPE_CREATE:
173*04fd306cSNickeau                /**
174*04fd306cSNickeau                 * For now, we just sync the page id in the index tables (pages)
175*04fd306cSNickeau                 *
176*04fd306cSNickeau                 * This is mandatory to allow permanent url redirection {@link PageUrlType})
177*04fd306cSNickeau                 */
178*04fd306cSNickeau                if (action_plugin_combo_linkmove::isMoveOperation()) {
179*04fd306cSNickeau                    /**
180*04fd306cSNickeau                     * Is this a creation from a move ?
181*04fd306cSNickeau                     */
182*04fd306cSNickeau                    return;
183*04fd306cSNickeau                }
184*04fd306cSNickeau                try {
185*04fd306cSNickeau                    PageId::createForPage($markup)
186*04fd306cSNickeau                        ->getValue();
187*04fd306cSNickeau                } catch (ExceptionNotFound $e) {
188*04fd306cSNickeau                    ComboFs::createIfNotExists($markup);
189*04fd306cSNickeau                }
190*04fd306cSNickeau                return;
191*04fd306cSNickeau            case DOKU_CHANGE_TYPE_DELETE:
192*04fd306cSNickeau                /**
193*04fd306cSNickeau                 * Is this a delete from a move ?
194*04fd306cSNickeau                 */
195*04fd306cSNickeau                if (action_plugin_combo_linkmove::isMoveOperation()) {
196*04fd306cSNickeau                    return;
197*04fd306cSNickeau                }
198*04fd306cSNickeau                ComboFs::delete($markup);
199*04fd306cSNickeau                return;
200*04fd306cSNickeau        }
201*04fd306cSNickeau
202*04fd306cSNickeau
203*04fd306cSNickeau    }
2044cadd4f8SNickeau
2054cadd4f8SNickeau}
2064cadd4f8SNickeau
2074cadd4f8SNickeau
2084cadd4f8SNickeau
209