Статьи
Настройка шаблонов для 500 ошибки и unavailable
Эти страницы не находятся в дефолтном модуле, так как они вызываются, когда symfony срабатывает не так как задумано. Эти шаблоны можно найти в $sf_symfony_lib_dir/exception/data/ директории:
- error.html.php: страничка вываливается, когда на сервере происходит внутренняя ошибка в продакш моде, в других модах(enviroment), где флаг debug стоит в true, вываливается exception c полным стеком вызовов и указанием ошибки
- unavailable.php: страничка вываливается, когда юзер запрашивает страницу в то время как ваш сайт disabled (при помощи disabled task: "php symfony project:disable application env"), короче находится в спячке (under construction). А так же эта страница появляется, когда происходит очистка кэша (php symfony cc). То есть в промежуток времени, когда вы запустили task и до его окончания. На крупных сайтах кэш может быть большим и его чистка порой занимает несколько секунд. Symfony не обрабатывает запрос при частично очищенном кэше, поэтому запросы, пришедшие до окончания очистки кэша, будут отправлены на эту страницу .
Чтобы кастомизировать эти страницы, просто создайте директорию error в config директории всего вашего проекта или отдельно для каждого application. Либо тут my_project/config/error, либо my_project/apps/frontend/config/error. Создайте в этой папке файлы error.html.php и unavailable.php - symfony будет использовать их, вместо своих.
Настройка собственного действия и шаблона ошибки 404
Необходимо активировать error_404_module и error_404_action в конфигурационном файле settings.yml
# apps/frontend/config/settings.yml
all:
.actions:
error_404_module: error # Необходимо указать ваш модуль
error_404_action: 404 # и действие
Как получить доступ к перменным сессии пользователя в form классах
К примеру вот так:
# lib/form/YourForm.class.php
sfContext::getInstance()->getUser()->->getAttribute('...');
В чем разница между redirect и forward в Symfony
В некоторых случаях выполнение action заканчивается вызовом другого action. Например, action выполняющий обработку POST запроса, обычно редиректит(redirect) в другой action после сохранения данных в базу. Другой пример - подмена action, обычно используется в index actions, когда надо вывести список элементов, здесь происходит перенаправление в list action (forward). Базовый класс sfActions поддерживает два метода, чтобы перенаправить приложение в другое русло: Если action перенаправляет вызов в другой action:
$this->forward('otherModule', 'index');
Объект роутинга в компонентах
Объект роутинга в компонентах
# apps/frontend/modules/module/actions/components.class.php
class modulenameComponents extends sfComponents
{
public function executeAction(sfWebRequest $request)
{
$object = $this->getContext()->getController()
->getAction($this->getModuleName(), $request->getParameter('action'))
->getRoute()->getObject();
}
}
Выбор года из списка
Выбор даты года из списка. В years задается диапазаон дат.
$years = range(date('Y') - 110, date('Y'));
'founded' => new sfWidgetFormDate(array('format' => '%year%', 'years' => $years)),
Регистр в объявлении action`а в roting.yml
Недавно столкнулись с проблемой в тесте. В тесте с помощью sfBrowser (sfTestFunctional) запрашивали страничку, используя роут:
url_for('@cart_clear');
роут был объявлен следующим образом routing.yml:
cart_clear:
url: /cart/clear
params: {module: cart, action: clearcart}
Хостинг под symfony
Че то не задавался таким вопросом раньше, сейчас решил рассмотреть этот вопрос. На своих проектах я стараюсь не использовать хостинг как таковой, а брать VDS/VPS и его настраивать под задачу. Что нам нужно, чтобы сайт на симфони нормально функционировал?
сортировка в object_select_tag propel
Часто приходится выводить выпадающий список с object_select_tag, но сортировать по произвольному полю в базе. Пример использования object_select_tag
echo object_select_tag($domain, 'getObjectId', array (
'related_class' => 'Object',
'peer_method' => 'getSortedObject',
'control_name' => 'object_id',
'include_blank' => true,
));
Изменение прав (credentials) пользователя без релогина используя sfDoctrineGuardPlugin
Регистрируясь в нашей системе пользователь должен подтвердить свой email. Как только пользователь подтверждает свой email его с чистой совестью можно добавить в группу «client» и разрешить использовать все возможности нашей системы не требуя перелогиниться. И вот вчера, решая эту простую задачу я столкнулся с очень любопытным явлением, о котором я бы хотел рассказать.
Интернализация заголовков (title)
При создании мультиязычного приложения, обязательно, сталкиваешься с проблемой перевода, не только контента, но и всего интерфейса приложения, включая и заголовки. Рассмотрим, несколько способов перевода:
symfony task doctrine:custom-build-sql
Нашел небольшой класс для генерации sql файла для моделей sfDoctrineCustomBuildSqlTask.class.php
Очиска кеша через веб
Небольшой кодес, который, поможет вам не удалять файлы вручную, а использовать веб=)
require_once(dirname(__FILE__).'/../../config/ProjectConfiguration.class.php');
$configuration = ProjectConfiguration::getApplicationConfiguration('backend', 'prod', false);
sfContext::createInstance($configuration);
chdir(sfConfig::get('sf_root_dir'));
$task = new sfCacheClearTask(sfContext::getInstance()->getEventDispatcher(), new sfFormatter());
$arguments = array();
$options = array('env' => 'prod');
$task->run($arguments, $options);
Соответсветственно, указывается режим dev/prod
url_for в action
Для того чтобы сгенерировать ссылку в экшене:
$this->getController()->genUrl('action/method?key=value');
Или подключить хелпер Url
Upload файлов в симфони
Есть два способа загрузки файлов, первый через форму, а второй такой: