Wieloktrotne wysyłanie POSTa


(Logan) #1

Ok, krótka piłka, to kod akcji pliku panelController.php:


public function actionResponse()

    {

        $data = array();

        $data["data"] = $_POST['field'] . PHP_EOL;

        $this->renderPartial('panelAjax', $data, false, true);

    }

to panelAjax.php:


<?php echo CHtml::beginForm('Panel/Response'); ?>

        <?php echo CHtml::ajaxSubmitButton('Send', CController::createUrl('Panel/Response'), array('update' => '#server-response'), array('id' => 'send-button-answer', 'class' => 'submit styled-button')); ?>

    

        <p class="field switch" id=''>

            <input type="radio" id="answerY" name="field" value="yes", class="hidden" checked />

            <input type="radio" id="answerN" name="field" value="no", class="hidden"/>

            <label for="answerY" class="cb-enable selected"><span>Yes</span></label>

            <label for="answerN" class="cb-disable"><span>No</span></label>

        </p>    

    <?php echo CHtml::endForm(); ?>

a to panel.php


<div id="server-response">

        </div>

No i po każdym naciśnięciu przycisku Send podwaja mi się liczba requestów:

Requests

stronka wygląda tak:

Strona

Co jest tego powodem? Od razu powiem że radio buttony i przycisk muszę generować dynamicznie.


(Adam Klosiu) #2

Wydaje mi się, że był zgłoszony już podobny błąd albo w trakerze google code, albo na forum. Żadne z linków z Twojego postu mi się nie otwiera. Zakładam, że za każdym razem kiedy renderujesz formularz, dopisywana jest funkcja obsługi zdarzenia click, ale stare zostają. Poszukaj w dziale angielskim tego forum, na szybko jednak spróbuj tak:




 <?php echo CHtml::ajaxSubmitButton('Send', CController::createUrl('Panel/Response'), 

array('update' => '#server-response',

'beforeSend'=>"function(){$('body').undelegate('#send-button-answer', 'click');}" ), 

array('id' => 'send-button-answer', 'class' => 'submit styled-button')

); ?>

 

można też odłączać stare zdarzenia w zdarzeniu success, bo jeżeli beforeSend z jakieś przyczyny nie wyśle się, to guzik już nie będzie działać…

Uważaj też z PHP_EOL. Dane są wysyłane wielokrotnie do klienta i przetwarzane w jakiś tam sposób przez javascript (ajax chociażby) może się okazać, że zawartość $_POST[‘field’] jest inna niż oczekiwana.

PHP_EOL używa znaków końca linii właściwych dla serwera. Klient może mieć (i w większości przypadków ma :) ) przecież inny system. Rozważ wpakowanie tam ‘\n’.


(Logan) #3

Odnośniki do zdjęć poprawione (wcześniejsze na początku też działały, ale hosting chyba się rozmyślił).

Twój kod działa, wielkie dzięki :)

Poprawiłam też PHP_EOL, dzięki za zwrócenie uwagi :)