sfWidgetFormSelect предоставляет строку или целое число для выбранного элемента? - PullRequest
1 голос
/ 19 декабря 2010

У меня раздражающая проблема.Я пытаюсь выяснить, какие поля формы были изменены, а затем вставить это в таблицу.Мне удалось var_dump в doUpdateObjectas, показанном в следующем

public function doUpdateObject($values) 
{ 
    parent::doUpdateObject($values);
    var_dump($this->getObject()->getModified(false));
    var_dump($this->getObject()->getModified(true));
 } 

. И похоже, что $ this-> getObject () -> getModified, кажется, работает, давая мне значения как до, так и после, устанавливая для него либо trueили ложь

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что sfWidgetFormSelect, похоже, сохраняет одно из моих полей в виде строки.перед сохранением это же поле было int.(Я получил эту идею с помощью var_dump как до, так и после).

Вот что показали результаты обоих дампов var:

array(1) {["annoying_field"]=> int(3)} array(1) {["annoying_field"]=>string(1)"3"}

Это, кажется, заставляет доктрину думать, что этомодификации и, таким образом, дает ложное срабатывание.

В моей базовой форме у меня есть

under $this->getWidgets()
'annoying_field'    => new sfWidgetFormInputText(),

under $this->setValidators
'annoying_field'    => new sfValidatorInteger(array('required' => false)),

и, наконец, в моем сконфигурированном Form.class.php я перенастроил файл следующим образом:

$this->widgetSchema['annoying_field'] = new sfWidgetFormSelect(array('choices' => $statuses));

statuses - это массив, содержащий такие значения, как {"" a "," b "," c "," d "}

, и я просто хочу, чтобы индекс статуса был сохраненв базе данных.

А также, как я могу вставить изменения в другую таблицу базы данных? скажем, мою таблицу журнала?

Любые идеи и советы относительно того, почему это происходит, приветствуется, яЯ пытался выяснить это и безуспешно просматривал Google по различным ключевым словам.

Спасибо!

Редактировать:

ОК, поэтому я создал еще одно поле, целое число в моей схеметолько для тестирования. Я создал запись, сохранил ее и отредактировал.

на этот раз тоже самоечто случилось!

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

сначала, если вы хотите, чтобы status_id был сохранен в базе данных, вы должны определить свой массив статусов следующим образом:

 {1 => "a", 2 => "b", 3 => "c", 4 => "d"}

Таким образом, он знает, что 1 должен отображаться как «а» и так далее. Затем при сохранении должен сохраняться только индекс.

Что касается сохранения в другой базе данных, я советую изменить метод doSave, определенный классом Form, в соответствии с вашими потребностями. Я знаю только, как Propel справляется с этим, может быть, это могло бы помочь:

метод doSave дозирует что-то вроде этого:

  protected function doSave($con = null)
  {
    if (null === $con)
    {
      $con = $this->getConnection();
    }

    $old = $this->getObject()->getModifiedValues($this);//Define this
    $new_object = new Log($old);//Create a new log entry
    $new_object->save($con));//save it!

    $this->updateObject();

    $this->getObject()->save($con);

    // embedded forms
    $this->saveEmbeddedForms($con);
  }

Надеюсь, это поможет!

Edit:

Это пример, извлеченный из модели в одном из моих приложений и работающий нормально:

Схема:

[...]    
funding_source_id:
  type: integer
  required: true
[...]

Форма:

$this->setWidget('funding_source_id', new sfWidgetFormChoice(array(
   'choices' => array(1 => 'asdads', 2 => '123123123' , 3 => 'asd23qsdf'),
)));


$this->setValidator('funding_source_id', new sfValidatorChoice(array(
   'choices' => array(1 => 'asdads', 2 => '123123123' , 3 => 'asd23qsdf'),
  'required' => true
)));

Об элементе журнала, который может быть более сложным, вы должны прочитать текущую реализацию метода doSave в базовом классе формы, в настоящее время sfFomrObject в Symfony1.4., А также когда и как он делегирует объект, имеющий дело с измененными значениями .

0 голосов
/ 24 декабря 2010

Хорошо, оказалось, что я забыл сделать специальный валидатор, чтобы использовать вместо него ключ массива.

...