Completed
Push — master ( 3a9c1f...b05d7f )
by Henri
03:36
created

WebController   F

Complexity

Total Complexity 92

Size/Duplication

Total Lines 617
Duplicated Lines 4.86 %

Coupling/Cohesion

Components 1
Dependencies 12
Metric Value
wmc 92
lcom 1
cbo 12
dl 30
loc 617
rs 3.9652

16 Methods

Rating   Name   Duplication   Size   Complexity  
D __construct() 0 91 17
B guessBaseHref() 0 18 6
C guessLanguage() 0 30 8
A invokeVocabularies() 0 23 1
A invokeVocabularyConcept() 0 22 1
B invokeFeedbackForm() 0 33 5
F sendFeedback() 0 47 10
A invokeAboutPage() 15 15 1
C invokeGlobalSearch() 0 47 9
F invokeVocabularySearch() 0 82 18
C invokeAlphabeticalIndex() 0 37 7
A invokeGroupIndex() 15 15 1
A invokeGroupContents() 0 18 1
B invokeVocabularyHome() 0 25 2
A invokeGenericErrorPage() 0 12 1
A invokeChangeList() 0 19 4

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like WebController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use WebController, and based on these observations, apply Extract Interface, too.

1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 18 and the first side effect is on line 11.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
/**
3
 * Copyright (c) 2012-2013 Aalto University and University of Helsinki
4
 * MIT License
5
 * see LICENSE.txt for more information
6
 */
7
8
/**
9
 * Importing the dependencies.
10
 */
11
require_once 'controller/Controller.php';
12
use \Punic\Language;
13
14
/**
15
 * WebController is an extension of the Controller that handles all
16
 * the requests originating from the view of the website.
17
 */
