Passed
Push — master ( b0b99c...8fb3e6 )
by Laurent
02:43 queued 12s
created

Func_App::getTranslator()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 5
c 1
b 0
f 0
nc 2
nop 0
dl 0
loc 9
rs 10
1
<?php
2
//-------------------------------------------------------------------------
3
// OVIDENTIA http://www.ovidentia.org
4
// Ovidentia is free software; you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation; either version 2, or (at your option)
7
// any later version.
8
//
9
// This program is distributed in the hope that it will be useful, but
10
// WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
// See the GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with this program; if not, write to the Free Software
16
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17
// USA.
18
//-------------------------------------------------------------------------
19
/**
20
 * @license http://opensource.org/licenses/gpl-license.php GNU General Public License (GPL)
21
 * @copyright Copyright (c) 2018 by CANTICO ({@link http://www.cantico.fr})
22
 */
23
24
require_once dirname(__FILE__) . '/define.php';
25
require_once dirname(__FILE__) . '/functions.php';
26
27
28
29
/**
30
 * Provides extensible functionalities to manage an application.
31
 *
32
 * @method app_CustomFieldSet       CustomFieldSet()
33
 * @method app_CustomSectionSet     CustomSectionSet()
34
 */
35
class Func_App extends bab_Functionality
36
{
37
    public $addonPrefix;
38
    public $classPrefix;
39
    public $addonName;
40
    public $controllerTg;
41
    public $phpPath;
42
    public $recordSetPath;
43
    public $ctrlPath;
44
    public $uiPath;
45
46
47
    /**
48
     * @var string
49
     */
50
    private $language = null;
51
52
53
    public function __construct()
54
    {
55
        $this->addonName = 'libapp';
56
        $this->addonPrefix = 'app';
57
58
        $this->classPrefix = $this->addonPrefix . '_';
59
        $this->controllerTg = 'addon/' . $this->addonName . '/main';
60
61
        $addon = bab_getAddonInfosInstance($this->addonName);
62
        $this->phpPath = $addon->getPhpPath();
63
        $this->recordSetPath = $this->phpPath;
64
        $this->ctrlPath = $this->phpPath;
65
        $this->uiPath = $this->phpPath . 'ui/';
66
67
        $babDB = bab_getDB();
68
69
        $LibOrm = bab_Functionality::get('LibOrm');
70
        /*@var $LibOrm Func_LibOrm */
71
72
        $LibOrm->initMysql();
73
        ORM_RecordSet::setBackend(new ORM_MySqlBackend($babDB));
74
    }
75
76
77
    /**
78
     * @param string $class
79
     * @return boolean
80
     */
81
    public function loadObject($class)
82
    {
83
        $classPrefix = $this->classPrefix;
84
85
        if (substr($class, 0, strlen($classPrefix)) === $classPrefix) {
86
            if (substr($class, -3) === 'Set') {
87
                $pathname = $this->getRecordSetPathname($class);
88
                if (file_exists($pathname)) {
89
                    require $pathname;
90
                    return true;
91
                }
92
            } else {
93
                $pathname = $this->getRecordPathname($class);
94
                if (file_exists($pathname)) {
95
                    require $pathname;
96
                    return true;
97
                }
98
            }
99
        }
100
        return false;
101
    }
102
103
    /**
104
     * Returns the expected pathname for the file containing the definition of the record set class.
105
     *
106
     * @param string $class
107
     * @return string
108
     */
109
    public function getRecordSetPathname($class)
110
    {
111
        // $App->MyRecordSet() -> myrecord.class.php
112
        $file = strtolower(substr($class, strlen($this->classPrefix), -3)) . '.class.php';
113
        return $this->recordSetPath . $file;
114
    }
115
116
    /**
117
     *  Returns the expected pathname for the file containing the definition of the record class.
118
     *
119
     * @param string $class
120
     * @return string
121
     */
122
    public function getRecordPathname($class)
123
    {
124
        // $App->MyRecord() -> myrecord.class.php
125
        $file = strtolower(substr($class, strlen($this->classPrefix))) . '.class.php';
126
        return $this->recordSetPath . $file;
127
    }
128
129
    /**
130
     * @return string
131
     */
132
    public function getUiPath()
133
    {
134
        return APP_UI_PATH;
135
    }
136
137
    /**
138
     * @return string
139
     */
140
    public function getSetPath()
141
    {
142
        return APP_SET_PATH;
143
    }
144
145
    /**
146
     * @return string
147
     */
148
    public function getCtrlPath()
149
    {
150
        return APP_CTRL_PATH;
151
    }
152
153
    /**
154
     * @return string
155
     */
156
    public function getPhpPath()
157
    {
158
        return APP_PHP_PATH;
159
    }
160
161
162
    /**
163
     * @return string
164
     *
165
     */
166
    public function getDescription()
167
    {
168
        return 'Application framework.';
169
    }
170
171
172
    /**
173
     * Get the addon name
174
     * @return string
175
     */
176
    public function getAddonName()
177
    {
178
        return $this->addonName;
179
    }
180
181
182
    /**
183
     * @return bab_addonInfos
184
     */
185
    public function getAddon()
186
    {
187
        return bab_getAddonInfosInstance($this->getAddonName());
188
    }
189
190
191
    /**
192
     * Register myself as a functionality.
193
     *
194
     */
195
    public static function register()
196
    {
197
        require_once $GLOBALS['babInstallPath'].'utilit/functionalityincl.php';
198
        $functionalities = new bab_functionalities();
0 ignored issues
show
Unused Code introduced by
The assignment to $functionalities is dead and can be removed.
Loading history...
199
200
        $addon = bab_getAddonInfosInstance('libapp');
201
202
        $addon->registerFunctionality('App', 'app.php');
203
    }
204
205
206
    /**
207
     * Synchronize sql tables for all classes found in Application object
208
     * using methods  'includeXxxxxClassName'
209
     * sychronize if the two correspond methods are met and the set classname match the prefix from parameter
210
     * do not synchronize if the set method has a VueSet suffix, in this case the table si juste a readonly vue
211
     *
212
     * @param	string	$prefix		tables and classes prefix
213
     * @return bab_synchronizeSql
214
     */
215
    public function synchronizeSql($prefix)
216
    {
217
        if (!$prefix) {
218
            return null;
219
        }
220
221
        require_once $GLOBALS['babInstallPath'].'utilit/devtools.php';
222
        $mysqlbackend = new ORM_MySqlBackend($GLOBALS['babDB']);
223
        $sql = 'SET FOREIGN_KEY_CHECKS=0;
224
            ';
225
226
        foreach (get_class_methods($this) as $method) {
227
228
            if (substr($method, 0, 7) === 'include' && substr($method, -3) === 'Set') {
229
                $incl = $method;
230
                $classNameMethod = substr($method, strlen('include')) . 'ClassName';
231
232
233
                $classname = $this->$classNameMethod();
234
235
                if ($prefix === substr($classname, 0, strlen($prefix))
236
                  && 'Set' === substr($classname, -3)
237
                  && 'ViewSet' !== substr($classname, -7)) {
238
                    if (method_exists($this, $incl)) {
239
                        $this->$incl();
240
241
                        $call = substr($classname, strlen($prefix));
242
243
                        if (class_exists($classname)) {
244
245
                            /* @var $set ORM_RecordSet */
246
                            $set = $this->$call();
247
                            if (method_exists($set, 'useLang')) {
248
                                // This is necessary if the recordSet constructor uses a setLang().
249
                                // We need to revert to multilang fields before synchronizing.
250
                                $set->useLang(false);
0 ignored issues
show
Bug introduced by
false of type false is incompatible with the type string expected by parameter $language of ORM_RecordSet::useLang(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

250
                                $set->useLang(/** @scrutinizer ignore-type */ false);
Loading history...
251
                            }
252
                            $sql .= $mysqlbackend->setToSql($set) . "\n";
253
                        }
254
                    }
255
                }
256
            }
257
        }
258
259
        require_once $GLOBALS['babInstallPath'].'utilit/devtools.php';
260
        $synchronize = new bab_synchronizeSql();
261
262
        $synchronize->fromSqlString($sql);
263
264
        return $synchronize;
265
    }
266
267
268
269
    public function getSynchronizeSql($prefix)
270
    {
271
        if (!$prefix) {
272
            return null;
273
        }
274
275
        require_once $GLOBALS['babInstallPath'].'utilit/devtools.php';
276
        $mysqlbackend = new ORM_MySqlBackend($GLOBALS['babDB']);
277
        $sql = '';
278
279
        foreach (get_class_methods($this) as $method) {
280
281
            if (substr($method, 0, strlen('include')) === 'include' && substr($method, -strlen('Set')) === 'Set') {
282
                $incl = $method;
283
                $classNameMethod = substr($method, strlen('include')) . 'ClassName';
284
285
                $classname = $this->$classNameMethod();
286
287
                if ($prefix === substr($classname, 0, strlen($prefix))
288
                    && 'Set' === substr($classname, -3)
289
                    && 'ViewSet' !== substr($classname, -6)
290
                    ) {
291
                        if (method_exists($this, $incl)) {
292
                            $this->$incl();
293
                            $call = substr($classname, strlen($prefix));
294
295
                            if (class_exists($classname) && method_exists($this, $call)) {
296
                                $set = $this->$call();
297
                                $sql .= $mysqlbackend->setToSql($set) . "\n";
298
                            }
299
                        }
300
                    }
301
            }
302
        }
303
304
        return $sql;
305
    }
306
307
308
309
    public function includeBase()
310
    {
311
        require_once APP_PHP_PATH . 'base.class.php';
312
    }
313
314
    /**
315
     * Includes app_RecordSet class definition.
316
     */
317
    public function includeRecordSet()
318
    {
319
        require_once APP_SET_PATH . 'record.class.php';
320
    }
321
322
323
    /**
324
     * Includes app_TraceableRecordSet class definition.
325
     */
326
    public function includeTraceableRecordSet()
327
    {
328
        require_once APP_SET_PATH . 'traceablerecord.class.php';
329
    }
330
331
332
333
    /**
334
     * SET DEFINITION
335
     */
336
337
    //Log
338
339
    /**
340
     * Includes LogSet class definition.
341
     */
342
    public function includeLogSet()
343
    {
344
        require_once APP_SET_PATH . 'log.class.php';
345
    }
346
347
    /**
348
     * @return string
349
     */
350
    public function LogClassName()
351
    {
352
        return 'app_Log';
353
    }
354
355
    /**
356
     * @return string
357
     */
358
    public function LogSetClassName()
359
    {
360
        return $this->LogClassName() . 'Set';
361
    }
362
363
    /**
364
     * @return app_LogSet
365
     */
366
    public function LogSet()
367
    {
368
        $this->includeLogSet();
369
        $className = $this->LogSetClassName();
370
        $set = new $className($this);
371
        return $set;
372
    }
373
374
375
    //Link
376
377
    /**
378
     * Includes LinkSet class definition.
379
     */
380
    public function includeLinkSet()
381
    {
382
        require_once APP_SET_PATH . 'link.class.php';
383
    }
384
385
    /**
386
     * @return string
387
     */
388
    public function LinkClassName()
389
    {
390
        return 'app_Link';
391
    }
392
393
    /**
394
     * @return string
395
     */
396
    public function LinkSetClassName()
397
    {
398
        return $this->LinkClassName() . 'Set';
399
    }
400
401
    /**
402
     * @return app_LinkSet
403
     */
404
    public function LinkSet()
405
    {
406
        $this->includeLinkSet();
407
        $className = $this->LinkSetClassName();
408
        $set = new $className($this);
409
        return $set;
410
    }
411
412
413
414
415
416
417
418
    /**
419
     * Returns the app_Record corresponding to the specified
420
     * reference $ref.
421
     *
422
     * @param string 	$ref	A reference string (e.g. Contact:12)
423
     * @return app_Record	or null if no corresponding record is found.
424
     */
425
    public function getRecordByRef($ref)
426
    {
427
        $refParts = explode(':', $ref);
428
        if (count($refParts) !== 2) {
429
            return null;
430
        }
431
        list($classname, $id) = $refParts;
432
        $classSet = $classname . 'Set';
433
        $set = $this->$classSet();
434
        if (isset($set)) {
435
            return $set->get($id);
436
        }
437
        return null;
438
    }
439
440
    /**
441
     * Returns the reference corresponding to the specified
442
     * app_Record $record (e.g. Contact:12 or Deal:125)
443
     *
444
     * @param app_Record	$record
445
     * @return string
446
     */
447
    public function getRecordRef(app_Record $record)
448
    {
449
        $fullClassName = get_class($record);
450
        list(, $className) = explode('_', $fullClassName);
451
        return $className . ':' . $record->id;
0 ignored issues
show
Bug Best Practice introduced by
The property id does not exist on app_Record. Since you implemented __get, consider adding a @property annotation.
Loading history...
452
    }
453
454
455
    /**
456
     *
457
     * @return Func_Translate_Gettext
0 ignored issues
show
Bug introduced by
The type Func_Translate_Gettext was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
458
     */
459
    private static function getTranslator()
460
    {
461
        static $translator = null;
462
        if (!isset($translator)) {
463
            $translator = bab_functionality::get('Translate/Gettext');
464
            $translator->setAddonName('libapp');
0 ignored issues
show
Bug introduced by
The method setAddonName() does not exist on bab_functionality. It seems like you code against a sub-type of bab_functionality such as Func_App. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

464
            $translator->/** @scrutinizer ignore-call */ 
465
                         setAddonName('libapp');
Loading history...
465
        }
466
467
        return $translator;
468
    }
469
470
471
    /**
472
     * Specifies the language to use for translation.
473
     *
474
     * If $language is null, the language is reset to
475
     * the current logged user language.
476
     *
477
     * @param string|null $language
478
     */
479
    public function setTranslateLanguage($language)
480
    {
481
        $this->language = $language;
482
    }
483
484
485
486
    /**
487
     * Translates the string.
488
     *
489
     * @param string $str           Text to translate or singular form
490
     * @param string $str_plurals   Plurals form string
491
     * @param int $number           Number of items for plurals
492
     * @return string
493
     */
494
    public function translate($str, $str_plurals = null, $number = null)
495
    {
496
        $translator = self::getTranslator();
497
        $translation = $translator->translate($str, $str_plurals, $number);
498
499
        return $translation;
500
    }
501
502
    /**
503
     * @param string    $str
504
     * @param string    $str_plurals
505
     * @param int       $number
506
     * @return string
507
     */
508
    public function translatable($str, $str_plurals = null, $number = null)
509
    {
510
        return $str;
511
    }
512
513
    /**
514
     * Translates all the string in an array and returns a new array.
515
     *
516
     * @param array $arr
517
     * @return array
518
     */
519
    public function translateArray($arr)
520
    {
521
        $newarr = $arr;
522
523
        foreach ($newarr as &$str) {
524
            $str = $this->translate($str);
525
        }
526
        return $newarr;
527
    }
528
529
530
531
    /**
532
     * Returns a link for writting an email to the specified email address.
533
     *
534
     * @param string $addr
535
     * @param string $subject
536
     * @param string $body
537
     *
538
     * @return string
539
     */
540
    public function mailTo($addr, $subject = null, $body = null)
541
    {
542
        $mailTo = 'mailto:' . $addr;
543
        $parameters = array();
544
        if (isset($subject)) {
545
            $parameters[] = 'subject=' . $subject;
546
        }
547
        if (isset($body)) {
548
            $parameters[] = 'body=' . $body;
549
        }
550
        if (!empty($parameters)) {
551
            $mailTo .= '?' . implode('&', $parameters);
552
        }
553
554
        return $mailTo;
555
    }
556
557
558
559
    /**
560
     * Format a number for display
561
     *
562
     * @param   float|string|null   $number     Numeric value with decimal
563
     * @return string
564
     */
565
    public function numberFormat($number, $decimals = 2)
566
    {
567
        if (is_null($number)) {
568
            return '#,##';
569
        }
570
571
        $number = number_format(floatval($number), $decimals, ',', ' ');
572
        return str_replace(' ', bab_nbsp(), $number);
573
    }
574
575
576
    /**
577
     * Format a number with an optional unit.
578
     *
579
     * If the value is >= 1000 the value is shortened and the corresponding prexif (k or M) is used.
580
     *
581
     * @param float|string|null $number
582
     * @param string $unitSymbol    (For example $, m2, Wh)
583
     * @param int $decimals
584
     * @return string|mixed
585
     */
586
    public function shortFormatWithUnit($number, $unitSymbol = '', $decimals = 2)
587
    {
588
        if (is_null($number)) {
589
            return '#,##';
590
        }
591
592
        $prefix = '';
593
        if ($number >= 1000000) {
594
            $number /= 1000000;
595
            $prefix = 'M';
596
        } elseif ($number >= 1000) {
597
            $number /= 1000;
598
            $prefix = 'k';
599
        }
600
601
        $number = number_format($number, $decimals, ',', ' ');
0 ignored issues
show
Bug introduced by
It seems like $number can also be of type string; however, parameter $number of number_format() does only seem to accept double, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

601
        $number = number_format(/** @scrutinizer ignore-type */ $number, $decimals, ',', ' ');
Loading history...
602
        return str_replace(' ', bab_nbsp(), $number . ' ' . $prefix . $unitSymbol);
603
    }
604
605
606
    /**
607
     * Reformat a phone number in the specified format.
608
     *
609
     * @param string    $phone      The phone number to be formatted
610
     * @param int       $format     The format the phone number should be formatted into
611
     *
612
     * @return string               The formatted phone number
613
     */
614
    public function phoneNumberFormat($phone, $format = null)
615
    {
616
        $PhoneNumber = bab_Functionality::get('PhoneNumber');
617
        if ($PhoneNumber === false) {
0 ignored issues
show
introduced by
The condition $PhoneNumber === false is always false.
Loading history...
618
            return $phone;
619
        }
620
621
        if (!isset($format)) {
622
            $format = bab_registry::get('/' . $this->addonName . '/numberFormat', $PhoneNumber->getDefaultFormat());
0 ignored issues
show
Bug introduced by
The method getDefaultFormat() does not exist on bab_functionality. It seems like you code against a sub-type of bab_functionality such as Func_App. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

622
            $format = bab_registry::get('/' . $this->addonName . '/numberFormat', $PhoneNumber->/** @scrutinizer ignore-call */ getDefaultFormat());
Loading history...
623
        }
624
        $phoneNumberUtil = $PhoneNumber->PhoneNumberUtil();
0 ignored issues
show
Bug introduced by
The method PhoneNumberUtil() does not exist on bab_functionality. It seems like you code against a sub-type of bab_functionality such as Func_App. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

624
        /** @scrutinizer ignore-call */ 
625
        $phoneNumberUtil = $PhoneNumber->PhoneNumberUtil();
Loading history...
625
626
        try {
627
            $phoneNumber = $phoneNumberUtil->parse($phone, 'FR');
628
            $phone = $phoneNumberUtil->format($phoneNumber, $format);
629
        } catch (\libphonenumber\NumberParseException $e) {
0 ignored issues
show
Bug introduced by
The type libphonenumber\NumberParseException was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
630
        }
631
632
        return $phone;
633
    }
634
635
636
637
638
    /**
639
     * Includes Controller class definition.
640
     */
641
    public function includeController()
642
    {
643
        require_once APP_PHP_PATH . '/controller.class.php';
644
    }
645
646
647
    /**
648
     * Includes RecordController class definition.
649
     */
650
    public function includeRecordController()
651
    {
652
        require_once APP_CTRL_PATH . '/record.ctrl.php';
653
    }
654
655
656
    /**
657
     * Instanciates the controller.
658
     *
659
     * @return app_Controller
660
     */
661
    public function Controller()
662
    {
663
        $this->includeController();
664
        return bab_getInstance($this->classPrefix.'Controller')->setApp($this);
665
    }
666
667
668
    /**
669
     * Instanciates a controller class.
670
     *
671
     * @return bab_Controller
672
     */
673
    public function ControllerProxy($className, $proxy = true)
674
    {
675
        $this->includeController();
676
677
        if ($proxy) {
678
            return app_Controller::getProxyInstance($this, $className);
679
        }
680
681
        return new $className($this);
682
    }
683
684
685
686
    /**
687
     * Include class app_Ui
688
     *
689
     */
690
    public function includeUi()
691
    {
692
        require_once APP_UI_PATH . 'ui.class.php';
693
    }
694
695
696
    /**
697
     * The app_Ui object propose an access to all ui files and ui objects (widgets)
698
     *
699
     * @return app_Ui
700
     */
701
    public function Ui()
702
    {
703
        $this->includeUi();
704
        return bab_getInstance($this->classPrefix . 'Ui');//->setApp($this);
705
    }
706
707
    /**
708
     * Get upload path
709
     * if the method return null, no upload functionality
710
     *
711
     * @return bab_Path
712
     */
713
    public function getUploadPath()
714
    {
715
        require_once $GLOBALS['babInstallPath'].'utilit/path.class.php';
716
        return new bab_Path(bab_getAddonInfosInstance($this->getAddonName())->getUploadPath());
717
    }
718
719
720
    /**
721
     *
722
     * @param string $name
723
     * @param mixed $arguments
724
     * @return mixed
725
     */
726
    public function __call($name, $arguments)
727
    {
728
        switch (true) {
729
730
            case substr($name, -strlen('SetClassName')) === 'SetClassName':
731
                $setName = substr($name, 0, strlen($name) - strlen('ClassName'));
732
                return $this->classPrefix . $setName;
733
734
            case substr($name, -strlen('ClassName')) === 'ClassName':
735
                $recordName = substr($name, 0, strlen($name) - strlen('ClassName'));
736
                return $this->classPrefix . $recordName;
737
738
            case substr($name, 0, strlen('include')) === 'include' && substr($name, -strlen('Set')) === 'Set':
739
                $fileNameBase = strtolower(substr(substr($name, 0, strlen($name) - strlen('Set')), strlen('include')));
740
                require_once PHP_SET_PATH . $fileNameBase . '.class.php';
0 ignored issues
show
Bug introduced by
The constant PHP_SET_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
741
                return;
742
743
            case substr($name, -strlen('Set')) === 'Set':
744
                $includeMethod = 'include' . $name;
745
                $this->$includeMethod();
746
                $setClassNameMethod = $name . 'ClassName';
747
                $className = $this->$setClassNameMethod();
748
                $set = new $className($this);
749
                return $set;
750
751
                //case method_exists($this, $name . 'Set'):
752
            default:
753
                $setName = $name . 'Set';
754
                $recordClassNameMethod = $name . 'ClassName';
755
                $recordClassName = $this->$recordClassNameMethod();
756
                if (isset($arguments[0])) {
757
                    if ($arguments[0] instanceof $recordClassName) {
758
                        return $arguments[0];
759
                    }
760
                    $set = $this->$setName();
761
                    return $set->get($arguments[0]);
762
                }
763
                return null;
764
        }
765
    }
766
767
768
    /**
769
     * Test if this App implementation handles the specified object class.
770
     *
771
     * The default is to consider that an object Xxxx implemented if the includeXxxxSet() method is
772
     * declared public on this App.
773
     *
774
     * @param	string	$objectClassName		App object name (eg. 'Contact' or 'CatalogItem')
775
     * @return bool
776
     */
777
    public function __isset($objectClassName)
778
    {
779
        if (null === $this->implementedObjects) {
780
781
            $this->implementedObjects = array();
0 ignored issues
show
Bug Best Practice introduced by
The property implementedObjects does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
782
783
            $className = get_class($this);
784
            $rClass = new ReflectionClass($className);
785
786
            foreach ($rClass->getMethods(ReflectionMethod::IS_PUBLIC) as $m) {
787
788
                // We consider object Xxxx implemented if the includeXxxxSet() method is
789
                // declared public on this.
790
791
                if ($m->getDeclaringClass()->name !== $className) {
792
                    // The method is declared on an ancestor class.
793
                    continue;
794
                }
795
796
                if (substr($m->name, 0, 7) === 'include' && substr($m->name, -3) === 'Set') {
797
                    $this->implementedObjects[substr($m->name, 7, -3)] = 1;
798
                }
799
            }
800
        }
801
802
        return isset($this->implementedObjects[$objectClassName]);
803
    }
804
}
805
806
spl_autoload_register(array(app_App(), 'loadObject'));
807
808