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