Ура! Версия 1.4 - это тоже, что и 1.3 минус устаревшие фичи.
Официальный анонс.
Показаны сообщения с ярлыком symfony. Показать все сообщения
Показаны сообщения с ярлыком symfony. Показать все сообщения
вторник, 1 декабря 2009 г.
среда, 25 ноября 2009 г.
Symfony Custom Filter in Admin Generator
Небольшой snippet по расширению Form Filter.
Например есть табличка с заказами Order, табличка с товарами Product и связующая табличка OrderProduct. В backend необходимо добавить возможность фильтрации по id заказа (странно что symfony сама не добавляет в фильтр id) и по названию товара в заказе.
Первым делом изменяем OrderFormFilter:
Теперь нужно добавить новые поля в generator.yml:
Например есть табличка с заказами Order, табличка с товарами Product и связующая табличка OrderProduct. В backend необходимо добавить возможность фильтрации по id заказа (странно что symfony сама не добавляет в фильтр id) и по названию товара в заказе.
Первым делом изменяем OrderFormFilter:
class OrderFormFilter extends BaseOrderFormFilter { public function configure() { $this->widgetSchema['id'] = new sfWidgetFormInput(); $this->validatorSchema['id'] = new sfValidatorInteger(array('required' => false)); $this->widgetSchema['prodname'] = new sfWidgetFormInput(); $this->validatorSchema['prodname'] = new sfValidatorString(array('required' => false)); } public function getFields() { $fields = parent::getFields(); $fields['id'] = 'Number'; $fields['prodname'] = 'Text'; return $fields; } public function addIdColumnQuery(Doctrine_Query $query, $field, $value) { $query->andWhere('r.id = ? ', $value); } public function addProdnameColumnQuery(Doctrine_Query $query, $field, $value) { $query->leftJoin('r.Products p')->andWhere('p.name LIKE ?', "%$value%"); } }
Теперь нужно добавить новые поля в generator.yml:
filter: display: [ id, prodname, ..... ]
Метки:
symfony
вторник, 6 октября 2009 г.
Readonly fields in symfony
Иногда бывает необходимо просто отобразить поле в форме без возможности его изменения. Обычно это актуально для автогенерируемых полей, таких как created_at и updated_at. Проблема в том, что поля типа datetime отображаются в виде набора селектов (sfWidgetFormSelect) и простое навешивание атрибута readonly не поможет:
Если по каким-либо причинам понадобилось вместо поля ввода (input) отображать просто текст, то можно создать виджет myWidgetFormPlain
$this->widgetSchema['created_at']->setAttribute('readonly', 'readonly');Наиболее простым выходом из ситуации будет замена виджета sfWidgetFormDateTime на sfWidgetFormInput:
public function configure() { // ... $this->widgetSchema['created_at'] = new sfWidgetFormInput(array(), array('readonly'=>'readonly')); // ... }
Если по каким-либо причинам понадобилось вместо поля ввода (input) отображать просто текст, то можно создать виджет myWidgetFormPlain
class myWidgetFormPlain extends sfWidgetForm { protected function configure($options = array(), $attributes = array()) { } public function render($name, $value = null, $attributes = array(), $errors = array()) { return $value ? $value : '—'; } }При использовании этого виджета необходимо отключить валидатор:
public function configure() { // ... $this->widgetSchema['created_at'] = new myWidgetFormPlain(); unset($this->validatorSchema['created_at']); // ... }
Метки:
symfony
понедельник, 28 сентября 2009 г.
Routing cache в symfony
Уже довольно давно хотел написать об этом, но всё руки не доходили.
При довольно большом количестве ссылок иногда можно наблюдать ошибку такого плана
Кеш представляет собой огромный сериализованный массив в файле
app/cache/frontend/prod/config/routing/symfony.routing.data.cache
Существует несколько вариантов решения этой проблемы, но для себя самым оптимальным я нашел просто отключение кеша для роутера. В factories.yml
При довольно большом количестве ссылок иногда можно наблюдать ошибку такого плана
Allowed memory size of ******** bytes exhausted (tried to allocate ******* bytes) in app/cache/frontend/prod/config/config_core_compile.yml.php on line 3369Происходит это из-за того, что кеш роутинга становится слишком большим.
Кеш представляет собой огромный сериализованный массив в файле
app/cache/frontend/prod/config/routing/symfony.routing.data.cache
Существует несколько вариантов решения этой проблемы, но для себя самым оптимальным я нашел просто отключение кеша для роутера. В factories.yml
all: routing: class: sfPatternRouting param: cache: { class: sfNoCache }Почему я только сейчас пишу об этом? Да потому что только что вышла symfony 1.2.9, в которой как раз по дефолту и отключен кеш роутинга :)
Метки:
symfony
суббота, 26 сентября 2009 г.
воскресенье, 20 сентября 2009 г.
get_partial & task в symfony
Есть проект на symfony.
Имеется консольная задача в которой необходимо выполнять рассылку писем.
Тело письма создаётся через get_partial.
В шаблоне письма есть link_to и/или url_for.
Проблема в том, что роутер не может создать правилый URL, т.к. приложение выполняется вне web-окружения и вместо нормальных ссылок получаем что-то типа http://symfony/symfony/post/2009.
Я выкрутился следующим способом
Имеется консольная задача в которой необходимо выполнять рассылку писем.
Тело письма создаётся через get_partial.
В шаблоне письма есть link_to и/или url_for.
Проблема в том, что роутер не может создать правилый URL, т.к. приложение выполняется вне web-окружения и вместо нормальных ссылок получаем что-то типа http://symfony/symfony/post/2009.
Я выкрутился следующим способом
$_SERVER['HTTP_HOST'] = 'myhost'; $_SERVER['SCRIPT_NAME'] = '/index.php'; $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); $context = sfContext::createInstance($configuration); $configuration->loadHelpers('Partial'); $body = get_partial('post/mail_notify', array('myvar' => $myval));Обратите внимание на параметр 'prod'. Это необходимо для того что бы роутер смог выкинуть /index.php из URL'а (если generate_shortest_url=true в factories.yml)
Метки:
symfony
Подписаться на:
Сообщения (Atom)