18
class WebController extends Controller
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
19
{
20
    /**
21
     * Provides access to the templating engine.
22
     * @property object $twig the twig templating engine.
23
     */
24
    public $twig;
25
26
    public $base_href;
27
28
    /**
29
     * Constructor for the WebController.
30
     * @param Model $model
31
     */
32
    public function __construct($model)
33
    {
34
        parent::__construct($model);
35
36
        // initialize Twig templates
37
        $tmp_dir = $model->getConfig()->getTemplateCache();
0 ignored issues
show
Bug introduced by
The method getTemplateCache cannot be called on $model->getConfig() (of type string).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
38
39
        // check if the cache pointed by config.inc exists, if not we create it.
40
        if (!file_exists($tmp_dir)) {
41
            mkdir($tmp_dir);
42
        }
43
44
        // specify where to look for templates and cache
45
        $loader = new Twig_Loader_Filesystem('view');
46
        // initialize Twig environment
47
        $this->twig = new Twig_Environment($loader, array('cache' => $tmp_dir,
48
            'auto_reload' => true, 'debug' => true));
49
        $this->twig->addExtension(new Twig_Extensions_Extension_I18n());
50
        //ENABLES DUMP() method for easy and fun debugging!
51
        $this->twig->addExtension(new Twig_Extension_Debug());
52
        // used for setting the base href for the relative urls
53
        $this->base_href = ($this->model->getConfig()->getBaseHref() !== null) ? $this->model->getConfig()->getBaseHref() : $this->guessBaseHref();
54
        $this->twig->addGlobal("BaseHref", $this->base_href);
55
        // setting the service name string from the config.inc
56
        $this->twig->addGlobal("ServiceName", $this->model->getConfig()->getServiceName());
57
        // setting the service logo location from the config.inc
58
        if ($this->model->getConfig()->getServiceLogo() !== null) {
59
            $this->twig->addGlobal("ServiceLogo", $this->model->getConfig()->getServiceLogo());
60
        }
61
62
        // setting the service custom css file from the config.inc
63
        if ($this->model->getConfig()->getCustomCss() !== null) {
64
            $this->twig->addGlobal("ServiceCustomCss", $this->model->getConfig()->getCustomCss());
65
        }
66
        // used for displaying the ui language selection as a dropdown
67
        if ($this->model->getConfig()->getUiLanguageDropdown() !== null) {
68
            $this->twig->addGlobal("LanguageDropdown", $this->model->getConfig()->getUiLanguageDropdown());
69
        }
70
71
        // setting the list of properties to be displayed in the search results
72
        $this->twig->addGlobal("PreferredProperties", array('skos:prefLabel', 'skos:narrower', 'skos:broader', 'skosmos:memberOf', 'skos:altLabel', 'skos:related'));
73
74
        // register a Twig filter for generating URLs for vocabulary resources (concepts and groups)
75
        $controller = $this; // for use by anonymous function below
76
        $urlFilter = new Twig_SimpleFilter('link_url', function ($uri, $vocab, $lang, $type = 'page', $clang = null, $term = null) use ($controller) {
77
            // $vocab can either be null, a vocabulary id (string) or a Vocabulary object
78
            if ($vocab === null) {
79
                // target vocabulary is unknown, best bet is to link to the plain URI
80
                return $uri;
81
            } elseif (is_string($vocab)) {
82
                $vocid = $vocab;
83
                $vocab = $controller->model->getVocabulary($vocid);
84
            } else {
85
                $vocid = $vocab->getId();
86
            }
87
88
            $params = array();
89
            if (isset($clang) && $clang !== $lang) {
90
                $params['clang'] = $clang;
91
            }
92
93
            if (isset($term)) {
94
                $params['q'] = $term;
95
            }
96
97
            // case 1: URI within vocabulary namespace: use only local name
98
            $localname = $vocab->getLocalName($uri);
99
            if ($localname !== $uri && $localname === urlencode($localname)) {
100
                // check that the prefix stripping worked, and there are no problematic chars in localname
101
                $paramstr = sizeof($params) > 0 ? '?' . http_build_query($params) : '';
102
                if ($type && $type !== '' && $type !== 'vocab') {
103
                    return "$vocid/$lang/$type/$localname" . $paramstr;
104
                }
105
106
                return "$vocid/$lang/$localname" . $paramstr;
107
            }
108
109
            // case 2: URI outside vocabulary namespace, or has problematic chars
110
            // pass the full URI as parameter instead
111
            $params['uri'] = $uri;
112
            return "$vocid/$lang/$type/?" . http_build_query($params);
113
        });
114
        $this->twig->addFilter($urlFilter);
115
116
        // register a Twig filter for generating strings from language codes with CLDR
117
        $langFilter = new Twig_SimpleFilter('lang_name', function ($langcode, $lang) use ($controller) {
118
            return Language::getName($langcode, $lang);
119
        });
120
        $this->twig->addFilter($langFilter);
121
122
    }
123
124
    private function guessBaseHref()
125
    {
126
        $script_name = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_STRING);
127
        $script_filename = filter_input(INPUT_SERVER, 'SCRIPT_FILENAME', FILTER_SANITIZE_STRING);
128
        $script_filename = realpath($script_filename); // resolve any symlinks (see #274)
129
        $script_filename = str_replace("\\", "/", $script_filename); // fixing windows paths with \ (see #309)
130
        $base_dir = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite
131
        $base_dir = str_replace("\\", "/", $base_dir); // fixing windows paths with \ (see #309)
132
        $doc_root = preg_replace("!{$script_name}$!", '', $script_filename);
133
        $base_url = preg_replace("!^{$doc_root}!", '', $base_dir);
134
        $base_url = str_replace('/controller', '/', $base_url);
135
        $protocol = filter_input(INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING) === null ? 'http' : 'https';
136
        $port = filter_input(INPUT_SERVER, 'SERVER_PORT', FILTER_SANITIZE_STRING);
137
        $disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
138
        $domain = filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING);
139
        $full_url = "$protocol://{$domain}{$disp_port}{$base_url}";
140
        return $full_url;
141
    }
