[Frage] Nach AJAX-Request wird nur das JSON-Objekt ausgegeben TYPO3-Version: 7.6.16

  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    30. 04. 2017, 13:11

    Nach meinem Ajax-Request wird nur das JSON-Response-Objekt ausgeben.
    Ansonsten funktioniert alles.

    Wenn ich am Ende der Methode 'commentViaAjaxAction' einen Breakpoint setze, sehe ich das die Ergebnisseite korrekt geladen wird. Und erst wenn der Breakpoint komplett abgearbeite ist, wird plötzlich das JSON-Objekt ausgegeben.

    Hier mal mein Code:
    setup.ts

    1. ...
    2. ajax = PAGE
    3. ajax {
    4. typeNum = 99
    5. config {
    6. disableAllHeaderCode = 1
    7. additionalHeaders = Content-type:application/json
    8. admPanel = 0
    9. debug = 0
    10. }
    11. 10 < tt_content.list.20.simpleblog_bloglisting
    12. }
    13. ...

    Die commentViaAjaxAction() des PostController

    1. /**
    2.  * @param Post $post
    3.  * @param Comment|null $comment
    4.  */
    5. public function commentViaAjaxAction(Post $post, Comment $comment = null) {
    6. if ($comment->getComment() == '') {
    7. return false;
    8. }
    9.  
    10. $comment->setCommentdate(new \DateTime());
    11. $post->addComment($comment);
    12. $this->postRepository->update($post);
    13. $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager')->persistAll();
    14.  
    15. $comments = $post->getComments();
    16. foreach ($comments as $comment) {
    17. $json[$comment->getUid()] = [
    18. 'comment' => $comment->getComment(),
    19. 'commentdate' => $comment->getCommentdate()
    20. ];
    21. }
    22. return json_encode($json);
    23. }

    Und die ajax.js

    1. $().ready(function() {
    2. $('#commentsubmit').on('click', function() {
    3. var ajaxUrl = '<f:uri.action action="commentViaAjax" controller="Post" pageType="99" arguments="{post:post}"/>';
    4. var form = $('#commentform');
    5. $.ajax({
    6. url: ajaxUrl,
    7. type: 'POST',
    8. data: form.serialize(),
    9. success: function(response) {
    10. var items = [];
    11. $.each(response, function(key, val) {
    12. items.push('<li class="list-group-item">' + val.comment + ' <span class="text-muted">(' + val.commentdate + ')</span></li>');
    13. });
    14. $('#comments').html(items.reverse().join(''));
    15. $('#commentfield').val();
    16. return false;
    17. }
    18. });
    19. });
    20. });

    Tags: Ajax

  • 1
  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    02. 05. 2017, 13:16

    Im success-callback deiner ajax.js ist "response" ein String und noch kein JavaScript Objekt. Dem entsprechend wird auch nur ein String ausgegeben.

    Du musst "response" noch parsen, damit du im JS damit weiterarbeiten kannst.. JSON.parse(response).

  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    02. 05. 2017, 20:57

    @toifel

    Vielen Dank für Deine Hilfe. Aber leider gehts trotzdem net - bnekomme weiter nach dem Ajax-Request lediglich das JSON zurück.
    Oder habe ich deinen Hinweis falsch umgesetzt? Anbei mein (geändertes - nur der success-Callback) JS

    1. success: function(response) {
    2. var items = [];
    3. $.each(JSON.parse(response), function(key, val) {
    4. items.push('<li class="list-group-item">' + val.comment + ' <span class="text-muted">(' + val.commentdate + ')</span></li>');
    5. });
    6. $('#comments').html(items.reverse().join(''));
    7. $('#commentfield').val();
    8. return false;
    9. }

  • toifel toifel
    Jedi-Ratsmitglied
    0 x
    831 Beiträge
    96 Hilfreiche Beiträge
    03. 05. 2017, 13:33

    Ich tippe mal, dass der oberste Index in deiner response alle Daten beinhaltet. Teste es mal mit JSON.parse(response)[0]:

    1. success: function(response) {
    2. var items = [];
    3. $.each(JSON.parse(response)[0], function(key, val) {
    4. items.push('<li class="list-group-item">' + val.comment + ' <span class="text-muted">(' + val.commentdate + ')</span></li>');
    5. });
    6. $('#comments').html(items.reverse().join(''));
    7. $('#commentfield').val();
    8. return false;
    9. }

    Ansonsten lass dir das geparste response Objekt mal in der Browser-console ausgeben und schau dir die Struktur an bzw. poste sie bei Bedarf noch mal hier. Also console.log(JSON.parse(response)) ;)

  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    03. 05. 2017, 18:56

    @toifel
    Hallo,

    das

    console.log(JSON.parse(response))

    hab ich als erstes probiert.
    Aber komischerweise wird mir in der Console gar nichts ausgegeben.

    Im Tab 'Netzwerk' der Entwicklerkonsole sehe ich das der AJAX-Request erfolgreich beendet wurde und die Seite mit der Ausgabe des response-Objekts wird mir angezeigt.
    Aber der Tab 'Console' ist leer.

  • Teisinger Teisinger
    Jedi-Meister
    0 x
    374 Beiträge
    26 Hilfreiche Beiträge
    03. 05. 2017, 20:30

    bei sowas kannst du mit try catch blöcken herrausfinden welcher codeabschnitt noch ausgeführt wird. Damit könntest du den fehler bzw. die stelle an der es hackt näher kommen. :)

    https://github.com/groundstack-org

  • satan_jim_knopf satan_jim...
    TYPO3-Anwärter
    0 x
    5 Beiträge
    0 Hilfreiche Beiträge
    09. 10. 2018, 08:46

    Hallo getit,

    hast du eine Lösung zu deinem Problem gefunden? Ich habe nämlich das gleich Problem und verstehe einfach nicht woran es liegt. Kannst du mir weiterhelfen?

    Gruß
    JimK

  • 1