Как я могу установить собственный класс тегов в Volt (Phalcon)

Я хочу повторно объявить и добавить некоторые методы в вспомогательный тег.

class MyTags extends \Phalcon\Tag
{
    public static function mytag($params)
    {
       <...>
    }
}

в services.php

$di->set('tag', function() {
    return new MyTags();
};

Но это работает только для PHP-движка, а не для Volt.

{{ mytag() }}

вернулся

Undefined function 'mytag'

person vanchester    schedule 07.08.2013    source источник


Ответы (1)


Прежде всего: не используйте tag в качестве имени службы, потому что оно уже используется объектом Tag Phalcon. Во-вторых, вы можете использовать статические методы из класса.

Ниже приведен рабочий пример для myTag с использованием конфигурации из моего приложения с измененными именами для вашего примера.

$di->set(
'view',
function () use ($config) {
    $view = new View();
    $view->setViewsDir($config->application->viewsDir);
    $view->registerEngines(
        array(
            '.volt' => function ($view, $di) use ($config) {

                $volt = new VoltEngine($view, $di);
                $volt->setOptions(
                    array(
                        'compiledPath' => $config->application->cacheDir,
                        'compiledSeparator' => '_',
                        'compileAlways' => false
                    )
                );
                $compiler = $volt->getCompiler();

                // add a function
                $compiler->addFunction(
                    'myTag',
                    function ($resolvedArgs, $exprArgs) {
                        return 'MyTags::mytag(' . $resolvedArgs . ')';
                    }
                );

                // or filter
                $compiler->addFilter(
                    'myFilter',
                    function ($resolvedArgs, $exprArgs) {
                        return 'MyTags::mytag(' . $resolvedArgs . ')';
                    }
                );

                return $volt;
            }
        )
        );

        return $view;
    },
    true
);

Затем вы можете использовать свою функцию myTag() в представлениях volt.

Но если вы хотите использовать объект, не используйте статические методы:

class MyTags extends \Phalcon\Tag
{
    /**
     * Look no static keyword here
     */
    public function mytag($params)
    {
       <...>
    }
}

в сервисах использовать объект:

$di->set('mahTag', function() {
    return new MyTags();
};

а затем в вольтах:

{{ mahTag.mytag() }}
person jodator    schedule 08.08.2013