142
143
    /**
144
     * Guess the language of the user. Return a language string that is one
145
     * of the supported languages defined in the $LANGUAGES setting, e.g. "fi".
146
     * @param string $vocab_id identifier for the vocabulary eg. 'yso'.
147
     * @return string returns the language choice as a numeric string value
148
     */
149
    public function guessLanguage($vocab_id = null)
150
    {
151
        // 1. select language based on SKOSMOS_LANGUAGE cookie
152
        if (filter_input(INPUT_COOKIE, 'SKOSMOS_LANGUAGE', FILTER_SANITIZE_STRING)) {
153
            return filter_input(INPUT_COOKIE, 'SKOSMOS_LANGUAGE', FILTER_SANITIZE_STRING);
154
        }
155
156
        // 2. if vocabulary given, select based on the default language of the vocabulary
157
        if ($vocab_id !== null && $vocab_id !== '') {
158
            try {
159
                $vocab = $this->model->getVocabulary($vocab_id);
160
                return $vocab->getDefaultLanguage();
161
            } catch (Exception $e) {
162
                // vocabulary id not found, move on to the next selection method
163
            }
164
        }
165
166
        // 3. select language based on Accept-Language header
167
        header('Vary: Accept-Language'); // inform caches that a decision was made based on Accept header
168
        $this->negotiator = new \Negotiation\LanguageNegotiator();
169
        $langcodes = array_keys($this->languages);
170
        $acceptLanguage = filter_input(INPUT_SERVER, 'HTTP_ACCEPT_LANGUAGE', FILTER_SANITIZE_STRING) ? filter_input(INPUT_SERVER, 'HTTP_ACCEPT_LANGUAGE', FILTER_SANITIZE_STRING) : '';
171
        $bestLang = $this->negotiator->getBest($acceptLanguage, $langcodes);
172
        if (isset($bestLang) && in_array($bestLang, $langcodes)) {
173
            return $bestLang->getValue();
174
        }
175
176
        // show default site or prompt for language
177
        return $langcodes[0];
178
    }
179
180
    /**
181
     * Loads and renders the view containing all the vocabularies.
182
     * @param Request $request
183
     */
184
    public function invokeVocabularies($request)
185
    {
186
        // set language parameters for gettext
187
        $this->setLanguageProperties($request->getLang());
188
        // load template
189
        $template = $this->twig->loadTemplate('light.twig');
190
        // set template variables
191
        $categoryLabel = $this->model->getClassificationLabel($request->getLang());
192
        $vocabList = $this->model->getVocabularyList();
193
        $sortedVocabs = $this->model->getVocabularyList(false, true);
194
        $langList = $this->model->getLanguages($request->getLang());
195
196
        // render template
197
        echo $template->render(
198
            array(
199
                'vocab_list' => $vocabList,
200
                'sorted_vocabs' => $sortedVocabs,
201
                'category_label' => $categoryLabel,
202
                'languages' => $this->languages,
203
                'lang_list' => $langList,
204
                'request' => $request,
205
            ));
206
    }
207
208
    /**
209
     * Invokes the concept page of a single concept in a specific vocabulary.
210
     */
211
    public function invokeVocabularyConcept($request)
212
    {
213
        $lang = $request->getLang();
214
        $this->setLanguageProperties($lang);
215
        $template = $this->twig->loadTemplate('concept-info.twig');
216
        $vocab = $request->getVocab();
217
218
        $langcodes = $vocab->getConfig()->getShowLangCodes();
219
        $uri = $vocab->getConceptURI($request->getUri()); // make sure it's a full URI
220
221
        $results = $vocab->getConceptInfo($uri, $request->getContentLang());
222
        $crumbs = $vocab->getBreadCrumbs($request->getContentLang(), $uri);
223
        echo $template->render(array(
224
            'search_results' => $results,
225
            'vocab' => $vocab,
226
            'languages' => $this->languages,
227
            'explicit_langcodes' => $langcodes,
228
            'bread_crumbs' => $crumbs['breadcrumbs'],
229
            'combined' => $crumbs['combined'],
230
            'request' => $request)
231
        );
232
    }
