2016-08-25 3 views
0

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

В моей 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)" вместо типа массива. Это помогло моему помощнику прекратить работать.

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

ОБНОВЛЕНИЕ: После применения предложения @ Николай Михайлов.

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

Fatal error: Class 'MyCustomUrlHelper' not found in cache/volt/%apps%%invo%%views%%test%%list.volt.php on line 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(); 
................... 
........................ 

В моих Модули/Библиотека каталога, у меня есть этот 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; 
    } 

} 
?> 

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

ответ

1

Это правильный путь, простирающейся вольт:

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

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

Functions act as normal PHP functions, a valid string name is required as function name. Functions can be added using two strategies, returning a simple string or using an anonymous function. Always is required that the chosen strategy returns a valid PHP string expression.

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

Docs: https://docs.phalconphp.com/en/latest/reference/volt.html#id1

Подобный вопрос в SO: Sending variable from volt to custom function


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

Volt пользовательские функции:

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

Helper файл:

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

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

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

Array 
(
    [0] => asd 
    [1] => asd1 
) 
+0

Да, верно, но то, что вы указано выше будет принимать только строковые параметры. Мои параметры $ - динамический массив. Это может быть 3 значения или 4 значения только в одном запросе пользовательскому помощнику. Моя проблема заключается в том, как сделать $ parameters для типа массива not string. – user1149244

+0

Просто проверьте его, и вы увидите, что он работает по назначению. Обновление моего ответа с помощью тестового примера. –

+0

Я только что попробовал, и теперь я получил эту ошибку, Неустранимая ошибка: Class 'MyCustomUrlHelper' не найден в cache/volt /% apps %% invo %% views %% test %% list.volt.php в строке 56. Я буду добавьте мой пример кода выше, чтобы было легче читать – user1149244

Смежные вопросы