Sunday, November 29, 2009

Иcправление DTD

Некоторые пакеты генерируются документацию через xmlto которая в свою очередь проверяет xml на валидность, иногда там прописаны более новые файлы чем установленные в дистрибутиве, чтобы исправить это мелкое неудобство можно использовать такой скриптик:
list=`grep 'OASIS//DTD DocBook XML V4.4' * -r | sed 's/:/ /' | awk '{print $1}'| grep '.xml'`
for file in $list
do
    sed -i 's/DTD DocBook XML V4.4/DTD DocBook XML V4.2/' $file
    sed -i 's/http\:\/\/www.oasis-open.org\/docbook\/xml\/4.4\/docbookx.dtd/http\:\/\/www.oasis-open.org\/docbook\/xml\/4.2\/docbookx.dtd/' $file
    echo 'fix for '$file'done'
done

Friday, November 27, 2009

symfony мелкие советы


Symfony logo

Создание меню загрузки файлов:

Создаем простое текстовое поле(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);
Основная особенность нужно объединить сначала части запроса, а уже потом добавлять в основной запрос.