233
234
    /**
235
     * Invokes the feedback page with information of the users current vocabulary.
236
     */
237
    public function invokeFeedbackForm($request)
238
    {
239
        $template = $this->twig->loadTemplate('feedback.twig');
240
        $this->setLanguageProperties($request->getLang());
241
        $vocabList = $this->model->getVocabularyList(false);
242
        $vocab = $request->getVocab();
243
244
        $feedback_sent = false;
245
        $feedback_msg = null;
246
        if (filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING)) {
247
            $feedback_sent = true;
248
            $feedback_msg = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
249
        }
250
        $feedback_name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
251
        $feedback_email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
252
        $feedback_vocab = filter_input(INPUT_POST, 'vocab', FILTER_SANITIZE_STRING);
253
        $feedback_vocab_email = ($vocab !== null) ? $vocab->getFeedbackRecipient() : null;
254
255
        // if the hidden field has been set a value we have found a spam bot
256
        // and we do not actually send the message.
257
        if ($feedback_sent && filter_input(INPUT_POST, 'trap', FILTER_SANITIZE_STRING) === '') {
258
            $this->sendFeedback($feedback_msg, $feedback_name, $feedback_email, $feedback_vocab, $feedback_vocab_email);
259
        }
260
261
        echo $template->render(
262
            array(
263
                'languages' => $this->languages,
264
                'vocab' => $vocab,
265
                'vocabList' => $vocabList,
266
                'feedback_sent' => $feedback_sent,
267
                'request' => $request,
268
            ));
269
    }
270
271
    /**
272
     * Sends the user entered message through the php's mailer.
273
     * @param string $message only required parameter is the actual message.
274
     * @param string $fromName senders own name.
275
     * @param string $fromEmail senders email adress.
276
     * @param string $fromVocab which vocabulary is the feedback related to.
277
     */
278
    public function sendFeedback($message, $fromName = null, $fromEmail = null, $fromVocab = null, $toMail = null)
279
    {
280
        $toAddress = ($toMail) ? $toMail : $this->model->getConfig()->getFeedbackAddress();
281
        if ($fromVocab !== null) {
282
            $message = 'Feedback from vocab: ' . strtoupper($fromVocab) . "<br />" . $message;
283
        }
284
285
        $subject = SERVICE_NAME . " feedback";
286
        $headers = "MIME-Version: 1.0″ . '\r\n";
287
        $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
288
        if ($toMail) {
289
            $headers .= "Cc: " . $this->model->getConfig()->getFeedbackAddress() . "\r\n";
290
        }
291
292
        $headers .= "From: $fromName <$fromEmail>" . "\r\n" . 'X-Mailer: PHP/' . phpversion();
293
        $envelopeSender = FEEDBACK_ENVELOPE_SENDER;
294
        $params = empty($envelopeSender) ? '' : "-f $envelopeSender";
295
296
        // adding some information about the user for debugging purposes.
297
        $agent = (filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING)) ? filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING) : '';
298
        $referer = (filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_STRING)) ? filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_STRING) : '';
299
        $ipAddress = (filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_SANITIZE_STRING)) ? filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_STRING) : '';
300
        $timestamp = date(DATE_RFC2822);
301
302
        $message = $message . "<br /><br /> Debugging information:"
303
            . "<br />Timestamp: " . $timestamp
304
            . "<br />User agent: " . $agent
305
            . "<br />IP address: " . $ipAddress
306
            . "<br />Referer: " . $referer;
307
308
        try {
309
            mail($toAddress, $subject, $message, $headers, $params);
310
        } catch (Exception $e) {
311
            header("HTTP/1.0 404 Not Found");
312
            $template = $this->twig->loadTemplate('error-page.twig');
313
            if ($this->model->getConfig()->getLogCaughtExceptions()) {
314
                error_log('Caught exception: ' . $e->getMessage());
315
            }
316
317
            echo $template->render(
318
                array(
319
                    'languages' => $this->languages,
320
                ));
321
322
            return;
323
        }
