2012-06-28 3 views
0

В одной из моих форм я хотел бы иметь выпадающий список (sfWidgetFormChoice), где параметры генерируются динамически, выполняя запрос в базе данных.Как заполнить виджет выбора Symfony динамически с результатом запроса БД

Чтобы быть более точным, я собираюсь перечислить все версии, которые у меня есть в таблице. Запрос выглядит примерно так:

select distinct version from mytable order by version desc 

То, что я до сих пор, но не работает:

class myForm extends sfForm 

$query = "select distinct version from mytable order by version desc"; 

$versions = Doctrine_Manager::getInstance()->getCurrentConnection()->fetchAssoc($query); 

public function configure() 

$this->setWidgets(array('version' => new sfWidgetFormChoice(array('choices' => self::$versions)))); 

Edit:

Thansk ребята за ваши ответы! Очень признателен!

В любом случае ваши решения основываются на модели стола. Я бы предпочел иметь PDO напрямую, поскольку это быстрее.

В Symfony Documentation Я нашел то, что искал в разделе «Использование исходных SQL-запросов».

Так что я продлил свою форму, чтобы закончить с этим:

class myForm extends sfForm 
{ 
    public function getVersions() 
    { 
    $connection = Doctrine_Manager::connection(); 
    $query  = "select distinct version from mytable order by version desc"; 
    $statement = $connection->prepare($query); 
    $statement->execute(); 
    $resultset = $statement->fetchAll(PDO::FETCH_COLUMN, 0); 

    return $resultset; 
    } 

    public function configure() 
    { 
    $this->setWidgets(array('version' => new sfWidgetFormChoice(array('choices' => self::getVersions())))); 
    } 
} 

В результате этого моего выпадающего списка получает правильно заполнен, что в моем столе, яй! НО я получаю также предупреждения:

Warning: Invalid argument supplied for foreach() in lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php on line 196

Warning: join() [function.join]: Invalid arguments passed in lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php on line 141

Warning: Invalid argument supplied for foreach() in lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineConnectionProfiler.class.php on line 196

Warning: Invalid argument supplied for foreach() in lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/debug/sfDoctrineConnectionProfiler.class.php on line 117

Любая идея, что я делаю неправильно здесь ??? Как ни странно, выпадающее меню выглядит отлично.

ответ

0

я, наконец, нашел решение, которое я искал сам. Теперь он напрямую обращается к БД. Причина, по которой я больше не использую FETCH_COLUMN, заключается в том, что это создаст массив, в котором ключ является идентификатором, начинающимся с 0, и значением является то, что возвращается самим запросом. Вместо этого я хотел, чтобы ключ и значение выполнялись независимо от запроса. Вот почему запрос теперь предоставляет два столбца одинаковыми, а затем FETCH_KEY_PAIR делает все остальное.

В случае, если кто-либо еще заинтересован в том, как я решил это, вот мой код, который правильно заполняет капли и не вызывает ошибок.

class myForm extends sfForm 
{ 
    public function getVersions() 
    { 
    $connection = Doctrine_Manager::getInstance()->getCurrentConnection()->getDBh(); 
    $query  = "select distinct version as key, version as value from mytable order by version desc"; 
    $statement = $connection->prepare($query); 
    $statement->execute(); 
    $resultset = $statement->fetchAll(PDO::FETCH_KEY_PAIR); 

    return $resultset; 
    } 

    public function configure() 
    { 
    $this->setWidgets(array('version' => new sfWidgetFormChoice(array('choices' => self::getVersions())))); 
    } 
} 
+0

Это действительно очень плохое использование форм и виджета, и это вовсе не MVC. 'sfWidgetFormDoctrineChoice' с пользовательским запросом - это, безусловно, путь. – DevAntoine

0

Вы можете использовать sfWidgetFormDoctrineChoice

public function configure(){ 

$this->widgetSchema['version'] = new sfWidgetFormDoctrineChoice(array('model' => 'YourModel', 'query' => Doctrine::getTable('YurModel')->getYourDataQuery(), 'add_empty' => true)); 

} 

И в вашем modelTable.class.php

public function getYourDataQuery() 
    { 
      //Your query 

      $q = $this->createQuery('a');   

     return $q; 
    } 
1

Используйте table_method вариант sfWidgetFormDoctrineChoice так:

В вашей форме класс делают это:

$this->setWidgets(array('version' => new sfWidgetDoctrineChoice(array('model' => 'Version', 'table_method' => 'getData'))); 

затем в файле versionTable.class.php создать функцию в getData() (вы можете назвать это что угодно), который возвращает коллекцию объектов:

public function getData() { 
    $this->getInstance()->createQuery() 
      ->orderBy('version desc') 
      ->execute(); 
} 
+1

Вам нужно удалить "()" из .. 'table_method' => 'getData()'. Это должно быть '' table_method '=>' getData'' – Lashae

0

Спасибо, сэр, я очень ценю ваше решение. вы спасли мой день!

На всякий случай, у кого есть подобные проблемы. Я столкнулся с проблемой PDO при использовании решения. (FatalErrorException: ошибка: класс '....... \ Controller \ PDO' не найден в) Причина в том: https://groups.google.com/forum/#!topic/symfony2/mR22XXKPQrk «Вы злоупотребляете на PHP имен Когда вы находитесь в коде пространства имен, с помощью PDO. означает имя класса по отношению к текущему пространству имен. У вас есть 2 решения проблемы с исправлением: использование полного имени класса, такого как \ PDO, или добавления оператора использования для импорта класса в текущем пространстве имен. "

Итак, после добавления «\» перед PDO :: решение работает отлично.

Спасибо!

Смежные вопросы