EmbedMany表格
|
我已经创建了一个小型的Symfony2-Web站点(使用Symfony PR11),并将MongoDB作为数据库。
我可以创建一个使用普通文档的表单,但是如何使用带有EmbeddedDocument的文档?
以下是文件:
/**
* @mongodb:Document(collection=\"location\")
*/
class Location
{
/**
* @mongodb:Id
*/
protected $id;
/**
* @mongodb:String
*/
protected $locationName;
/**
* @mongodb:EmbedMany(targetDocument=\"LocationTerminal\")
*/
protected $terminals = array();
// Setter
public function setTerminals(LocationTerminal $terminal)
{
array_push($this->terminals, $terminal);
}
public function setLocationName($locationName)
{
$this->locationName = $locationName;
}
// Getter
public function getId()
{
return $this->$id;
}
public function getLocationName()
{
return $this->locationName;
}
public function getTerminals()
{
return $this->terminals;
}
}
EmbeddedDocument:
/**
* @mongodb:EmbeddedDocument
*/
class LocationTerminal
{
/**
* @mongodb:String
*/
protected $terminalName;
/**
* @mongodb:Int
*/
protected $since;
/**
* @mongodb:Int
*/
protected $to;
// Setter
public function setTerminalName($terminalName)
{
$this->terminalName = $terminalName;
}
public function setSince($since)
{
$this->since = $since;
}
public function setTo($to)
{
$this->to = $to;
}
// Getter
public function getTerminalName()
{
return $this->terminalName;
}
public function getSince()
{
return $this->since;
}
public function getTo()
{
return $this->to;
}
}
如您所见,$terminals
持有an3ѭ-文档
形式如下:
class LocationForm extends Form
{
public function configure()
{
$this->add(new TextField(\'locationName\', array(\'max_length\' => 255, \'required\' => true)));
}
public function addTerminals($dm)
{
$this->add(new ChoiceField(\'terminals.terminalName\', array(\'choices\' => $dm)));
$this->add(new DateField(\'terminals.since\', array(\'required\' => true)));
$this->add(new DateField(\'terminals.to\', array(\'required\' => false)));
}
}
使用的控制器如下所示:
class LocationController extends Controller
{
protected $location;
protected $locationTerminal;
protected function getDm()
{
return $this->get(\'doctrine.odm.mongodb.document_manager\');
}
protected function getLocation($name = null)
{
if ($name != null)
{
$dm = $this->getDm();
$this->location = $dm->getRepository(\'RalfBundle:Location\')->findOneBy(array(\'locationName\' => $name));
if (! $this->location)
{
$this->location = new Location();
$this->locationTerminal = new LocationTerminal();
$this->location->setLocation($name);
$this->location->setTerminals($this->locationTerminal);
}
}
else
{
$this->location = new Location();
$this->locationTerminal = new LocationTerminal();
$this->location->setTerminals($this->locationTerminal);
$this->locationTerminal->setSince(0);
$this->locationTerminal->setTerminalName(\"\");
$this->locationTerminal->setTo(0);
}
}
protected function getForm()
{
$form = LocationForm::create($this->get(\'form.context\'), \'location\');
$dm = $this->getDm();
$form->addTerminals($dm->getRepository(\'RalfBundle:Terminal\')->findAll()->toArray());
return $form;
}
//... some Actions
public function createAction()
{
$this->getLocation();
$form = $this->getForm();
$form->bind($this->get(\'request\'), $this->location);
if ($form->isValid())
{
$dm = $this->getDm();
$dm->persist($this->location);
$dm->flush();
return $this->redirect($this->generateUrl(\'Location\'));
}
return $this->render(\'RalfBundle:Ralf:location_create.html.twig\', array(\'form\' => $form));
}
我可以看到,ѭ6cie接受了表单中的输入值,但是EmbedMany
-Arrayterminals
仍然为空。
我怎么了
感谢您的帮助:D
更新:
好的,找到了解决方案。
在public function addTerminals($dm)
中的public function addTerminals($dm)
中,它应如下所示:
public function addTerminals($dm)
{
$this->add(new ChoiceField(\'terminals.0.terminalName\', array(\'choices\' => $dm)));
$this->add(new DateField(\'terminals.0.since\', array(\'required\' => true, \'type\'=> \'timestamp\')));
$this->add(new DateField(\'terminals.0.to\', array(\'required\' => false, \'type\' => \'timestamp\')));
}
\'type\' => \'timestamp\'
是必需的,因为DateField
将创建DateTime
-Object,但是文档期望Int
表示timestamp
。
terminals
数组中的一个字段可以用普通的点符号访问。
没有找到相关结果
已邀请:
2 个回复
素汞读
中的
中,它应如下所示:
是必需的,因为
将创建
-Object,但是文档期望
表示
。
数组中的一个字段可以用普通的点符号访问。
授巨