324
    }
325
326
    /**
327
     * Invokes the about page for the Skosmos service.
328
     */
329 View Code Duplication
    public function invokeAboutPage($request)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
330
    {
331
        $template = $this->twig->loadTemplate('about.twig');
332
        $this->setLanguageProperties($request->getLang());
333
        $url = $request->getServerConstant('HTTP_HOST');
334
        $version = $this->model->getVersion();
335
336
        echo $template->render(
337
            array(
338
                'languages' => $this->languages,
339
                'version' => $version,
340
                'server_instance' => $url,
341
                'request' => $request,
342
            ));
343
    }
344
345
    /**
346
     * Invokes the search for concepts in all the availible ontologies.
347
     */
348
    public function invokeGlobalSearch($request)
349
    {
350
        $lang = $request->getLang();
351
        $template = $this->twig->loadTemplate('vocab-search-listing.twig');
352
        $this->setLanguageProperties($lang);
353
354
        $term = $request->getQueryParam('q');
355
        $content_lang = $request->getContentLang();
356
        $search_lang = $request->getQueryParam('anylang') ? '' : $content_lang;
357
        $type = $request->getQueryParam('type');
358
        $group = $request->getQueryParam('group');
359
        $parent = $request->getQueryParam('parent');
360
        $offset = ($request->getQueryParam('offset') && is_numeric($request->getQueryParam('offset')) && $request->getQueryParam('offset') >= 0) ? $request->getQueryParam('offset') : 0;
361
        if ($offset > 0) {
362
            $rest = 1;
363
        } else {
364
            $rest = null;
365
        }
366
        $term = trim($term); // surrounding whitespace is not considered significant
367
        $sterm = strpos($term, "*") === false ? $term . "*" : $term; // default to prefix search
368
369
        $vocabs = $request->getQueryParam('vocabs'); # optional
370
        // convert to vocids array to support multi-vocabulary search
371
        $vocids = ($vocabs !== null && $vocabs !== '') ? explode(' ', $vocabs) : null;
372
373
        $count_and_results = $this->model->searchConceptsAndInfo($sterm, $vocids, $content_lang, $search_lang, $offset, 20, $type, $parent, $group);
374
        $counts = $count_and_results['count'];
375
        $search_results = $count_and_results['results'];
376
        $vocabList = $this->model->getVocabularyList();
377
        $sortedVocabs = $this->model->getVocabularyList(false, true);
378
        $langList = $this->model->getLanguages($lang);
379
380
        echo $template->render(
381
            array(
382
                'search_count' => $counts,
383
                'languages' => $this->languages,
384
                'search_results' => $search_results,
385
                'term' => $term,
386
                'rest' => $rest,
387
                'global_search' => true,
388
                'lang_list' => $langList,
389
                'vocabs' => $vocabs,
390
                'vocab_list' => $vocabList,
391
                'sorted_vocabs' => $sortedVocabs,
392
                'request' => $request,
393
            ));
394
    }
395
396
    /**
397
     * Invokes the search for a single vocabs concepts.
398
     */
399
    public function invokeVocabularySearch($request)
