xref: /plugin/combo/ComboStrap/Index.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1*c3437056SNickeau<?php
2*c3437056SNickeau
3*c3437056SNickeau
4*c3437056SNickeaunamespace ComboStrap;
5*c3437056SNickeau
6*c3437056SNickeau
7*c3437056SNickeauclass Index
8*c3437056SNickeau{
9*c3437056SNickeau    /**
10*c3437056SNickeau     * @var Index
11*c3437056SNickeau     */
12*c3437056SNickeau    private static $index;
13*c3437056SNickeau
14*c3437056SNickeau    /**
15*c3437056SNickeau     * @var \dokuwiki\Search\Indexer
16*c3437056SNickeau     */
17*c3437056SNickeau    private $indexer;
18*c3437056SNickeau
19*c3437056SNickeau
20*c3437056SNickeau    /**
21*c3437056SNickeau     * Index constructor.
22*c3437056SNickeau     */
23*c3437056SNickeau    public function __construct()
24*c3437056SNickeau    {
25*c3437056SNickeau        $this->indexer = idx_get_indexer();
26*c3437056SNickeau    }
27*c3437056SNickeau
28*c3437056SNickeau    public static function getOrCreate(): Index
29*c3437056SNickeau    {
30*c3437056SNickeau        if (self::$index === null) {
31*c3437056SNickeau            self::$index = new Index();
32*c3437056SNickeau        }
33*c3437056SNickeau        return self::$index;
34*c3437056SNickeau    }
35*c3437056SNickeau
36*c3437056SNickeau    public function getPagesForMedia(Media $media): array
37*c3437056SNickeau    {
38*c3437056SNickeau        $dokuwikiId = $media->getPath()->getDokuwikiId();
39*c3437056SNickeau        return $this->indexer->lookupKey('relation_media', $dokuwikiId);
40*c3437056SNickeau    }
41*c3437056SNickeau
42*c3437056SNickeau    /**
43*c3437056SNickeau     * Return a list of page id that have the same last name
44*c3437056SNickeau     *
45*c3437056SNickeau     * @param string $pageIdSource
46*c3437056SNickeau     * @return array
47*c3437056SNickeau     */
48*c3437056SNickeau    public function getPagesWithSameLastName(string $pageIdSource): array
49*c3437056SNickeau    {
50*c3437056SNickeau        /**
51*c3437056SNickeau         * * A shortcut to:
52*c3437056SNickeau         * ```
53*c3437056SNickeau         * $pagesWithSameName = ft_pageLookup($pageName);
54*c3437056SNickeau         * ```
55*c3437056SNickeau         * where {@link ft_pageLookup()}
56*c3437056SNickeau         */
57*c3437056SNickeau
58*c3437056SNickeau        // There is two much pages with the start name
59*c3437056SNickeau        $name = noNS($pageIdSource);
60*c3437056SNickeau        if ($name === Site::getHomePageName()) {
61*c3437056SNickeau            return [];
62*c3437056SNickeau        }
63*c3437056SNickeau
64*c3437056SNickeau        $pages = $this->indexer->getPages();
65*c3437056SNickeau
66*c3437056SNickeau        $matchesPages = [];
67*c3437056SNickeau        foreach ($pages as $pageId) {
68*c3437056SNickeau            if ($pageIdSource === $pageId) {
69*c3437056SNickeau                continue;
70*c3437056SNickeau            }
71*c3437056SNickeau            $page = DokuPath::createPagePathFromId($pageId);
72*c3437056SNickeau            if ($page->getLastName() === $name) {
73*c3437056SNickeau                $matchesPages[] = $pageId;
74*c3437056SNickeau            }
75*c3437056SNickeau        }
76*c3437056SNickeau        return $matchesPages;
77*c3437056SNickeau
78*c3437056SNickeau    }
79*c3437056SNickeau
80*c3437056SNickeau    public function deletePage(Page $page)
81*c3437056SNickeau    {
82*c3437056SNickeau
83*c3437056SNickeau        $this->indexer->deletePage($page->getDokuwikiId());
84*c3437056SNickeau
85*c3437056SNickeau    }
86*c3437056SNickeau}
87