xref: /plugin/struct/meta/CSVSerialImporter.php (revision ad86a8246773ce555271b9f3e75eb4f5fbf66227)
1*ad86a824SAnna Dabrowska<?php
2*ad86a824SAnna Dabrowska
3*ad86a824SAnna Dabrowskanamespace dokuwiki\plugin\struct\meta;
4*ad86a824SAnna Dabrowska
5*ad86a824SAnna Dabrowskaclass CSVSerialImporter extends CSVImporter
6*ad86a824SAnna Dabrowska{
7*ad86a824SAnna Dabrowska
8*ad86a824SAnna Dabrowska    /** @var bool[]  */
9*ad86a824SAnna Dabrowska    protected $createPage = [];
10*ad86a824SAnna Dabrowska
11*ad86a824SAnna Dabrowska    /**
12*ad86a824SAnna Dabrowska     * Import page schema only when the pid header is present.
13*ad86a824SAnna Dabrowska     */
14*ad86a824SAnna Dabrowska    protected function readHeaders()
15*ad86a824SAnna Dabrowska    {
16*ad86a824SAnna Dabrowska        parent::readHeaders();
17*ad86a824SAnna Dabrowska        if (!in_array('pid', $this->header)) throw new StructException('There is no "pid" header in the CSV. Schema not imported.');
18*ad86a824SAnna Dabrowska    }
19*ad86a824SAnna Dabrowska
20*ad86a824SAnna Dabrowska    /**
21*ad86a824SAnna Dabrowska     * Add the revision.
22*ad86a824SAnna Dabrowska     *
23*ad86a824SAnna Dabrowska     * @param string[] $values
24*ad86a824SAnna Dabrowska     */
25*ad86a824SAnna Dabrowska    protected function saveLine($values)
26*ad86a824SAnna Dabrowska    {
27*ad86a824SAnna Dabrowska        // create new page
28*ad86a824SAnna Dabrowska        $pid = cleanID($values[0]);
29*ad86a824SAnna Dabrowska        if ($this->createPage[$pid]) {
30*ad86a824SAnna Dabrowska            $this->createPage($pid, $values);
31*ad86a824SAnna Dabrowska        }
32*ad86a824SAnna Dabrowska
33*ad86a824SAnna Dabrowska        parent::saveLine($values);
34*ad86a824SAnna Dabrowska    }
35*ad86a824SAnna Dabrowska
36*ad86a824SAnna Dabrowska    /**
37*ad86a824SAnna Dabrowska     * Create a page with serial syntax, either from a namespace template with _serial suffix
38*ad86a824SAnna Dabrowska     * or an empty one.
39*ad86a824SAnna Dabrowska     *
40*ad86a824SAnna Dabrowska     * @param string $pid
41*ad86a824SAnna Dabrowska     * @param array  $line
42*ad86a824SAnna Dabrowska     */
43*ad86a824SAnna Dabrowska    protected function createPage($pid, $line)
44*ad86a824SAnna Dabrowska    {
45*ad86a824SAnna Dabrowska        $text = pageTemplate($pid);
46*ad86a824SAnna Dabrowska        if (trim($text) === '') {
47*ad86a824SAnna Dabrowska            $pageParts = explode(':', $pid);
48*ad86a824SAnna Dabrowska            $pagename = end($pageParts);
49*ad86a824SAnna Dabrowska            $text = "====== $pagename ======\n";
50*ad86a824SAnna Dabrowska        }
51*ad86a824SAnna Dabrowska
52*ad86a824SAnna Dabrowska        // add serial syntax
53*ad86a824SAnna Dabrowska        $schema = $this->schema->getTable();
54*ad86a824SAnna Dabrowska        $text .= "
55*ad86a824SAnna Dabrowska---- struct serial ----
56*ad86a824SAnna Dabrowskaschema: $schema
57*ad86a824SAnna Dabrowskacols: *
58*ad86a824SAnna Dabrowska----
59*ad86a824SAnna Dabrowska";
60*ad86a824SAnna Dabrowska        saveWikiText($pid, $text, 'Created by struct csv import');
61*ad86a824SAnna Dabrowska    }
62*ad86a824SAnna Dabrowska
63*ad86a824SAnna Dabrowska    /**
64*ad86a824SAnna Dabrowska     * Check if page id realy exists
65*ad86a824SAnna Dabrowska     *
66*ad86a824SAnna Dabrowska     * @param Column $col
67*ad86a824SAnna Dabrowska     * @param mixed  $rawvalue
68*ad86a824SAnna Dabrowska     * @return bool
69*ad86a824SAnna Dabrowska     */
70*ad86a824SAnna Dabrowska    protected function validateValue(Column $col, &$rawvalue)
71*ad86a824SAnna Dabrowska    {
72*ad86a824SAnna Dabrowska        global $INPUT;
73*ad86a824SAnna Dabrowska        if ($col->getLabel() !== 'pid' || !$INPUT->bool('createPage')) {
74*ad86a824SAnna Dabrowska            return parent::validateValue($col, $rawvalue);
75*ad86a824SAnna Dabrowska        }
76*ad86a824SAnna Dabrowska
77*ad86a824SAnna Dabrowska        $pid = cleanID($rawvalue);
78*ad86a824SAnna Dabrowska        if (!page_exists($pid)) {
79*ad86a824SAnna Dabrowska            $this->createPage[$pid] = true;
80*ad86a824SAnna Dabrowska        }
81*ad86a824SAnna Dabrowska        return true;
82*ad86a824SAnna Dabrowska    }
83*ad86a824SAnna Dabrowska}
84