[Frage] Fluid-Formular - per Ajax versendet - kann in der Action nicht gespeichert werden

  • 0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    28. 01. 2014, 16:11

    Hallo Leute, ich brauche dringend Hilfe.
    Bin schon seit 2 zwei Tagen nach einer Lösung am suchen. Hab schon Kopfschmerzen :/

    Ich schreibe ein Verwaltungstool, das unter Anderem Firmendaten verwalten soll.
    Es soll alles per AJAX erledigt werden.

    im Template habe ich zunächst nur Buttons, die per viewhelper generiert wurden (nicht AJAX).
    Wenn mann auf einen der Buttons klickt, wird das erste mal ein AJAX-Call ausgeführt. Hier wird dann anhand des Button-Values die entsprechende Action im AjaxController angesteuert, die dann was passendes zurück gibt. So weit so gut.

    [b]Hier schonmal die AJAX-Geschichte:[/b]

    1. var ajaxRequestUrl = "{f:uri.page(pageType:settings.ajaxPageType)}";
    2. var requestParameter = {
    3. tx_crm_ajax : {
    4. controller : 'Ajax',
    5. company_id : "{company.uid}", // hier steht die UID der Firma, zuvor an FLUID weitergegeben
    6. location : location.href
    7. }
    8. };

    die Action wird dynamisch anhand des Button-Values festgelegt (requestParameter.tx_crm_ajax.action = ...)

    1. function getData(){
    2. $.post(
    3. ajaxRequestUrl,
    4. requestParameter,
    5. function (jsonData) {
    6. currentObject = jsonData.object;
    7. $('.formContent').empty().append(jsonData.html);
    8. },
    9. "json");
    10. }

    Eine der Actions greift auf ein Repository zu und bekommt Firmendaten zurück. Diese werden dann im JSON-Format an die AJAX-Funktion (im Template) weitergereicht, wo die Daten dann aufgebaut werden. Funktioniert auch.
    Dann kann der Benutzer auf einen Edit-Button klicken, um den Datensatz zu bearbeiten. Es wird ein Formular generiert in dem in einen gegebenen f:form Rahmen per JS die nötigen Eingabefelder hineingeladen werden.
    1. <f:form class="form" action="" controller="Ajax" enctype="multipart/form-data">
    2. <div class="formContent"></div>
    3. </f:form>

    Wenn ich jetzt das Formular abschicke, kommt es zwar in der Action an, dort bekomme ich dann aber weder ein Objekt vom Reopsitory, noch kann ich mit eigenen Methoden die Daten aus dem Formular speichern.

    1. public function saveStammdatenAction() {
    2.  
    3. // hier kommen anscheinend alle Daten an
    4. $requestArguments = $this->request->getArguments();
    5.  
    6. // da die Formularinhalte sonst ein String sind
    7. parse_str($requestArguments['form'], $form);
    8.  
    9. // Eigene Repository-Methode (nur ein Versuch aus Verzweiflung -.-)
    10. $this->companyRepository->updateCompany(1, $form['name'], $form['supplement'], $form['legalform']);
    11.  
    12.  
    13. /* hier ist das Problem! Ich bekomme ein leeres Objekt
    14. $company = $this->companyRepository->findOneByUid($form['uid']);
    15.  
    16. $company->setName($_POST['name']);
    17. $company->setLegalform($_POST['legalform']);
    18. $company->setDate($_POST['date']);
    19. $company->setSupplement($_POST['supplement']);
    20.  
    21. $this->companyRepository->update($company);
    22.  
    23.   return json_encode($company);
    24. */
    25.  
    26. return json_encode($requestArguments);
    27.  
    28. }

    Der AJAX-Aufruf dafür sieht folgendermaßen aus:
    1. function setData(action){
    2. requestParameter.tx_crm_ajax.form = $('.form').serialize();
    3.  
    4. $.post(
    5. ajaxRequestUrl,
    6. requestParameter,
    7. function (jsonData) {
    8. console.log(jsonData)
    9. },
    10. "json");
    11. }

    Ich hab das Forum abgesucht. und auch die Google Links sind alle lila. Ich hoffe sehr, dass einer von euch mir weiterhelfen kann.

  • Hilfreichster Beitrag

  • freshman17 freshman1...
    Sternenflotten-Admiral
    1 x
    218 Beiträge
    2 Hilfreiche Beiträge
    29. 01. 2014, 13:25 - Hilfreichster Beitrag

    Arbeite doch direkt mit Objekten und nicht mit einzelnen Argumenten. Beispiel:

    User will Daten ändern, also gib im die Company als Formular zurück (Template -> Company.html). In diesem bindest du das Objekt

    1. <f:form id="myform" action="saveStammdaten" name="compay" object="{compay}" additionalParams="{type: 1234}">
    2. <f:form.textfield property="foo"/>
    3. </f:form>

    Beim Click auf edit

    1. var form = $('#myform');
    2. $.ajax({
    3. url: $(form).attr('action'),
    4. data: $(form).serialize(),
    5. // z.b. datatype: "json",
    6. type: "POST",
    7. success: function(data) {
    8. // was auch immer
    9. }
    10. });

    in deinem Controller

    1. public function saveStammdatenAction(\MYVENDOR\WvMyExt\Domain\Model\Company $company) {
    2. // wird nicht mehr benötigt
    3. // $requestArguments = $this->request->getArguments();
    4. }

    Sollte deine TYPO3 >= 6.0 sein und es kommt ein Fehler wegen "Registrierung von Argumenten o.ä" dann einfach in der setup.txt den rewrittenPropertyMapper = 0 explizit deaktivieren


  • 0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    30. 01. 2014, 12:04

    Mein Company-Objekt sieht so aus:

    1. <?php
    2. namespace Van\Crm\Domain\Model;
    3. use \DateTime;
    4.  
    5. class Company extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    6.  
    7.  
    8. /**
    9. * Companyname.
    10. *
    11. * @var string
    12. */
    13. protected $name = '';
    14.  
    15. /**
    16. * Companyname supplement.
    17. *
    18. * @var string
    19. */
    20. protected $supplement = '';
    21.  
    22. /**
    23. * Legal form.
    24. *
    25. * @var string
    26. */
    27. protected $legalform = '';
    28.  
    29. /**
    30. * Current date
    31. *
    32. * @var DateTime
    33. */
    34. protected $date;
    35.  
    36.  
    37. public function __construct() {
    38. $this->date = new DateTime();
    39. }
    40.  
    41.  
    42. /**
    43. * Sets the Companyname
    44. *
    45. * @param string $name
    46. * return void
    47. */
    48. public function setName($name) {
    49. $this->name = $name;
    50. }
    51.  
    52. /**
    53. * Gets the Companyname
    54. *
    55. * @return string The Companyname
    56. */
    57. public function getName() {
    58. return $this->name;
    59. }
    60.  
    61. /**
    62. * Sets the Companyname supplement
    63. *
    64. * @param string $supplement
    65. * return void
    66. */
    67. public function setSupplement($supplement) {
    68. $this->supplement = $supplement;
    69. }
    70.  
    71. /**
    72. * Gets the Companyname supplement
    73. *
    74. * @return string The Companyname supplement
    75. */
    76. public function getSupplement() {
    77. return $this->supplement;
    78. }
    79.  
    80. /**
    81. * Sets the legal form
    82. *
    83. * @param string $legalform
    84. * return void
    85. */
    86. public function setLegalform($legalform) {
    87. $this->legalform = $legalform;
    88. }
    89.  
    90. /**
    91. * Gets the legal form
    92. *
    93. * @return string the legal form
    94. */
    95. public function getLegalform() {
    96. return $this->legalform;
    97. }
    98.  
    99.  
    100. /**
    101. * @param DateTime $date
    102. * @return void
    103. */
    104. public function setDate(DateTime $date) {
    105. $this->date = $date;
    106. }
    107.  
    108. /**
    109. * @return DateTime
    110. */
    111. public function getDate() {
    112. return $this->date;
    113. }
    114. }

    is gibt keine @validate

  • freshman17 freshman1...
    Sternenflotten-Admiral
    0 x
    218 Beiträge
    2 Hilfreiche Beiträge
    30. 01. 2014, 12:16

    sorry, falscher Verdacht mein Fehler! Schau mal hier ganz unten [url]http://paul-rohrbeck.de/artikel/typo3/typo3-extbase-haeufige-fehler-und-loesungen/[/url], die selbe Fehlermeldung
    Log mal im firebug:
    url: $(form).attr('action') //ob die URL tatsächlich gefüllt ist
    data: $(form).serialize() // darf natürlich auch nicht leer sein

  • 0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    30. 01. 2014, 12:31

    es sind beide korrekt gefüllt (soweit ich das beurteiln kann)

    form.action = index.php?id=2&type=666&tx_crm_ajax%5Baction%5D=saveStammdaten&tx_crm_ajax%5Bcontroller%5D=Ajax&cHash=f241d7741881e61b926704438016234f

    POST:
    tx_crm_stammdaten[__hmac] a:3:{s:4:"name";i:1;s:6:"submit";i:1;s:7:"company";a:1:{s:10:"__identity";i:1;}}8a3f00907d4a19cf6fa88037785b7dbeb9f53d0e
    tx_crm_stammdaten[__refer... goToCompany
    tx_crm_stammdaten[__refer... Company
    tx_crm_stammdaten[__refer... Crm
    tx_crm_stammdaten[company... 1
    tx_crm_stammdaten[name]Firmenname test

  • freshman17 freshman1...
    Sternenflotten-Admiral
    0 x
    218 Beiträge
    2 Hilfreiche Beiträge
    30. 01. 2014, 12:57

    im TypoScript gesetzt?
    config.baseUrl = http://example.de
    Falls es danach immer noch nicht geht, mit GET probieren.

  • 0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    30. 01. 2014, 13:39

    geht leider trotzdem nicht.

    ich hänge mal die Extension [url]http://neu.poeci1.de/fileadmin/crm_0.0.1.zip[/url] an. Vllt hast du ein paar Minuten um dir das ding anzusehen.

    ..der Upload geht nicht :(

  • 0 x
    10 Beiträge
    0 Hilfreiche Beiträge
    30. 01. 2014, 13:45

    das war die Extension bevor ich in dieses Forum gepostet habe.

    So sieht das Ding jetzt aus: [url]http://neu.poeci1.de/fileadmin/crm_0.0.1_b.zip[/url]

  • freshman17 freshman1...
    Sternenflotten-Admiral
    0 x
    218 Beiträge
    2 Hilfreiche Beiträge
    30. 01. 2014, 14:48

    hast pn

  • cosmonoid cosmonoid
    TYPO3-Anwärter
    0 x
    6 Beiträge
    0 Hilfreiche Beiträge
    05. 05. 2014, 13:50

    Hallo,

    ich stehe derzeit vor dem gleichen Problem und endete nach allen Lösungsansätzen auch bei der Fehlermeldung The argument "comment" does not exist.
    Meine Probleme gehen sogar noch weiter wenn ich versuche das Formular per Ajax zu holen und dann abzuschicken. Aber erstmal eins nach dem anderen.
    Der Aufbau ist vergleichbar, rewrittenManager ist aus, es gibt keine validate Kommentare im Model, ohne Ajax lässt sich das Formular erfolgreich versenden, data und url des Ajaxcalls sind gefüllt. Einzigst per GET konnte ich das Ajaxformular nicht versenden, da gibt es bei mir einen Fehler : Request parameters could not be validated (&cHash comparison failed)

    Gabs hierzu eine Lösung?

    Viele Grüße,
    cosmonoid