未选中复选框

时间:2011-10-27 13:21:37

标签: symfony1 symfony-1.4

我无法获得游戏的DB值:

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,但不幸的是他们从未检查过...而且这些值存在于DB中。

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 个答案:

答案 0 :(得分:6)

有两件事引起了我的注意:

1。您没有使用Doctrine的boolean数据类型

尝试将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 :(得分:1)

如果您的选择基于学说记录(它们是),那么您应该使用sfWidgetFormDoctrineChoice。如果要获取单选按钮/复选框而不是选择标记,请更改renderer_class选项。

答案 2 :(得分:0)

你的$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>

但是你的对象id与那些键不一致。 你必须改变这一行:

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

为:

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

以便数组获得keys = ids。像:

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