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