在sfWidgetFormInputText中显示用户名列而不是id

时间:2011-12-08 06:31:47

标签: php forms symfony1 doctrine

这可能是一个简单的问题但是因为我是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?

2 个答案:

答案 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();
}