400
    {
401
        $lang = $request->getLang();
402
        $template = $this->twig->loadTemplate('vocab-search-listing.twig');
403
        $this->setLanguageProperties($lang);
404
        $vocab = $request->getVocab();
405
        try {
406
            $vocab_types = $this->model->getTypes($request->getVocabid(), $lang);
407
        } catch (Exception $e) {
408
            header("HTTP/1.0 404 Not Found");
409
            if ($this->model->getConfig()->getLogCaughtExceptions()) {
410
                error_log('Caught exception: ' . $e->getMessage());
411
            }
412
413
            echo $template->render(
414
                array(
415
                    'languages' => $this->languages,
416
                ));
417
418
            return;
419
        }
420
        $term = $request->getQueryParam('q');
421
        $content_lang = $request->getContentLang();
422
        $groups = $vocab->listConceptGroups($content_lang);
423
        $search_lang = $request->getQueryParam('anylang') ? '' : $content_lang;
424
        $type = $request->getQueryParam('type') !== '' ? $request->getQueryParam('type') : null;
425
        if ($type && strpos($type, '+')) {
426
            $type = explode('+', $type);
427
        } else if ($type && !is_array($type)) {
428
            // if only one type param given place it into an array regardless
429
            $type = array($type);
430
        }
431
432
        $group = $request->getQueryParam('group') !== '' ? $request->getQueryParam('group') : null;
433
        $parent = $request->getQueryParam('parent') !== '' ? $request->getQueryParam('parent') : null;
434
        $offset = ($request->getQueryParam('offset') && is_numeric($request->getQueryParam('offset')) && $request->getQueryParam('offset') >= 0) ? $request->getQueryParam('offset') : 0;
435
        $langcodes = $vocab->getConfig()->getShowLangCodes();
436
        if ($offset > 0) {
437
            $rest = 1;
438
            $template = $this->twig->loadTemplate('vocab-search-listing.twig');
439
        } else {
440
            $rest = null;
441
        }
442
443
        $term = trim($term); // surrounding whitespace is not considered significant
444
        $sterm = strpos($term, "*") === false ? $term . "*" : $term; // default to prefix search
445
        try {
446
            $count_and_results = $this->model->searchConceptsAndInfo($sterm, $request->getVocabid(), $content_lang, $search_lang, $offset, 20, $type, $parent, $group);
447
            $counts = $count_and_results['count'];
448
            $search_results = $count_and_results['results'];
449
        } catch (Exception $e) {
450
            header("HTTP/1.0 404 Not Found");
451
            if ($this->model->getConfig()->getLogCaughtExceptions()) {
452
                error_log('Caught exception: ' . $e->getMessage());
453
            }
454
455
            echo $template->render(
456
                array(
457
                    'languages' => $this->languages,
458
                    'vocab' => $vocab,
459
                    'term' => $term,
460
                    'rest' => $rest,
461
                ));
462
            return;
463
        }
464
        echo $template->render(
465
            array(
466
                'languages' => $this->languages,
467
                'vocab' => $vocab,
468
                'search_results' => $search_results,
469
                'search_count' => $counts,
470
                'term' => $term,
471
                'rest' => $rest,
472
                'limit_parent' => $parent,
473
                'limit_type' => $type,
474
                'limit_group' => $group,
475
                'group_index' => $groups,
476
                'types' => $vocab_types,
477
                'explicit_langcodes' => $langcodes,
478
                'request' => $request,
479
            ));
480
    }
481
482
    /**
483
     * Invokes the alphabetical listing for a specific vocabulary.
484
     */
485
    public function invokeAlphabeticalIndex($request)
486
    {
487
        $lang = $request->getLang();
488
        $this->setLanguageProperties($lang);
489
        $template = $this->twig->loadTemplate('alphabetical-index.twig');
490
        $vocab = $request->getVocab();
491
492
        $offset = ($request->getQueryParam('offset') && is_numeric($request->getQueryParam('offset')) && $request->getQueryParam('offset') >= 0) ? $request->getQueryParam('offset') : 0;
493
        if ($request->getQueryParam('limit')) {
494
            $count = $request->getQueryParam('limit');
495
        } else {
496
            $count = ($offset > 0) ? null : 250;
497
        }
498
499
        $content_lang = $request->getContentLang();
500
501
        $all_at_once = $vocab->getConfig()->getAlphabeticalFull();
502
        if (!$all_at_once) {
503
            $search_results = $vocab->searchConceptsAlphabetical($request->getLetter(), $count, $offset, $content_lang);
504
            $letters = $vocab->getAlphabet($content_lang);
505
        } else {
506
            $search_results = $vocab->searchConceptsAlphabetical('*', null, null, $content_lang);
507
            $letters = null;
508
        }
509
510
        $request->setContentLang($content_lang);
511
512
        echo $template->render(
513
            array(
514
                'languages' => $this->languages,
515
                'vocab' => $vocab,
516
                'alpha_results' => $search_results,
517
                'letters' => $letters,
518
                'all_letters' => $all_at_once,
519
                'request' => $request,
520
            ));
521
    }
