Добавяне/Създаване на елемент към ObjectStorage с помощта на Javascript в Extbase/Fluid TYPO3

какъв е правилният начин за динамично създаване на нови дъщерни елементи в течна форма с помощта на JavaScript?

Проблем: 1:n Връзка (Родител/Дете), използвайки Extbase ObjectStorages: Когато се извика Parent Fluid Form, трябва да е възможно да се добавят няколко дъщерни (включително свойства, разбира се!)

Мръсно, частично работещо решение: Добавих малко JS код и динамично добавих необходимите входни елементи. „xxx“ ще бъде интерифициран за всяко дете. Данните ще бъдат правилно съхранени в DB.

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

Въпреки това, ако възникне грешка, всички дъщерни форми изчезват и няма да се покаже f3-form-error. Причината за това може да е пренасочването към originalRequest (първоначална форма без дъщерни полета).

Как мога да се справя с този проблем без мръсни трикове? Моля, дайте ми намек за ризата.


person Jürgen Pfusterschmied    schedule 30.11.2015    source източник
comment
Имам абсолютно същия проблем, но не можах да намеря решение досега.   -  person Christian Fries    schedule 09.12.2015


Отговори (2)


Пак ще отговоря сам на въпроса! Следващите редове са най-лошият код, но работи. Наистина искам да знам как да направя това по правилния начин. Решението обаче е да получите аргументите от динамично добавените 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>
person Jürgen Pfusterschmied    schedule 10.12.2015

Следва моето решение, нещо като твоето.

Модели

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>

Ако имате по-добър, моля, уведомете ме. Благодаря!

person Bill.Dagou    schedule 14.09.2016