Aug 11 2008

Проблема при использовании sfWidgetFormPropelSelect от плагина sfPropelPlugin

Category: SymfonyIgor @ 15:47

sfPropelPlugin это плагин для работы с Propel 1.3. Текущая версия 1.3.0 stable от 28/05/2008. Наткнулся на проблему при использовании виджета sfWidgetFormPropelSelect. Если указать порядок сортировки, то получаем ошибку на экран.


Например, имеем форму со следующий кодом:

class BaseNewsForm extends BaseFormPropel
{
  public function setup()
  {
    $this->setWidgets(array(
      'news_id'        => new sfWidgetFormInputHidden(),
      'category_id'        => new sfWidgetFormPropelSelect(array('model' => 'NewsCategory',
                                    'method' => 'getName', 'order_by' => array('Name', 'asc'))),
      'title'       => new sfWidgetFormInput()
    ));

Сортировка по полю «Name» не получиться, т.к. есть баг в коде. Плагин давно не обновляли, но в репозитории есть свежий код, и эта проблема решена, чтобы получить плагин из SVN, выполните следующую команду:

svn co http://svn.symfony-project.com/plugins/sfPropelPlugin/branches/1.3/ .

Учтите все это делаете на свой страх и риск, т.к. это не релиз.

Кстати, если не переназначить опцию «method» своим методом, то по умолчанию будет использоваться метод __toString, которого нет в сгенерированных формах. В этом случае получим на экран сообщение об ошибке

Class "NewsCategory" must implement a "__toString" method to be rendered in a "sfWidgetFormPropelSelect" widget

Альтернативным решением будет добавление метода __toString в NewsCategory.php

  function __toString()
  {
    return $this->getName();
  }

Tags: , ,

3 Responses to “Проблема при использовании sfWidgetFormPropelSelect от плагина sfPropelPlugin”

  1. scard says:

    Данная проблема могла быть решена проще — можно самостоятельно вытащить набор данных и поступить (например) так
    $c = new Criteria();
    $myTmpList = CategoriesPeer::doSelect($c);
    $myCategories = array();
    foreach ($myTmpList as $v){
    $myCategories[$v->getId()] = $v->getTitle();
    }

    и далее:

    $this->setWidgets(array(
    ‘categories_id’ => new sfWidgetFormSelect(array(‘choices’=>$myCategories)),

    и для валидации прописываем правило:
    $this->setValidators(array(
    ‘categories_id’ => new sfValidatorChoice(array( ‘choices’ => array_keys ( $myCategories ))),

    В целом симфони очень гибкий предмет — всегда практически можно сказать «а мы пойдем другим путём», за что и любимый фреймворк ))

  2. scard says:

    Дополнительно — понятное дело что можно указать не обязательно ID для элемента SELECT и через критерии организовать сортировку в любом направлении

  3. ingvar says:

    Все верно, сам пользуюсь предложенным Вами вариантом, с использованием виджета sfWidgetFormSelect. Спасибо им за гибкость :)

Leave a Reply to ingvar