[Frage] mehrere Datensätze einer foreach-Schleife speichern

  • moep0r moep0r
    TYPO3-Anwärter
    0 x
    6 Beiträge
    0 Hilfreiche Beiträge
    06. 10. 2016, 13:49

    Hallo
    Ich bin ziemlich neu bei typo3 und stehe gerade total auf dem Schlauch.
    Ich möchte mehrere Einträge aus einem Formular aus einer foreach-Schleife speichern.

    Formular:

    1. <h1>{headline}</h1>
    2.  
    3. <f:render partial="Error" arguments="{object:'timeofday'}" />
    4.  
    5. <h3>{survey.title}</h3>
    6.  
    7. <f:form action="{action}" object="{timeofday}" name="timeofday" arguments="{survey:survey, appiontment:appiontment}" additionalAttributes="{role:'form'}">
    8.  
    9. <f:for each="{survey.appiontments}" as="appiontments">
    10. <li class="list-group-item">
    11. <label>{appiontments.appiontmentdate}</label>
    12. <f:form.textfield property="timevalue" type="time" class="form-control" id="{appiontments}" />
    13. </li>
    14.  
    15. </f:for>
    16.  
    17. <f:form.submit value="{submitmessage}" class="btn btn-primary" />
    18.  
    19. </f:form>

    Mein aktueller Controller speichert jetzt natürlich nur den letzten Wert.
    Ich komme aber einfach nicht drauf wie ich jetzt weiter verfahre.

    1. /**
    2.  * @param \Schmidtch\Survey\Domain\Model\Survey $survey
    3.  * @param \Schmidtch\Survey\Domain\Model\Appiontment $appiontment
    4.  * @param \Schmidtch\Survey\Domain\Model\Timeofday $timeofday
    5.  */
    6. public function addAction(
    7. \Schmidtch\Survey\Domain\Model\Survey $survey,
    8. \Schmidtch\Survey\Domain\Model\Appiontment $appiontment,
    9. \Schmidtch\Survey\Domain\Model\Timeofday $timeofday)
    10. {
    11. $appiontment->addTimeofday($timeofday);
    12. $this->objectManager->get('Schmidtch\\Survey\\Domain\\Repository\\AppiontmentRepository')->update($appiontment);
    13. $this->redirect('show','Survey',Null,array('survey'=>$survey));
    14. }


  • 1
  • moep0r moep0r
    TYPO3-Anwärter
    0 x
    6 Beiträge
    0 Hilfreiche Beiträge
    06. 10. 2016, 14:00

    1. <h1>{headline}</h1>
    2.  
    3. <f:render partial="Error" arguments="{object:'timeofday'}" />
    4.  
    5. <h3>{survey.title}</h3>
    6.  
    7. <f:form action="{action}" object="{timeofday}" name="timeofday" arguments="{survey:survey, appiontment:appiontment}" additionalAttributes="{role:'form'}">
    8.  
    9. <f:for each="{survey.appiontments}" as="appiontments">
    10. <li class="list-group-item">
    11. <label>{appiontments.appiontmentdate}</label>
    12. <f:form.textfield property="timevalue" type="time" class="form-control" id="{appiontments}" />
    13. </li>
    14.  
    15. </f:for>
    16.  
    17. <f:form.submit value="{submitmessage}" class="btn btn-primary" />
    18.  
    19. </f:form>

    1. <?php
    2.  
    3. /**
    4. * @param \Schmidtch\Survey\Domain\Model\Survey $survey
    5. * @param \Schmidtch\Survey\Domain\Model\Appiontment $appiontment
    6. * @param \Schmidtch\Survey\Domain\Model\Timeofday $timeofday
    7. */
    8. public function addAction(
    9. \Schmidtch\Survey\Domain\Model\Survey $survey,
    10. \Schmidtch\Survey\Domain\Model\Appiontment $appiontment,
    11. \Schmidtch\Survey\Domain\Model\Timeofday $timeofday)
    12. {
    13. $appiontment->addTimeofday($timeofday);
    14. $this->objectManager->get('Schmidtch\\Survey\\Domain\\Repository\\AppiontmentRepository')->update($appiontment);
    15. $this->redirect('show','Survey',Null,array('survey'=>$survey));
    16. }

  • moep0r moep0r
    TYPO3-Anwärter
    0 x
    6 Beiträge
    0 Hilfreiche Beiträge
    12. 10. 2016, 13:39

    Ich habe jetzt mal etwas rumprobiert.
    Mein Template sieht jetzt so aus:

    1. <f:layout name="Default" />
    2.  
    3. <f:section name="content">
    4.  
    5. <h1>Termin wählen</h1>
    6.  
    7. <f:render partial="Error" arguments="{object:'timeofday'}" />
    8.  
    9. <h3>{survey.title}</h3>
    10.  
    11. <f:form action="add" object="{timeofday}" method="post" name="timeofday" arguments="{survey:survey, appiontment:appiontment}" additionalAttributes="{role:'form'}">
    12.  
    13. <f:for each="{survey.appiontments}" as="appiontments" >
    14. <li class="list-group-item">
    15. <label>{appiontments.appiontmentdate}</label>
    16. <f:form.textfield type="time" class="form-control" name="timeofdays[timevalue1][]" value="00:00" />
    17. <f:form.textfield type="time" class="form-control" name="timeofdays[timevalue2][]" value="00:00" />
    18. <f:form.textfield type="time" class="form-control" name="timeofdays[timevalue3][]" value="00:00" />
    19. <f:form.hidden class="form-control" name="timeofdays[appiontmentID][]" value="{appiontments.uid}" />
    20. </li>
    21.  
    22. </f:for>
    23.  
    24. <f:form.submit value="Umfrage erstellen" class="btn btn-primary" />
    25.  
    26. </f:form>
    27.  
    28. </f:section>

    Jetzt habe ich das Problem, dass ich einfach die Werte nicht zum Controller bekomme

    1. /**
    2. * @param \Schmidtch\Survey\Domain\Model\Survey $survey
    3. * @param \Schmidtch\Survey\Domain\Model\Appiontment $appiontment
    4. * @param \Schmidtch\Survey\Domain\Model\TimeOfDay $timeofday
    5. */
    6. public function addAction(
    7. \Schmidtch\Survey\Domain\Model\Survey $survey)
    8. {
    9.  
    10. $wertArray = $_POST["tx_survey_surveylisting"];
    11. $timeofdays = $wertArray["timeofdays"];
    12.  
    13.  
    14. foreach ($timeofdays["appiontmentId"] as $key => $appiontment) {
    15.  
    16. $this->timeofdayRepository->add(new \Schmidtch\Survey\Domain\Model\TimeOfDay($appiontment,$timeofdays['timevalue1'][$key]));
    17.  
    18.  
    19. }
    20. $persistenceManager = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager');
    21. $persistenceManager->persistAll();
    22.  
    23. $this->redirect('show', 'Survey', NULL, array('survey' => $survey));
    24. }

    Hab jetzt schon einiges rumprobiert, aber das Array ist immer leer.

    1. Wenn ich im Template den name so setzte
    2. name="tx_survey_surveylisting[timeofdays][timevalue1][]"
    3. bekomme ich im Quelltext dann
    4. name="tx_survey_surveylisting[tx_survey_surveylisting][timeofdays][timevalue1][]"
    5. darum hab ich ihn auf
    6. name="timeofdays[timevalue1][]"

    Hat vielleicht irgendjemand eine Idee? :)

  • froemken froemken
    Jedi-Ratsmitglied
    0 x
    811 Beiträge
    1 Hilfreiche Beiträge
    25. 10. 2016, 10:31

    Dafür, dass Du neu bei TYPO3 bist, hast Du Dir mit dieser Aufgabe direkt die Königsdisziplin rausgesucht. Selbst ich brauche dafür solche ein Formular ein paar Stunden. Ich kann Dir sagen, dass es geht, aber es kann an allen Ecken und Kanten knallen.

    Vielleicht hilft Dir schon dieser Ansatz hier:

    https://github.com/jweiland-net/events2/blob/master/Resources/Private/Partials/Event/FormFields.html#L228

    Schau auch mal hier rein:
    http://www.typo3lexikon.de/typo3-tutorials/core/systemextensions/extbase/property-mapper.html

    Bitte installier Dir xdebug für PHP, damit Du weißt, was, wann, wo passiert. Bei meinem ersten Formular dieser Art habe ich 3 Tage gebraucht. Also nicht demotivieren lassen. Stück für Stück durchackern und viel dabei lernen ;-)

    Stefan

  • moep0r moep0r
    TYPO3-Anwärter
    0 x
    6 Beiträge
    0 Hilfreiche Beiträge
    26. 10. 2016, 15:20

    Danke für deine Antwort :)
    Das geschilderte Problem bin ich mit einem Click-Handler "umgangen", jedoch bin ich nicht umhin gekommen mehrere Objekte aus einem Formular zu speichern.
    Ich habe sie jetzt "per Hand" in die Datenbank geschrieben. Auf jedenfall werde ich mich weiter in Typo3 einarbeiten.

    Template:

    1. <f:if condition="{survey.appiontments}" >
    2. <f:form action="add" object="{poll}" name="poll" arguments="{survey:survey, timeofday:timeofday, subscriber:subscriber}">
    3. <f:form.hidden name="polls[subscriber][]" value="{subscriber.uid}" />
    4. <ul class="list-group">
    5. <f:for each="{survey.appiontments}" as="appiontment" iteration="iterator" >
    6. <f:form.hidden name="polls[appiontment][]" value="{iterator.index}" />
    7. <li class="list-group-item">
    8. <table class="table table-bordered table-sm">
    9. <thead>
    10. <tr>
    11. <th rowspan="2"></th>
    12. <th colspan="{appiontment.timeOfDay -> f:count()}"><f:format.date format="d.m.Y">{appiontment.appiontmentdate}</f:format.date></th>
    13. </tr>
    14. <tr>
    15. <f:for each="{appiontment.timeOfDay}" as="timeofday" >
    16. <th>{timeofday.timevalue} Uhr</th>
    17. </f:for>
    18. </tr>
    19. </thead>
    20.  
    21. <tbody>
    22. <tr>
    23. <th width="150px">{subscriber.nameSubscriber}</th>
    24. <f:for each="{appiontment.timeOfDay}" as="timeofday" iteration="iteratorb" >
    25. <td>
    26. <f:form.checkbox name="polls[poll][{iterator.index}][{iteratorb.index}]" class="checkbox" checked="true" value="1" />
    27. <f:form.hidden name="polls[timeofday][{iterator.index}][{iteratorb.index}]" value="{timeofday.uid}" />
    28. </td>
    29. </f:for>
    30. </tr>
    31. </tbody>
    32. </table>
    33. </li>
    34. </f:for>
    35. <br />
    36. <f:form.submit value="Abschicken" class="btn btn-primary" />
    37. </ul>
    38. </f:form>
    39. </f:if>

    Controller:

    1. public function addAction (
    2. \Schmidtch\Survey\Domain\Model\Survey $survey,
    3. \Schmidtch\Survey\Domain\Model\Subscriber $subscriber,
    4. \Schmidtch\Survey\Domain\Model\Poll $poll = NULL)
    5. {
    6. $polls = $_POST['tx_survey_surveylisting']['polls'];
    7. $pollArray = $polls['poll'];
    8. $timeofdayArray = $polls['timeofday'];
    9. $uid = $polls['subscriber'][0];
    10. $appiontmentArray = $polls['appiontment'];
    11.  
    12. $resultPoll = $this->pollRepository->addPoll($uid,$pollArray,$timeofdayArray,$appiontmentArray);
    13. $resultTimeofday = $this->timeofdayRepository->updatePoll($appiontmentArray,$timeofdayArray);
    14. $countSubscriber = $this->pollRepository->countSubscriber($uid);
    15. $resultSubscriber = $this->subscriberRepository->updatePoll($uid,$countSubscriber);
    16. $this->redirect('showAfter', 'Subscriber', NULL, array('subscriber' => $subscriber,'survey' => $survey));
    17. }

    Repository:

    1. public function countSubscriber($uid)
    2. {
    3. $sql = "SELECT * FROM tx_survey_domain_model_poll WHERE subscriber='".$uid."'";
    4. $result = $GLOBALS['TYPO3_DB']->sql_query($sql);
    5. $num_rows = $result->num_rows;
    6. return $num_rows;
    7. }
    8.  
    9. public function addPoll($uid,$pollArray,$timeofdayArray,$appiontmentArray)
    10. {
    11. for($a=0;$a<sizeof($appiontmentArray);$a++) {
    12.  
    13. for($b=0;$b<sizeof($timeofdayArray[$a]);$b++) {
    14.  
    15. if($pollArray[$a][$b] != NULL) {
    16. $sql = "INSERT INTO tx_survey_domain_model_poll (pid, subscriber,timeofday,poll,tstamp,crdate)
    17. VALUES (70,'".$uid."','".$timeofdayArray[$a][$b]."','".$pollArray[$a][$b]."',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);";
    18. $resultInsert = $GLOBALS['TYPO3_DB']->sql_query($sql);
    19.  
    20. }
    21. else {
    22. $sql = "INSERT INTO tx_survey_domain_model_poll (pid, subscriber,timeofday,poll,tstamp,crdate)
    23. VALUES (70,'".$uid."','".$timeofdayArray[$a][$b]."',0,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);";
    24. $resultInsert = $GLOBALS['TYPO3_DB']->sql_query($sql);
    25. }
    26. }
    27. }
    28. return $resultInsert;
    29. }

    1. public function updatePoll($appiontmentArray,$timeofdayArray)
    2. {
    3. for($a=0;$a<sizeof($appiontmentArray);$a++) {
    4.  
    5. for($b=0;$b<sizeof($timeofdayArray[$a]);$b++) {
    6.  
    7. $sql = "SELECT * FROM tx_survey_domain_model_poll WHERE timeofday='".$timeofdayArray[$a][$b]."'";
    8. $result = $GLOBALS['TYPO3_DB']->sql_query($sql);
    9. $num_rows = $result->num_rows;
    10.  
    11. $sql = "UPDATE tx_survey_domain_model_timeofday
    12. SET timecheck='".$num_rows."'
    13. WHERE uid='".$timeofdayArray[$a][$b]."'";
    14. $resultInsert = $GLOBALS['TYPO3_DB']->sql_query($sql);
    15. }
    16. }
    17. return $resultInsert;
    18. }
    19.  
    20. public function countTimeofday($timeofday)
    21. {
    22. $query = $this->createQuery();
    23. $sql = "SELECT * FROM tx_survey_domain_model_poll WHERE timeofday='".$timeofday."'";
    24. $query->statement( $sql );
    25. $result = $query->count();
    26. return $result;
    27. }

    1. public function updatePoll($uid,$countSubscriber)
    2. {
    3. $sql = "UPDATE tx_survey_domain_model_subscriber
    4. SET subcheck='".$countSubscriber."'
    5. WHERE uid='".$uid."'";
    6. $resultInsert = $GLOBALS['TYPO3_DB']->sql_query($sql);
    7.  
    8. return $resultInsert;
    9. }

  • 1