Completed
Pull Request — master (#48)
by Vladimir
02:37
created

PageView   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 207
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 8

Test Coverage

Coverage 93.33%

Importance

Changes 0
Metric Value
wmc 19
lcom 2
cbo 8
dl 0
loc 207
ccs 56
cts 60
cp 0.9333
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getChildren() 0 4 1
A getContent() 0 4 1
A getType() 0 4 1
A getUrl() 0 4 1
A createJail() 0 11 2
A getJailedChildren() 0 11 2
A create() 0 19 4
A createVirtual() 0 14 2
B createRedirect() 0 24 4
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\FrontMatterDocument;
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 FrontMatterDocument
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 24
        {
65 24
            $this->jailInstance = (new JailedDocument($this, array_merge(self::$whiteListFunctions, array(
66 24
                'getUrl',
67 24
            )), array('getChildren' => 'getJailedChildren')));
68 24
        }
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 3
        }
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 2
            isset($instance->getFrontMatter(false)['dataset'])
149 6
        ) {
150 4
            return new DynamicPageView($filePath);
151
        }
152
153 2
        $instance->getFrontMatter();
154
155 2
        if ($instance->hasExpandedFrontMatter())
156 2
        {
157
            return new RepeaterPageView($filePath);
158
        }
159
160 2
        return $instance;
161
    }
162
163
    //
164
    // Virtual PageViews
165
    // =================
166
167
    /**
168
     * Create a virtual PageView.
169
     *
170
     * @param array  $frontMatter The Front Matter that this virtual PageView will have
171
     * @param string $body        The body of the virtual PageView
172
     *
173
     * @return PageView
174
     */
175 4
    public static function createVirtual($frontMatter, $body)
176
    {
177 4
        if (vfsStreamWrapper::getRoot() == null)
178 4
        {
179
            vfsStream::setup();
180
        }
181
182 4
        $redirectFile = vfsStream::newFile(sprintf('redirect_%s.html.twig', uniqid()));
183
        $redirectFile
184 4
            ->setContent(sprintf(self::TEMPLATE, Yaml::dump($frontMatter, 2), $body))
185 4
            ->at(vfsStreamWrapper::getRoot());
186
187 4
        return new self($redirectFile->url());
188
    }
189
190
    /**
191
     * Create a virtual PageView to create redirect files.
192
     *
193
     * @param string      $redirectFrom     The URL that will be redirecting to the target location
194
     * @param string      $redirectTo       The URL of the destination
195
     * @param string|bool $redirectTemplate The path to the template
196
     *
197
     * @return PageView A virtual PageView with the redirection template
198
     */
199 4
    public static function createRedirect($redirectFrom, $redirectTo, $redirectTemplate = false)
200
    {
201 4
        if (is_null(self::$fileSys))
202 4
        {
203 1
            self::$fileSys = new Filesystem();
204 1
        }
205
206
        $frontMatter = array(
207 4
            'permalink' => $redirectFrom,
208 4
            'redirect'  => $redirectTo,
209 4
            'menu'      => false,
210 4
        );
211
212 4
        if (!$redirectTemplate || !self::$fileSys->exists(self::$fileSys->absolutePath($redirectTemplate)))
213 4
        {
214 4
            $contentItemBody = StakxResource::getResource('redirect.html.twig');
215 4
        }
216
        else
217
        {
218
            $contentItemBody = file_get_contents(self::$fileSys->absolutePath($redirectTemplate));
219
        }
220
221 4
        return self::createVirtual($frontMatter, $contentItemBody);
222
    }
223
}
224