Создание меню загрузки файлов:
Создаем простое текстовое поле(logo например) для хранения пути файла и в наследнике от автоматически созданной формы в функцию configure дописываем:
$this->widgetSchema['logo'] = new sfWidgetFormInputFileEditable(array(
'label' => 'Attachments',
'file_src' => '/uploads/'.$this->getObject()->getLogo(),
'is_image' => true,
'edit_mode' => !$this->isNew(),
'template' => '
%input%
%delete% %delete_label%
%file%
',
));
$this->validatorSchema['logo'] = new sfValidatorFile(array(
//если указан путь, то кроме проверки еще и сохраняет,
//путь относительно uploads
'path' => sfConfig::get('sf_upload_dir').'/',
'required' => false,
'mime_types' => 'web_images'
));
$this->validatorSchema['logo_delete'] = new sfValidatorPass();
создание дополнительной проверки по полю(не стандартной):
Добавлять туда же:
$this->validatorSchema['name'] = new sfValidatorAnd(
array(
new sfValidatorCallback(
array('callback'=>
array($this->getObject(), 'check')
)
),
$this->validatorSchema['name'] /*previous value*/
)
);
В модели создаем дополнительную функцию check вида:
public function check($validator, $value) {
if(haveError($value))
throw new sfValidatorError($validator, $message);
}
return $value;
}
для проверки более чем одного поля одновременно:
(Приходят все поля после проверки по каждому полю отдельно):
form:
$this->mergePostValidator( new sfValidatorCallback(
array('callback'=>
array($this->getObject(), 'check')
)
model:
public function check($validator, $values) {
if(haveError($values))
throw new sfValidatorError($validator, $message);
}
return $values;
}
sfPropelPager
Особенность в sfPropelPager - при подсчете количества страниц он сбрасывает поля группировки - результат может быть больше чем реально существует.
Формирование сложных запросов:
Нахождение имени в нескольких полях:
select * from people where (name like ('%abc%') ) OR (last_name like ('%abc%') );
Выглядит таким образом:
$name = $c->getNewCriterion(PeoplePeer::NAME, '%abc%', Criteria::LIKE);
$last = $c->getNewCriterion(PeoplePeer::LAST_NAME, '%abc%', Criteria::LIKE);
$last->addOr($name);
$c->addOr($last);
Основная особенность нужно объединить сначала части запроса, а уже потом добавлять в основной запрос.