Completed
Push — master ( 6e4cef...b785dd )
by Vladimir
02:32
created

PageView::create()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3.0175

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 3
nop 1
dl 0
loc 18
ccs 7
cts 8
cp 0.875
crap 3.0175
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @copyright 2017 Vladimir Jimenez
5
 * @license   https://github.com/allejo/stakx/blob/master/LICENSE.md MIT
6
 */
7
8
namespace allejo\stakx\Document;
9
10
use allejo\stakx\FrontMatter\Document;
11
use allejo\stakx\System\Filesystem;
12
use allejo\stakx\System\StakxResource;
13
use org\bovigo\vfs\vfsStream;
14
use org\bovigo\vfs\vfsStreamWrapper;
15
use Symfony\Component\Yaml\Yaml;
16
17
class PageView extends Document
18
{
19
    const REPEATER_TYPE = 'repeater';
20
    const DYNAMIC_TYPE = 'dynamic';
21
    const STATIC_TYPE = 'static';
22
23
    /**
24
     * @var Filesystem
25
     */
26
    private static $fileSys;
27
28
    /**
29
     * @var string
30
     */
31
    protected $type;
32
33
    /**
34
     * @var PageView[]
35
     */
36
    private $children;
37
38
    /**
39
     * @var JailedDocument
40
     */
41
    private $jailInstance;
42
43
    /**
44
     * {@inheritdoc}
45
     */
46 32
    public function __construct($filePath)
47
    {
48 32
        parent::__construct($filePath);
49
50 32
        $this->children = array();
51 32
        $this->type = self::STATIC_TYPE;
52 32
    }
53
54
    //
55
    // Twig Jail
56
    // =========
57
58
    /**
59
     * {@inheritdoc}
60
     */
61 24
    public function createJail()
62
    {
63 24
        if (is_null($this->jailInstance))
64
        {
65 24
            $this->jailInstance = (new JailedDocument($this, array_merge(self::$whiteListFunctions, array(
66 24
                'getUrl',
67 24
            )), array('getChildren' => 'getJailedChildren')));
68
        }
69
70 24
        return $this->jailInstance;
71
    }
72
73 3
    public function getJailedChildren()
74
    {
75 3
        $children = $this->children;
76
77 3
        foreach ($children as &$child)
78
        {
79 3
            $child = $child->createJail();
80
        }
81
82 3
        return $children;
83
    }
84
85
    //
86
    // Getters
87
    // =======
88
89
    /**
90
     * Get child PageViews.
91
     *
92
     * A child is defined as a static PageView whose URL has a parent. For example, a PageView with a URL of
93
     * `/gallery/france/` would have the PageView whose URL is `/gallery` as a parent.
94
     *
95
     * @return PageView[]
96
     */
97 3
    public function &getChildren()
98
    {
99 3
        return $this->children;
100
    }
101
102
    /**
103
     * @return string Twig body
104
     */
105 14
    public function getContent()
106
    {
107 14
        return $this->bodyContent;
108
    }
109
110
    /**
111
     * Returns the type of the PageView.
112
     *
113
     * @return string
114
     */
115 20
    public function getType()
116
    {
117 20
        return $this->type;
118
    }
119
120
    /**
121
     * A fallback for the site menus that use the `url` field.
122
     *
123
     * @deprecated 0.1.0
124
     *
125
     * @todo       Remove this in the next major release
126
     */
127
    public function getUrl()
128
    {
129
        return $this->getPermalink();
130
    }
131
132
    //
133
    // Factory
134
    // =======
135
136
    /**
137
     * Create the appropriate object type when parsing a PageView.
138
     *
139
     * @param string $filePath The path to the file that will be parsed into a PageView
140
     *
141
     * @return DynamicPageView|PageView|RepeaterPageView
142
     */
143 6
    public static function create($filePath)
144
    {
145 6
        $instance = new self($filePath);
146
147 6
        if (isset($instance->getFrontMatter(false)['collection']))
148
        {
149 4
            return new DynamicPageView($filePath);
150
        }
151
152 2
        $instance->getFrontMatter();
153
154 2
        if ($instance->hasExpandedFrontMatter())
155
        {
156
            return new RepeaterPageView($filePath);
157
        }
158
159 2
        return $instance;
160
    }
161
162
    //
163
    // Virtual PageViews
164
    // =================
165
166
    /**
167
     * Create a virtual PageView.
168
     *
169
     * @param array  $frontMatter The Front Matter that this virtual PageView will have
170
     * @param string $body        The body of the virtual PageView
171
     *
172
     * @return PageView
173
     */
174 4
    public static function createVirtual($frontMatter, $body)
175
    {
176 4
        if (vfsStreamWrapper::getRoot() == null)
177
        {
178
            vfsStream::setup();
179
        }
180
181 4
        $redirectFile = vfsStream::newFile(sprintf('redirect_%s.html.twig', uniqid()));
182
        $redirectFile
183 4
            ->setContent(sprintf(self::TEMPLATE, Yaml::dump($frontMatter, 2), $body))
184 4
            ->at(vfsStreamWrapper::getRoot());
185
186 4
        return new self($redirectFile->url());
187
    }
188
189
    /**
190
     * Create a virtual PageView to create redirect files.
191
     *
192
     * @param string      $redirectFrom     The URL that will be redirecting to the target location
193
     * @param string      $redirectTo       The URL of the destination
194
     * @param string|bool $redirectTemplate The path to the template
195
     *
196
     * @return PageView A virtual PageView with the redirection template
197
     */
198 4
    public static function createRedirect($redirectFrom, $redirectTo, $redirectTemplate = false)
199
    {
200 4
        if (is_null(self::$fileSys))
201
        {
202 1
            self::$fileSys = new Filesystem();
203
        }
204
205
        $frontMatter = array(
206 4
            'permalink' => $redirectFrom,
207 4
            'redirect'  => $redirectTo,
208
            'menu'      => false,
209
        );
210
211 4
        if (!$redirectTemplate || !self::$fileSys->exists(self::$fileSys->absolutePath($redirectTemplate)))
212
        {
213 4
            $contentItemBody = StakxResource::getResource('redirect.html.twig');
214
        }
215
        else
216
        {
217
            $contentItemBody = file_get_contents(self::$fileSys->absolutePath($redirectTemplate));
218
        }
219
220 4
        return self::createVirtual($frontMatter, $contentItemBody);
221
    }
222
}
223