Флажки не отмечены - PullRequest
       4

Флажки не отмечены

0 голосов
/ 27 октября 2011

Я не могу получить значения БД игр для выбора:

Game:
  actAs:
    Timestampable: ~
  columns:
    id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
    game_name: { type: string(100), notnull: true }
    logo: { type: string(100), notnull: true, comment: "Game Logo" }
  indexes:
    it:
      fields: game_name
      type: unique

Campaign:
  actAs:
    Timestampable: ~
  columns:
    id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
    name: { type: string(100), notnull: true }
    percentage: { type: integer(4), notnull: true, unsigned: true }
    is_active: { type: integer(1), notnull: true, unsigned: true }
    start: { type: datetime, notnull: true }
    end: { type: datetime, notnull: true }

CampaignGames:
  actAs:
    Timestampable: ~
  columns:
    id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
    campaign_id: { type: integer(4), notnull: true, unsigned: true }
    game_id: { type: integer(4), notnull: true, unsigned: true }
  indexes:
    tc:
      fields: [campaign_id, game_id]
      type: unique
  relations:
    Campaign: { onDelete: CASCADE, local: campaign_id, foreign: id, foreignAlias: CampaignCampaignGames }
    Game: { onDelete: CASCADE, local: game_id, foreign: id, foreignAlias: GameCampaignGames }

Я добавил здесь флажок для игр, который принадлежит модели Game, чтобы позволить пользователю добавлять игры в CampaignGames, но, к сожалению, они никогда не проверялись ... И эти значения присутствуют в БД.

class AdminconsoleCampaignForm extends CampaignForm
{

public function configure()
{
    parent::configure();

    $this->widgetSchema['is_active'] = new sfWidgetFormSelectRadio(array(
        'choices' => array(1 => 'On', 0 => 'Off'),
    ));

    $games = Doctrine_Core::getTable('Game')->getGames();

    $this->widgetSchema['game_id'] = new sfWidgetFormSelectCheckbox(array(
        'choices' => $games
    ));

    $this->validatorSchema['game_id'] = new sfValidatorChoice(array(
        'choices' => array_keys($games)
        , 'multiple' => true
        , 'required' => false
    ));

    $this->removeFields();

}

Также пытался использовать

$this->widgetSchema['game_id']->setDefault(array($data));

Не повезло. Как это решить? Я действительно застрял на этом.

Ответы [ 3 ]

6 голосов
/ 28 октября 2011

Меня привлекли две вещи:

1.Вы не используете boolean тип данных Doctrine

Попробуйте изменить schema.yml на следующее:

Campaign:
  [...]
  columns:
    [...]
    is_active:
      type: boolean
      notnull: true
      default: 0 # Or whichever default value you prefer
    [...]

Таким образом Symfony / Doctrine позаботится обо всем, что касается is_active строка вашей Campaign записи.

Если вы сейчас перестроите свою модель, ваш BaseCampaignForm.class.php автоматически определит виджет is_active следующим образом:

$this->setWidgets(array(
  [...]
  'is_active' => new sfWidgetFormInputCheckbox(),
  [...]
);

$this->setValidators(array(
  [...]
  'ist_active' => new sfValidatorBoolean(array('required' => false)),
  [...]
);

Примечание: То, что для required установлено значение false, есть, потому что если флажок не установлен, он также не публикуется.sfValidatorBoolean позаботится об этом и отключит значение само по себе.Если вы установите для него значение true, пользователь не сможет снять флажок и отправить форму без исключения для валидатора.

2.Вы попытались установить значения по умолчанию для объекта формы в виджете его формы

В своем коде вы использовали:

$this->widgetSchema['game_id']->setDefault(array($data));

Это не будет работать, потому что вы используете форму с прикрепленным к ней объектом(BaseFormDoctrine).Все значения по умолчанию берутся прямо из объекта, назначенного этой форме (в вашем случае это объект Campaign, потому что вы расширяете CampaignForm).

(Большая ошибка) Если вы хотитечтобы установить значения по умолчанию для объекта формы, вы должны установить их для самого объекта формы:

$this->getObject()->setGameId($id);

Значения объекта по умолчанию нельзя установить с помощью виджетов формы объекта.Эти значения по умолчанию всегда будут перезаписаны фактическими значениями объекта (что имеет смысл, потому что форма представляет объект).

Рад, если мне удалось чем-то вам помочь.

1 голос
/ 27 октября 2011

Если ваш выбор основан на записях доктрины (которыми они являются), тогда вы должны использовать sfWidgetFormDoctrineChoice. Измените параметр renderer_class, если вы хотите получить переключатели / флажки вместо тега выбора.

0 голосов
/ 27 октября 2011

Ваш массив $game, вероятно, имеет ключи по порядку (0,1,2,3,4), и в итоге вы получаете выбор типа:

<select>
  <option value="0">Option 1</option>
  <option value="1">Option 2</option>
  <option value="2">Option 3</option>    
</select>

Но ваши идентификаторы объектов не совпадают с этими ключами. Вы должны изменить строку:

$games = Doctrine_Core::getTable('Game')->getGames();

до:

$c = Doctrine::getTable('Game');
$c->setAttribute(Doctrine_Core::ATTR_COLL_KEY, 'id');
$games = $c->getGames();

чтобы массивы получали ключи = идентификаторы. Как:

<select>
  <option value="3">Option 1</option>
  <option value="7">Option 2</option>
  <option value="9">Option 3</option>    
</select>
...