522
523
    /**
524
     * Invokes the vocabulary group index page template.
525
     * @param boolean $stats set to true to get vocabulary statistics visible.
526
     */
527 View Code Duplication
    public function invokeGroupIndex($request, $stats = false)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
528
    {
529
        $lang = $request->getLang();
530
        $this->setLanguageProperties($lang);
531
        $template = $this->twig->loadTemplate('group-index.twig');
532
        $vocab = $request->getVocab();
533
534
        echo $template->render(
535
            array(
536
                'languages' => $this->languages,
537
                'stats' => $stats,
538
                'vocab' => $vocab,
539
                'request' => $request,
540
            ));
541
    }
542
543
    /**
544
     * Invokes the vocabulary group contents page template.
545
     */
546
    public function invokeGroupContents($request)
547
    {
548
        $lang = $request->getLang();
549
        $this->setLanguageProperties($lang);
550
        $template = $this->twig->loadTemplate('group-contents.twig');
551
        $vocab = $request->getVocab();
552
553
        $uri = $vocab->getConceptURI($request->getUri()); // make sure it's a full URI
554
        $results = $vocab->getConceptInfo($uri, $request->getContentLang());
555
556
        echo $template->render(
557
            array(
558
                'languages' => $this->languages,
559
                'vocab' => $vocab,
560
                'search_results' => $results,
561
                'request' => $request,
562
            ));
563
    }
564
565
    /**
566
     * Loads and renders the view containing a specific vocabulary.
567
     */
568
    public function invokeVocabularyHome($request)
569
    {
570
        $lang = $request->getLang();
571
        // set language parameters for gettext
572
        $this->setLanguageProperties($lang);
573
        $vocab = $request->getVocab();
574
575
        $defaultView = $vocab->getConfig()->getDefaultSidebarView();
576
        // load template
577
        if ($defaultView === 'groups') {
578
            $this->invokeGroupIndex($request, true);
579
            return;
580
        }
581
582
        $template = $this->twig->loadTemplate('vocab.twig');
583
584
        echo $template->render(
585
            array(
586
                'languages' => $this->languages,
587
                'vocab' => $vocab,
588
                'search_letter' => 'A',
589
                'active_tab' => $defaultView,
590
                'request' => $request,
591
            ));
592
    }
593
594
    /**
595
     * Invokes a very generic errorpage.
596
     */
597
    public function invokeGenericErrorPage($request)
598
    {
599
        $this->setLanguageProperties($request->getLang());
600
        header("HTTP/1.0 404 Not Found");
601
        $template = $this->twig->loadTemplate('error-page.twig');
602
        echo $template->render(
603
            array(
604
                'languages' => $this->languages,
605
                'request' => $request,
606
                'requested_page' => filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING),
607
            ));
608
    }
609
610
    /**
611
     * Loads and renders the view containing a list of recent changes in the vocabulary.
612
     * @param Request $request
613
     */
614
    public function invokeChangeList($request, $prop='dc:created')
615
    {
616
        // set language parameters for gettext
617
        $this->setLanguageProperties($request->getLang());
618
        $vocab = $request->getVocab();
619
        $offset = ($request->getQueryParam('offset') && is_numeric($request->getQueryParam('offset')) && $request->getQueryParam('offset') >= 0) ? $request->getQueryParam('offset') : 0;
620
        $changeList = $vocab->getChangeList($prop, $request->getContentLang(), $request->getLang(), $offset);
621
        // load template
622
        $template = $this->twig->loadTemplate('changes.twig');
623
624
        // render template
625
        echo $template->render(
626
            array(
627
                'vocab' => $vocab,
628
                'languages' => $this->languages,
629
                'request' => $request,
630
                'changeList' => $changeList)
631
            );
632
    }
633
634
}
635