fenom-template / fenom

Template Engine for PHP. Maintainers wanted!
Other
446 stars 108 forks source link

Правильное добавление модификаторов #112

Closed pafnuty closed 10 years ago

pafnuty commented 10 years ago

Не могу справиться с правильным добавлением собственного модификатора. Для примера воспроизвёл в упрощённой форме то место, где у меня возникает ошибка.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Пример ошибки</title>
</head>
<body>

<?php
// Этот массив содержит конфиг системы
$cfg = array('one' => 'one', 'two' => 'two' );

require_once(__DIR__ . '/fenom/src/Fenom.php');
\Fenom::registerAutoload();

class myClass {

    var $tpl = false;
    var $config = array();

    function __construct($config)   {

        $this->config = $config;

        $this->tpl = Fenom::factory(
            __DIR__ . '/templates/',
            __DIR__ . '/cache/'

        );
        $this->tpl->setOptions(array('auto_reload' => true, 'disable_cache' => true));

        $this->tpl->addModifier(
            'declination', function ($n, $word) {
                return myClass::declinationWords($n, $word);
            }
        );

        $this->tpl->addModifier(
            'mymod', function ($word, $mod) {
                return myClass::mymod($word, $mod);
            }
        );

    }

    static function declinationWords($n = 0, $words) {
        $words = explode('|', $words);
        $n     = intval($n);

        return $n % 10 == 1 && $n % 100 != 11 ? $words[0] . $words[1] : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? $words[0] . $words[2] : $words[0] . $words[3]);
    }

    static function mymod($word, $mod) {
        // Вот так выдаёт ошибку
        // Fatal error: Using $this when not in object context in
        //
        return $word . ' + ' . $this->config[$mod];
    }

} //myClass

/////////////////////////////

$example = new myClass($cfg);

$output = $example->tpl->display('list.tpl');

?>
</body>
</html>

функция declinationWords нормально работает, а вот mymod - выдаёт ошибку: Fatal error: Using $this when not in object context in ...

Буду благодарен за подсказку в каком направлении копать.

bzick commented 10 years ago

Все верно, у статического класса нет $this, надо использовать self. Вам надо либо сохранить $config в класс myClass, что бы использовать вариант

static function mymod($word, $mod) {
        return $word . ' + ' . self::$config[$mod];
    }

либо использовать только анонимную функцию:


$this->tpl->addModifier(
            'mymod', function ($word, $mod) use ($config) {
                return $word . ' + ' . $config[$mod];
            }
        );

либо увеличить количество аргументов в методе mymod:

$this->tpl->addModifier(
            'mymod', function ($word, $mod) use ($config) {
                return myClass::mymod($word, $mod, $config);
            }
        );
// ...
static function mymod($word, $mod, $config) {
        return $word . ' + ' . $config[$mod];
    }

ну а также есть еще куча других варантов решающие доступность $config в классе myClass

pafnuty commented 10 years ago

Спасибо! Сделал по третьему предложенному варианту.