我无法获得游戏的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));
没有运气。怎么解决?我真的很困惑。
答案 0 :(得分:6)
有两件事引起了我的注意:
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,则用户将无法取消选中该框并在没有验证程序例外的情况下提交表单。
在您使用的代码中:
$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>