2015-11-30 62 views
3

什麼是使用JavaScript在Fluid Form中動態創建新子元素的正確方法?使用JavaScript在Extbase/Fluid中添加/創建元素到ObjectStorage TYPO3

問題: 1:N使用Extbase ObjectStorages關係(父/子): 當父流體形式被稱爲它應該是可以增加幾個孩子的

(包括課程的性質。!) 髒,部分工作,解決方案: 我添加了一些JS代碼並動態添加了所需的輸入元素。 將爲每個孩子整​​合「xxx」。數據將被正確存儲在數據庫中。

<input type="text" placeholder="First Name" name="tx_booking[newBooking][accompanyingperson][xxx][firstname]"> 

但是,如果發生錯誤,所有子窗體消失並且不會顯示f3-form-error。原因可能是重定向到originalRequest(沒有子字段的初始表單)。

我該如何處理這個問題而沒有骯髒的技巧? 請給我襯衫提示。

+0

我有完全相同的問題,但直到現在還找不到解決方案。 –

回答

0

再次,我會自己回答這個問題! 以下幾行代碼是有史以來最受歡迎的代碼,但它起作用。 我真的很想知道如何以正確的方式做到這一點。但是,解決方案是從動態添加的JS輸入中獲取參數。這是在errorAction中完成的,並且將由forward()傳遞給出現錯誤的初始Action。

我爲人人想,那一定是通過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> 
0

以下是我的解決方案,像你的。

模型

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> 

如果你有一個更好的,請讓我知道。謝謝!

相關問題