xref: /template/strap/action/linkwizard.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeauuse ComboStrap\ExceptionCombo;
4c3437056SNickeauuse ComboStrap\Json;
5c3437056SNickeauuse ComboStrap\LogUtility;
6c3437056SNickeauuse ComboStrap\PluginUtility;
7c3437056SNickeauuse ComboStrap\Sqlite;
8*4cadd4f8SNickeauuse ComboStrap\StringUtility;
9c3437056SNickeau
10c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
11c3437056SNickeau
12c3437056SNickeau
13c3437056SNickeau/**
14c3437056SNickeau * Set the home of the web site documentation
15c3437056SNickeau */
16c3437056SNickeauclass action_plugin_combo_linkwizard extends DokuWiki_Action_Plugin
17c3437056SNickeau{
18c3437056SNickeau
19c3437056SNickeau    const CONF_ENABLE_ENHANCED_LINK_WIZARD = "enableEnhancedLinkWizard";
20c3437056SNickeau    const CANONICAL = "linkwizard";
21c3437056SNickeau
22c3437056SNickeau    /**
23c3437056SNickeau     * @param Doku_Event_Handler $controller
24c3437056SNickeau     */
25c3437056SNickeau    function register(Doku_Event_Handler $controller)
26c3437056SNickeau    {
27c3437056SNickeau
28c3437056SNickeau        /**
29c3437056SNickeau         * https://www.dokuwiki.org/devel:event:search_query_pagelookup
30c3437056SNickeau         */
31c3437056SNickeau        $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'searchPage', array());
32c3437056SNickeau
33c3437056SNickeau    }
34c3437056SNickeau
35c3437056SNickeau
36c3437056SNickeau    /**
37c3437056SNickeau     * Modify the returned pages
38c3437056SNickeau     * The {@link callLinkWiz} of inc/Ajax.php do
39c3437056SNickeau     * just a page search with {@link ft_pageLookup()}
40c3437056SNickeau     * https://www.dokuwiki.org/search
41c3437056SNickeau     * @param Doku_Event $event
42c3437056SNickeau     * @param $params
43c3437056SNickeau     * The path are initialized in {@link init_paths}
44c3437056SNickeau     * @return void
45c3437056SNickeau     */
46c3437056SNickeau    function searchPage(Doku_Event $event, $params)
47c3437056SNickeau    {
48c3437056SNickeau        global $INPUT;
49c3437056SNickeau        /**
50c3437056SNickeau         * linkwiz is the editor toolbar action
51c3437056SNickeau         * qsearch is the search button
52c3437056SNickeau         */
53c3437056SNickeau        $postCall = $INPUT->post->str('call');
54c3437056SNickeau        if (!(in_array($postCall, ["linkwiz", "qsearch", action_plugin_combo_search::CALL]))) {
55c3437056SNickeau            return;
56c3437056SNickeau        }
57c3437056SNickeau        if (PluginUtility::getConfValue(self::CONF_ENABLE_ENHANCED_LINK_WIZARD, 1) === 0) {
58c3437056SNickeau            return;
59c3437056SNickeau        }
60c3437056SNickeau        $sqlite = Sqlite::createOrGetSqlite();
61c3437056SNickeau        if ($sqlite === null) {
62c3437056SNickeau            return;
63c3437056SNickeau        }
64c3437056SNickeau
65c3437056SNickeau        $searchTerm = $event->data["id"]; // yes id is the search term
66*4cadd4f8SNickeau        $minimalWordLength = 3;
67*4cadd4f8SNickeau        if (strlen($searchTerm) < $minimalWordLength) {
68c3437056SNickeau            return;
69c3437056SNickeau        }
70*4cadd4f8SNickeau        $searchTermWords = StringUtility::getWords($searchTerm);
71*4cadd4f8SNickeau        if (sizeOf($searchTermWords) === 0) {
72*4cadd4f8SNickeau            return;
73*4cadd4f8SNickeau        }
74*4cadd4f8SNickeau        $sqlParameters = [];
75*4cadd4f8SNickeau        $sqlPredicates = [];
76*4cadd4f8SNickeau        foreach ($searchTermWords as $searchTermWord) {
77*4cadd4f8SNickeau            if (strlen($searchTermWord) < $minimalWordLength) {
78*4cadd4f8SNickeau                continue;
79*4cadd4f8SNickeau            }
80*4cadd4f8SNickeau            $pattern = "%$searchTermWord%";
81*4cadd4f8SNickeau            $sqlParameters = array_merge([$pattern, $pattern, $pattern, $pattern, $pattern], $sqlParameters);
82*4cadd4f8SNickeau            $sqlPredicates[] = "(id like ? COLLATE NOCASE or H1 like ? COLLATE NOCASE or title like ? COLLATE NOCASE or name like ? COLLATE NOCASE or path like ? COLLATE NOCASE)";
83*4cadd4f8SNickeau        }
84*4cadd4f8SNickeau        $sqlPredicate = implode(" and ", $sqlPredicates);
85*4cadd4f8SNickeau        $searchTermSql = <<<EOF
86*4cadd4f8SNickeauselect id as "id", title as "title" from pages where $sqlPredicate order by id ASC;
87c3437056SNickeauEOF;
88c3437056SNickeau        $rows = [];
89c3437056SNickeau        $request = $sqlite
90c3437056SNickeau            ->createRequest()
91*4cadd4f8SNickeau            ->setQueryParametrized($searchTermSql, $sqlParameters);
92c3437056SNickeau        try {
93c3437056SNickeau            $rows = $request
94c3437056SNickeau                ->execute()
95c3437056SNickeau                ->getRows();
96c3437056SNickeau        } catch (ExceptionCombo $e) {
97c3437056SNickeau            LogUtility::msg("Error while trying to retrieve a list of page", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
98c3437056SNickeau        } finally {
99c3437056SNickeau            $request->close();
100c3437056SNickeau        }
101c3437056SNickeau
102c3437056SNickeau        foreach ($rows as $row) {
103c3437056SNickeau            $event->result[$row["id"]] = $row["title"];
104c3437056SNickeau        }
105c3437056SNickeau
106c3437056SNickeau
107c3437056SNickeau    }
108c3437056SNickeau
109c3437056SNickeau
110c3437056SNickeau}
111