Add/Create 使用 Extbase/Fluid TYPO3 中的 Javascript 到 ObjectStorage 的元素
Add/Create Element to ObjectStorage using Javascript in Extbase/Fluid TYPO3
使用 JavaScript 以流体形式动态创建新 Child 元素的正确方法是什么?
问题:
1:n 关系 (Parent/Child) 使用 Extbase ObjectStorages:
当调用 Parent 流体形式时,应该可以添加几个 child(当然包括属性!)
脏,部分工作,解决方案:
我添加了一些 JS 代码并动态添加了所需的输入元素。
"xxx" 将与每个 Child 相交。数据将正确存储在数据库中。
<input type="text" placeholder="First Name" name="tx_booking[newBooking][accompanyingperson][xxx][firstname]">
但是,如果发生错误,所有 child 表格都会消失,并且不会显示 f3-form-error。这样做的原因可能是重定向到 originalRequest(没有 child 字段的初始表单)。
如何不使用卑鄙手段来解决这个问题?
请给我衬衫提示。
再次,我会自己回答问题!
以下几行是有史以来最糟糕的代码,但它有效。
我真的很想知道如何以正确的方式做到这一点。但是,解决方案是从动态添加的 JS 输入中获取参数。这是在 errorAction 中完成的,并将由 forward() 传递给初始操作,错误应该出现在该操作中。
我认为,使用 PropertyMapper 并修改 trustedProperties 一定是更好的方法....
这里有一个简短的例子:
// Error function in Controller
protected function errorAction() {
$referringRequest = $this->request->getReferringRequest();
// Manual added JS Data
if($this->request->hasArgument('newRegistration'))
{
$newRegistration = $this->request->getArgument('newRegistration');
$referringRequest->setArgument('accompanyingperson', $newRegistration['accompanyingperson']);
}
if ($referringRequest !== NULL) {
$originalRequest = clone $this->request;
$this->request->setOriginalRequest($originalRequest);
$this->request->setOriginalRequestMappingResults($this->arguments->getValidationResults());
$this->forward($referringRequest->getControllerActionName(), $referringRequest->getControllerName(), $referringRequest->getControllerExtensionName(), $referringRequest->getArguments());
}
}
// action new in Controller
public function newAction(\***\***\Domain\Model\Registration $newRegistration = NULL) {
if($this->request->hasArgument('accompanyingperson'))
{
$this->view->assign('accPer', $this->request->getArgument('accompanyingperson'));
}
.
.
.
}
//Fluid template of Action New
<f:if condition="{accPer}">
<f:for each="{accPer}" as="ap" key="key" iteration="i">
<f:form.textfield class="form-control" placeholder="First Name" property="accompanyingperson.{key}.firstname"/>
.
.
.
</f:for>
</f:if>
以下是我的解决方案,与您的类似。
型号
class Resume extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<Builder>
* @cascade remove
*/
protected $builders;
}
class Builder extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var string
*/
protected $title;
}
控制器
class ResumeController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* @var \Dagou\Resume\Domain\Repository\ResumeRepository
* @inject
*/
protected $resumeRepository;
/**
* @param \Dagou\Resume\Domain\Model\Resume $resume
* @see \Dagou\Resume\Controller\ResumeController::saveAction()
*/
protected function createAction(\Dagou\Resume\Domain\Model\Resume $resume = NULL) {
$this->view->assignMultiple([
'resume' => $resume,
]);
}
protected function initializeCreateAction() {
if (($request = $this->request->getOriginalRequest())) {
$this->request->setArgument('resume', $request->getArgument('resume'));
$propertyMappingConfiguration = $this->arguments->getArgument('resume')->getPropertyMappingConfiguration();
$propertyMappingConfiguration->allowCreationForSubProperty('builders.*');
$propertyMappingConfiguration->allowProperties('builders')
->forProperty('builders')->allowAllProperties()
->forProperty('*')->allowAllProperties();
}
}
protected function initializeSaveAction() {
$propertyMappingConfiguration = $this->arguments->getArgument('resume')->getPropertyMappingConfiguration();
$propertyMappingConfiguration->allowCreationForSubProperty('builders.*');
$propertyMappingConfiguration->allowProperties('builders')
->forProperty('builders')->allowAllProperties()
->forProperty('*')->allowAllProperties();
}
}
/**
* @param \Dagou\Resume\Domain\Model\Resume $resume
*/
protected function saveAction(\Dagou\Resume\Domain\Model\Resume $resume) {
$this->resumeRepository->add($resume);
}
}
模板
<f:form class="form-horizontal" name="resume" action="save" object="{resume}">
<f:if condition="{resume.builders}">
<f:for each="{resume.builders}" as="builder" iteration="builderIteration">
<f:form.textfield class="form-control" property="builders.{builderIteration.index}.header" />
</f:for>
</f:if>
</f:form>
如果你有更好的,请告诉我。谢谢!
使用 JavaScript 以流体形式动态创建新 Child 元素的正确方法是什么?
问题: 1:n 关系 (Parent/Child) 使用 Extbase ObjectStorages: 当调用 Parent 流体形式时,应该可以添加几个 child(当然包括属性!)
脏,部分工作,解决方案: 我添加了一些 JS 代码并动态添加了所需的输入元素。 "xxx" 将与每个 Child 相交。数据将正确存储在数据库中。
<input type="text" placeholder="First Name" name="tx_booking[newBooking][accompanyingperson][xxx][firstname]">
但是,如果发生错误,所有 child 表格都会消失,并且不会显示 f3-form-error。这样做的原因可能是重定向到 originalRequest(没有 child 字段的初始表单)。
如何不使用卑鄙手段来解决这个问题? 请给我衬衫提示。
再次,我会自己回答问题! 以下几行是有史以来最糟糕的代码,但它有效。 我真的很想知道如何以正确的方式做到这一点。但是,解决方案是从动态添加的 JS 输入中获取参数。这是在 errorAction 中完成的,并将由 forward() 传递给初始操作,错误应该出现在该操作中。
我认为,使用 PropertyMapper 并修改 trustedProperties 一定是更好的方法....
这里有一个简短的例子:
// Error function in Controller
protected function errorAction() {
$referringRequest = $this->request->getReferringRequest();
// Manual added JS Data
if($this->request->hasArgument('newRegistration'))
{
$newRegistration = $this->request->getArgument('newRegistration');
$referringRequest->setArgument('accompanyingperson', $newRegistration['accompanyingperson']);
}
if ($referringRequest !== NULL) {
$originalRequest = clone $this->request;
$this->request->setOriginalRequest($originalRequest);
$this->request->setOriginalRequestMappingResults($this->arguments->getValidationResults());
$this->forward($referringRequest->getControllerActionName(), $referringRequest->getControllerName(), $referringRequest->getControllerExtensionName(), $referringRequest->getArguments());
}
}
// action new in Controller
public function newAction(\***\***\Domain\Model\Registration $newRegistration = NULL) {
if($this->request->hasArgument('accompanyingperson'))
{
$this->view->assign('accPer', $this->request->getArgument('accompanyingperson'));
}
.
.
.
}
//Fluid template of Action New
<f:if condition="{accPer}">
<f:for each="{accPer}" as="ap" key="key" iteration="i">
<f:form.textfield class="form-control" placeholder="First Name" property="accompanyingperson.{key}.firstname"/>
.
.
.
</f:for>
</f:if>
以下是我的解决方案,与您的类似。
型号
class Resume extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<Builder>
* @cascade remove
*/
protected $builders;
}
class Builder extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var string
*/
protected $title;
}
控制器
class ResumeController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* @var \Dagou\Resume\Domain\Repository\ResumeRepository
* @inject
*/
protected $resumeRepository;
/**
* @param \Dagou\Resume\Domain\Model\Resume $resume
* @see \Dagou\Resume\Controller\ResumeController::saveAction()
*/
protected function createAction(\Dagou\Resume\Domain\Model\Resume $resume = NULL) {
$this->view->assignMultiple([
'resume' => $resume,
]);
}
protected function initializeCreateAction() {
if (($request = $this->request->getOriginalRequest())) {
$this->request->setArgument('resume', $request->getArgument('resume'));
$propertyMappingConfiguration = $this->arguments->getArgument('resume')->getPropertyMappingConfiguration();
$propertyMappingConfiguration->allowCreationForSubProperty('builders.*');
$propertyMappingConfiguration->allowProperties('builders')
->forProperty('builders')->allowAllProperties()
->forProperty('*')->allowAllProperties();
}
}
protected function initializeSaveAction() {
$propertyMappingConfiguration = $this->arguments->getArgument('resume')->getPropertyMappingConfiguration();
$propertyMappingConfiguration->allowCreationForSubProperty('builders.*');
$propertyMappingConfiguration->allowProperties('builders')
->forProperty('builders')->allowAllProperties()
->forProperty('*')->allowAllProperties();
}
}
/**
* @param \Dagou\Resume\Domain\Model\Resume $resume
*/
protected function saveAction(\Dagou\Resume\Domain\Model\Resume $resume) {
$this->resumeRepository->add($resume);
}
}
模板
<f:form class="form-horizontal" name="resume" action="save" object="{resume}">
<f:if condition="{resume.builders}">
<f:for each="{resume.builders}" as="builder" iteration="builderIteration">
<f:form.textfield class="form-control" property="builders.{builderIteration.index}.header" />
</f:for>
</f:if>
</f:form>
如果你有更好的,请告诉我。谢谢!