присвоение значения виджету формы - PullRequest
0 голосов
/ 17 февраля 2011

У меня есть виджет формы в _form.php

echo $form['catcher_id']->renderLabel();  //the label
echo $form['catcher_id']->renderError();  //the validator

. Symfony создал базовый класс:

<?php
/**
 * LpmService form base class.
 */
abstract class BaseLpmServiceForm extends BaseFormPropel
{
  public function setup()
  {
    $this->setWidgets(array(
      'id'                   => new sfWidgetFormInputHidden(),
      'name'                 => new sfWidgetFormInputText(),
      'wap_home'             => new sfWidgetFormInputText(),
      'call_center_number'   => new sfWidgetFormInputText(),
     [color=#FF4000] 'catcher_id'           => new sfWidgetFormPropelChoice(array('model' => 'LpmCatcher', 'add_empty' => false)),[/color]
      'price_description'    => new sfWidgetFormInputText(),
      'logo'                 => new sfWidgetFormInputText(),
      'invalid_msisdn_text'  => new sfWidgetFormInputText(),
      'terms_and_conditions' => new sfWidgetFormInputText(),
      'service_code'         => new sfWidgetFormInputText(),
    ));

    $this->setValidators(array(
      'id'                   => new sfValidatorChoice(array('choices' => array($this->getObject()->getId()), 'empty_value' => $this->getObject()->getId(), 'required' => false)),
      'name'                 => new sfValidatorString(array('max_length' => 64, 'required' => false)),
      'wap_home'             => new sfValidatorString(array('max_length' => 256, 'required' => false)),
      'call_center_number'   => new sfValidatorString(array('max_length' => 13, 'required' => false)),
      'catcher_id'           => new sfValidatorPropelChoice(array('model' => 'LpmCatcher', 'column' => 'id')),
      'price_description'    => new sfValidatorString(array('max_length' => 128, 'required' => false)),
      'logo'                 => new sfValidatorString(array('max_length' => 255, 'required' => false)),
      'invalid_msisdn_text'  => new sfValidatorString(array('max_length' => 255, 'required' => false)),
      'terms_and_conditions' => new sfValidatorString(array('max_length' => 750, 'required' => false)),
      'service_code'         => new sfValidatorString(array('max_length' => 3, 'required' => false)),
    ));
    $this->widgetSchema->setNameFormat('lpm_service[%s]');
    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
    parent::setup();
  }
  public function getModelName()
  {
    return 'LpmService';
  }
}

, и я заново создал выпадающий список, чтобы я мог включитьСобытие "onchange":

<select name="services" onchange="refreshPage(this.form.services)" id="droplist">
           <?php
              $catcher_names = LpmCatcherPeer::getByAllNames();
              foreach($catcher_names as $row)
              {
                  ?>
                    <option value="<?php echo $row->getName()."/".$row->getId(); ?>" <?php 
                      if($row->getName() == $catcher_name) echo 'selected="selected"'?>><?php echo $row->getName();?></option>
                    <?php
              }
                  ?>
            </select> 

как я могу присвоить значение echo $form['catcher_id'], потому что теперь, когда я выбираю значение из раскрывающегося списка и нажимаю кнопку "Отправить", валидатор говорит, что требуется catcher_id (потому что я создал раскрывающийся список вручную), так как я могу установить значение вручную ???

У меня есть:

$form['catcher_id']->getWidget()->setAttribute('value', '11');

Но это не работает.

Ответы [ 5 ]

1 голос
/ 17 февраля 2011

Вместо того, чтобы перекодировать выбор, я бы использовал идентификатор выбора и связывал событие в Javascript:

function init()
{
  var el_to_bind = document.getElementById( 'lpm_service_catcher_id' );
  el_to_bind.onchange = my_onchange_handler;
}

function my_onchange_handler( el )
{
  // do your stuff here
}

Или, с jQuery,

$('#lpm_service_catcher_id').change( function() {
  // do your stuff here
});
1 голос
/ 17 февраля 2011

Необходимо сделать так, чтобы имя созданного вручную селекта совпадало с тем, которое было бы сгенерировано symfony.

Предполагая, что lpm_service является значением, возвращаемым вызовом getName() вашей формы, и что вы используете формат имени по умолчанию, имя выбора должно быть lpm_service[catcher_id].

1 голос
/ 17 февраля 2011

Я считаю, что это должно работать в вашем шаблоне:

<?php $form->setDefault('catcher_id', 123) ?>

... или в вашем действии:

$this->form->setDefault('catcher_id', 123);
0 голосов
/ 05 августа 2012

Вам не нужно делать это вручную.Вы можете установить любой атрибут на виджете.Вы должны сделать это в LpmServiceForm

$this->getWidget('catcher_id')->setAttribute('onchange', 'refreshPage(this.form.services)');

и визуализировать форму как обычно.

0 голосов
/ 20 февраля 2011

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

<select>
<option value='name/id' ...>
</select>

И валидатор ищет только идентификатор

$this->setValidators(array(
...
      'catcher_id' => new sfValidatorPropelChoice(
                      array('model' => 'LpmCatcher', 'column' => 'id')),
...
    ));

Вот почему валидатор не работает и не устанавливает значение по умолчанию.

Так что я бы действительно использовал рендер по умолчанию, установите значение с помощью

$this->form->setDefault('catcher_id', 123);

как Том сказал, и прикрепите манипулятор как Йицньютон сказал.

...