В 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); // таким чином відключається екранування методу класу
Останній спосіб є найбільш прийнятним у реальних проектах.