Phalcon Volt Array имеет строковый тип.

У меня есть шаблон Phalcon volt, который я хотел вызвать в своем пользовательском помощнике, он примет массив, но массив, отправленный помощнику, имеет строковый тип.

В моем list.volt у меня есть этот код,

{% set myfolder = data.foldername %}
{% set key = data.folderkey %}
{% set url = convert([myfolder, key]) %}

В мой loader.php я объявил вспомогательный каталог и получил следующий код:

 //$params should be single dimensional array
 $compiler->addFunction('convert', function($params){
      var_dump($params);
      return MyCustomHelper::convert($params);  
 });

Будет выводить string(31) "array($fname, $fkey)" вместо типа массива. Это заставило моего помощника перестать работать.

Кто-нибудь сталкивался с этим, мне нужно, чтобы он был типа массива, а не строки?

ОБНОВЛЕНИЕ: после применения предложения @Nikolay Mihaylov.

Получил ошибку

Неустранимая ошибка: класс MyCustomUrlHelper не найден в cache/volt/%apps%%invo%%views%%test%%list.volt.php в строке 56.

В моем services.php я включил свой вспомогательный каталог

use Modules\Library\MyCustomUrlHelper;

/*
    ......
    Some code here
   ..............................
   ....................

*/

$compiler->addFunction('convert', function($resolvedArgs, $exprArgs){ 
                    return 'MyCustomUrlHelper::convert('.$resolvedArgs.')';
                });

В loader.php я зарегистрировал каталог

 ........
..................... 
$loader->registerDirs(array(APP_PATH.'Modules/Library'))->register();
...................
........................

В моем каталоге Modules/Library у меня есть этот файл MyCustomUrlHelper.php.

<?php
namespace Modules\Library;
use Phalcon\Tag;    

class MyCustomUrlHelper extends Tag
{

    public function convert($params)
    {
        if(!is_array($params))
        {
            $params = array($params);   
        }

        /*
            ..... some code here ...
            .................
            ..........  
        */

        return $converted;
    }

}
?>

Я пропустил что-то еще?


person user1149244    schedule 25.08.2016    source источник


Ответы (1)


Это правильный способ расширения volt:

$compiler->addFunction('convert', function($resolvedArgs, $exprArgs){
    return 'MyCustomHelper::convert(' . $resolvedArgs . ')';  
});

Позволю себе процитировать документы:

Функции действуют как обычные функции PHP, в качестве имени функции требуется допустимое строковое имя. Функции можно добавлять с помощью двух стратегий: возвращая простую строку или используя анонимную функцию. Всегда требуется, чтобы выбранная стратегия возвращала допустимое строковое выражение PHP.

Больше информации по следующим ссылкам:

Документы: https://docs.phalconphp.com/en/latest/reference/volt.html#id1

Аналогичный вопрос в SO: Отправка переменной из volt в пользовательскую функцию


Обновление: добавлен пример кода и вывод.

Пользовательская функция Вольт:

$compiler->addFunction('testArrays', function($resolvedArgs, $exprArgs) {
    return 'Helpers\VoltCms::testArrays(' . $resolvedArgs . ')';
}); 

Вспомогательный файл:

public static function testArrays($param)
{
    d($param);
}

Использование и вывод:

{{ testArrays(['asd', 'asd1']) }}

Array
(
    [0] => asd
    [1] => asd1
)
person Nikolay Mihaylov    schedule 25.08.2016
comment
Да, верно, но то, что вы указали выше, будет принимать только строковые параметры. Мои параметры $являются динамическим массивом. Это может быть 3 значения или 4 значения всего за один запрос к пользовательскому помощнику. Моя проблема заключается в том, как сделать тип массива $parameters не строковым. - person user1149244; 25.08.2016
comment
Просто протестируйте его, и вы увидите, что он работает так, как задумано. Обновление моего ответа тестовым примером. - person Nikolay Mihaylov; 25.08.2016
comment
Я только что попробовал, и теперь я получил эту ошибку, Неустранимая ошибка: класс «MyCustomUrlHelper» не найден в кеше/volt/%apps%%invo%%views%%test%%list.volt.php в строке 56. Я добавлю мой пример кода выше, чтобы его было легче читать - person user1149244; 26.08.2016
comment
Хорошо понял, почему я получил эту фатальную ошибку. Вы должны поместить весь каталог в регистрацию компилятора сервисов, как в моем случае, это будет return 'Modules\Library\MyCustomUrlHelper.php::convert('.$resolvedArgs.')'; И в вашем помощнике метод должен быть общедоступной статической функцией convert($params) { определить некоторый код}, иначе вы получите предупреждение Строгие стандарты: нестатический метод Модули не должны вызываться статически. Я считаю это решением сейчас. Спасибо, @Nikolay! - person user1149244; 26.08.2016
comment
Что это d($param); означает? - person Boris Delev; 26.08.2016
comment
d() — красивая оболочка для печати print_r() :) - person Nikolay Mihaylov; 26.08.2016