В Symfony распространенной проблемой является то, что массивы, которые передаются от action в template превращаются в sfOutputEscaperArrayDecorator. А в шаблоне все функции для работы с массивами перестают работать из-за того, что тип переменной sfOutputEscaperArrayDecorator, а не array. Рассмотрим несколько вариантов отключения экранирования, что является причиной подобного поведения Symfony.
Чтобы отключить экранирование во всем проекте необходимо в файле /apps/frontend/config/settings.yml установить переменную escaping_strategy в false:
all:
escaping_strategy: false
Мы не рекомендуем отключать экранирование во всем проекте. Эта функция помогает избежать множества ошибок и обезопасить приложение.
Второй способ - отключение экранирования всех переменных в одном action'е. Делается это следующим способом:
public function executeShow(sfWebRequest $request)
{
sfConfig::set('sf_escaping_strategy', false);
}
Мы также не рекомендуем использовать этот способ, но если Вы выбрали именно этот метод, то необходимо также следить за корректной обработкой данных, полученных от пользователя.
Третий, традиционный способ, - отключение экранирования конкретной переменной. Это делается с помощью выражения $sf_data->getRaw("имя_переменной"). Например, в Вашем action есть массив test:
...
this->test = array('first', 'second', 'third');
...
Для того, чтобы в template получить переменную test, которая не подверглась экранизации, необходимо использовать следующее выражение $sf_data->getRaw('test'):
$test; // экранированная переменная test
$sf_data->getRaw('test'); // оригинальная неэкранированная переменная test
$object->getName(ESC_RAW); // таким образом отключается экранирование метода класса
Последний способ является наиболее приемлемым в реальных проектах.