这可能是一个简单的问题但是因为我是Symfony的新手,所以它仍然有点令人困惑。
我有一个Podcast表格,其user_id
列与我的sfGuardUser
表格相关,该表格中有id
列。 (用户创建播客并将其ID自动保存在Podcast表中,creator_id
列)
然后,我有一个PodcastForm默认情况下,doctrine在BasePodcastForm.class.php中创建了这个小部件:
'creator_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('sfGuardUser'), 'add_empty' => false)),
这会在播客表单中创建一个下拉列表。
在我的PodcastForm.php中,我有:
public function configure() {
$this->widgetSchema['creator_id'] = new sfWidgetFormInputText(array(),array('readonly' => 'true'));
...
}
但问题是它向我显示了用户的ID而不是名称。在sfGuardUser.class.php文件中,我创建了__toString()
方法,返回用户的用户名,但它仍然显示了Id。
如何在“播客”表单中以sfWidgetFormInputText
显示用户的用户名而不是ID?
答案 0 :(得分:0)
我希望能够很好地理解您的需求......您可以使用以下代码添加用户名作为新窗口小部件:
public function configure()
{
$this->setWidget('creator_id', new sfWidgetFormInputHidden());
if ($this->isNew())
{
$creator = sfContext::getInstance()->getUser()->getGuardUser();
$this->object->setCreatorId($creator->getId());
$username = $creator->getUsername();
}
else
$username = $this->object->getsfGuardUser()->getUsername();
$this->setWidget('creator_name', new sfWidgetFormInput());
$widget = $this->getWidget('creator_name');
$widget->setDefault($username);
$widget->setAttribute('readonly', 'readonly');
// if you need to move the widget use FIRST, LAST...
$this->getWidgetSchema()->moveField('creator_name', sfWidgetFormSchema::FIRST);
$this->setValidator('creator_name', new sfValidatorPass());
}
可能需要进行一些调整,因为我使用Propel
。
最后,在表单中使用单例sfContext::getInstance()->...
是一种不好的做法,但这是另一回事。
[更新] 正如Flukey在评论中所说,只是将用户对象作为表单选项传递,可以完全取消对sfContext单例的需求。
答案 1 :(得分:0)
在Podcast.class.php中创建或修改__toString()
方法并添加:
public function __toString()
{
return $this->getSfGuardUser()->getUsername();
}