Completed
Pull Request — 5.6 (#2830)
by Jeroen
14:14
created

Kunstmaan/NodeBundle/Twig/NodeTwigExtension.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Kunstmaan\NodeBundle\Twig;
4
5
use Doctrine\ORM\EntityManagerInterface;
6
use Kunstmaan\AdminListBundle\Entity\OverviewNavigationInterface;
7
use Kunstmaan\NodeBundle\Entity\Node;
8
use Kunstmaan\NodeBundle\Entity\NodeTranslation;
9
use Kunstmaan\NodeBundle\Entity\PageInterface;
10
use Kunstmaan\NodeBundle\Entity\StructureNode;
11
use Kunstmaan\NodeBundle\Helper\NodeMenu;
12
use Symfony\Component\HttpFoundation\RequestStack;
13
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
14
use Twig\Extension\AbstractExtension;
15
use Twig\TwigFunction;
16
17
/**
18
 * Extension to fetch node / translation by page in Twig templates
19
 *
20
 * @final since 5.4
21
 */
22
class NodeTwigExtension extends AbstractExtension
23
{
24
    /**
25
     * @var EntityManagerInterface
26
     */
27
    private $em;
28
29
    /**
30
     * @var UrlGeneratorInterface
31
     */
32
    private $generator;
33
34
    /**
35
     * @var NodeMenu
36
     */
37
    private $nodeMenu;
38
39
    /**
40
     * @var RequestStack
41
     */
42
    private $requestStack;
43
44
    public function __construct(
45
        EntityManagerInterface $em,
46
        UrlGeneratorInterface $generator,
47
        NodeMenu $nodeMenu,
48
        RequestStack $requestStack
49
    ) {
50
        $this->em = $em;
51
        $this->generator = $generator;
52
        $this->nodeMenu = $nodeMenu;
53
        $this->requestStack = $requestStack;
54
    }
55
56
    /**
57
     * Returns a list of functions to add to the existing list.
58
     *
59
     * @return array An array of functions
60
     */
61
    public function getFunctions()
62
    {
63
        return [
64
            new TwigFunction(
65
                'get_node_for', [$this, 'getNodeFor']
66
            ),
67
            new TwigFunction(
68
                'get_node_translation_for',
69
                [$this, 'getNodeTranslationFor']
70
            ),
71
            new TwigFunction(
72
                'get_node_by_internal_name',
73
                [$this, 'getNodeByInternalName']
74
            ),
75
            new TwigFunction(
76
                'get_url_by_internal_name',
77
                [$this, 'getUrlByInternalName']
78
            ),
79
            new TwigFunction(
80
                'get_path_by_internal_name',
81
                [$this, 'getPathByInternalName']
82
            ),
83
            new TwigFunction(
84
                'get_page_by_node_translation',
85
                [$this, 'getPageByNodeTranslation']
86
            ),
87
            new TwigFunction(
88
                'get_node_menu',
89
                [$this, 'getNodeMenu']
90
            ),
91
            new TwigFunction(
92
                'is_structure_node',
93
                [$this, 'isStructureNode']
94
            ),
95
            new TwigFunction(
96
                'file_exists',
97
                [$this, 'fileExists']
98
            ),
99
            new TwigFunction(
100
                'get_node_trans_by_node_id',
101
                [$this, 'getNodeTranslationByNodeId']
102
            ),
103
            new TwigFunction(
104
                'getOverviewRoute',
105
                [$this, 'getOverviewRoute']
106
            ),
107
        ];
108
    }
109
110
    /**
111
     * Get the node translation object based on node id and language.
112
     *
113
     * @param int    $nodeId
114
     * @param string $lang
115
     *
116
     * @return NodeTranslation
117
     */
118
    public function getNodeTranslationByNodeId($nodeId, $lang)
119
    {
120
        $repo = $this->em->getRepository(NodeTranslation::class);
121
122
        return $repo->getNodeTranslationByNodeIdQueryBuilder($nodeId, $lang);
123
    }
124
125
    /**
126
     * @return object|null
127
     */
128
    public function getPageByNodeTranslation(NodeTranslation $nodeTranslation)
129
    {
130
        return $nodeTranslation->getRef($this->em);
131
    }
132
133
    /**
134
     * @return Node
135
     */
136
    public function getNodeFor(PageInterface $page)
137
    {
138
        return $this->em->getRepository(Node::class)->getNodeFor($page);
139
    }
140
141
    /**
142
     * @return NodeTranslation
143
     */
144
    public function getNodeTranslationFor(PageInterface $page)
145
    {
146
        return $this->em->getRepository(NodeTranslation::class)->getNodeTranslationFor($page);
147
    }
148
149
    /**
150
     * @param string $internalName
151
     * @param string $locale
152
     *
153
     * @return Node|null
154
     */
155
    public function getNodeByInternalName($internalName, $locale)
156
    {
157
        $nodes = $this->em->getRepository(Node::class)
158
            ->getNodesByInternalName($internalName, $locale);
159
        if (!empty($nodes)) {
160
            return $nodes[0];
161
        }
162
163
        return null;
164
    }
165
166
    /**
167
     * @param string $internalName Internal name of the node
168
     * @param string $locale       Locale
169
     * @param array  $parameters   (optional) extra parameters
170
     * @param bool   $relative     (optional) return relative path?
171
     *
172
     * @return string
173
     */
174 View Code Duplication
    public function getPathByInternalName($internalName, $locale, $parameters = [], $relative = false)
175
    {
176
        $routeParameters = $this->getRouteParametersByInternalName($internalName, $locale, $parameters);
177
178
        return $this->generator->generate(
179
            '_slug',
180
            $routeParameters,
181
            $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH
182
        );
183
    }
184
185
    /**
186
     * @param string $internalName   Internal name of the node
187
     * @param string $locale         Locale
188
     * @param array  $parameters     (optional) extra parameters
189
     * @param bool   $schemeRelative (optional) return relative scheme?
190
     *
191
     * @return string
192
     */
193 View Code Duplication
    public function getUrlByInternalName($internalName, $locale, $parameters = [], $schemeRelative = false)
194
    {
195
        $routeParameters = $this->getRouteParametersByInternalName($internalName, $locale, $parameters);
196
197
        return $this->generator->generate(
198
            '_slug',
199
            $routeParameters,
200
            $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL
201
        );
202
    }
203
204
    /**
205
     * @param string $locale
206
     * @param Node   $node
207
     * @param bool   $includeHiddenFromNav
208
     *
209
     * @return NodeMenu
210
     */
211
    public function getNodeMenu($locale, Node $node = null, $includeHiddenFromNav = false)
212
    {
213
        $request = $this->requestStack->getMasterRequest();
214
        $isPreview = $request->attributes->has('preview') && $request->attributes->get('preview') === true;
215
        $this->nodeMenu->setLocale($locale);
216
        $this->nodeMenu->setCurrentNode($node);
217
        $this->nodeMenu->setIncludeOffline($isPreview);
218
        $this->nodeMenu->setIncludeHiddenFromNav($includeHiddenFromNav);
219
220
        return $this->nodeMenu;
221
    }
222
223
    public function isStructureNode($page)
224
    {
225
        return $page instanceof StructureNode;
226
    }
227
228
    public function fileExists($filename)
229
    {
230
        return file_exists($filename);
231
    }
232
233
    /**
234
     * @param string $internalName
235
     * @param string $locale
236
     * @param array  $parameters
237
     *
238
     * @return array
239
     */
240
    private function getRouteParametersByInternalName($internalName, $locale, $parameters = [])
241
    {
242
        $url = '';
243
        $translation = $this->em->getRepository(NodeTranslation::class)
244
            ->getNodeTranslationByLanguageAndInternalName($locale, $internalName);
245
246
        if (!\is_null($translation)) {
247
            $url = $translation->getUrl();
248
        }
249
250
        return array_merge(
251
            [
252
                'url' => $url,
253
                '_locale' => $locale,
254
            ],
255
            $parameters
256
        );
257
    }
258
259
    public function getOverviewRoute($node)
0 ignored issues
show
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
260
    {
261
        if ($node instanceof OverviewNavigationInterface) {
262
            return $node->getOverViewRoute();
263
        }
264
265
        return null;
266
    }
267
}
268