ajaxSubmitButton() lädt die Seite nicht neu

Hi,

beim hinzufügen von neuen Kommentaren soll die Seite nicht neu geladen werden.

Aus diesem Grund möchte ich ajaxSubmitButton benutzen.

Die Daten werden an den Server geschickt, jedoch werden die neuen Daten nicht angezeigt :confused:

Zum Anzeigen der Daten, muss die Seite erst neugeladen werden.

Hier mein Code




<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'flashcards-comments-form',

	'enableAjaxValidation'=>false,

)); ?>


	<p class="note">Fields with <span class="required">*</span> are required.</p>


	<?php echo $form->errorSummary($model); ?>


	<div class="row">

		<?php echo $form->labelEx($model,'type'); ?>

		<?php echo $form->dropDownList($model, 'type', $model->getCommentTypes());?>

		<?php echo $form->error($model,'type'); ?>

	</div>




	<div class="row">

		<?php echo $form->labelEx($model, 'comment')?>

		<?php echo $form->textArea($model, 'comment', array('rows' => 6, 'cols' => '70'));?>

		<?php echo $form->error($model, 'comment');?>

	</div>




	<div class="row buttons">

		<?php echo CHtml::ajaxSubmitButton($model->isNewRecord ? 'Create' : 'Save',

		CHtml::normalizeUrl(array('flashcards/view', 'id' => 24)),

		array(

			'beforeSend'=>'function()

			{

				$("#update_info").replaceWith("<p id=\"update_info\">sending...</p>");

			}'

		)

		

		); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->


Kann mir hier bitte, jemand weiterhelfen.

danke



Irgendwie fehlt mir da die Angabe, wo ein Update durchgeführt werden soll. Vielleicht so:




<div class="row buttons">

    <?php echo CHtml::ajaxSubmitButton($model->isNewRecord ? 'Create' : 'Save',

        CHtml::normalizeUrl(array('flashcards/view', 'id' => 24)),

	    array(

	 	'beforeSend'=>'function()

		{

	            $("#update_info").replaceWith("<p id=\"update_info\">sending...</p>");

		}',

                'update'=>'Selektor', // oder 'replace'

	    )

	); ?>

</div>



Hallo Sisko,

du musst in deinem Array der AJAX-Konfiguration noch den Index update bzw. replace mit einer ID bestücken. Du musst das nicht manuell in beforeSend machen, zumal beforeSend sowieso nicht geeignet ist, da der Callback zu diesem Zeitpunkt nicht vorhanden ist.





<?php echo CHtml::ajaxSubmitButton($model->isNewRecord ? 'Create' : 'Save',

CHtml::normalizeUrl(array('flashcards/view', 'id' => 24)),

    array(

        'update'=>'#update_info', // oder 'replace'

    )

); ?>



Grüße Robert

Danke für die beiden Antworten!

Die Inhalte werden zwar nun geladen, jedoch auf zwei seltsame Arten

Meine view.php sieht wie folgt aus

[code|

&lt;div id=&quot;comments&quot;&gt;





	&lt;?php &#036;this-&gt;renderPartial('_comments', array(


		'comments' =&gt; &#036;oFlashcard-&gt;flashcardsComments,


	));?&gt;





	&lt;h3&gt;Kommentar hinterlassen&lt;/h3&gt;





	&lt;?php &#036;this-&gt;renderPartial('/flashcardsComments/_form', array(


		'model'	=&gt; &#036;comment,


	));?&gt;


&lt;/div&gt;

|/code]

Meine _form.php wie folgt




	<div class="row buttons">

		<?php echo CHtml::ajaxSubmitButton($model->isNewRecord ? 'Create' : 'Save',

		CHtml::normalizeUrl(array('flashcards/view', 'id' => 5)),

		array(

			'replace' => '#comments',

		)

		); ?>

	</div>



  1. ‘replace’ => ‘#comments’,

Nun wird meine gesamte Seite im Kommentar (#comments) erneut geladen, statt nur

  1. ‘replace’ => ‘#page

Hierbei handelt es sich um die ID der Seite. Wenn ich nun jedoch einen Kommentar abgebe, dann wird dieser verdoppelt. Wenn dann wieder ein Kommentar abgegeben wir, wieder dieser verdreifacht, etc.

Hier vermute das der Fehler in der Action liegt.


 

   public function actionView($id)

    {

    	$issue		= $this->loadModel($id);

    	$comment	= $this->createComment($issue);

    	$oEntity	= $this->createFlashcardsEntity($issue);


    	if(Yii::app()->request->isAjaxRequest)

		{

		}

    	

    	

        $this->render('view',array

        (

            'oFlashcard'	=>	$this->loadModel($id),

        	'comment'		=>	$comment,

        	'oEntity'		=>	$oEntity,

        ));

    }



Mein Ziel ist es ja, dass nur der Selektor #comments aktualisiert wird.

thx für eure Antworten!

ich habe den Fehler soeben selber gefunden.

Man muss die Action der View so anpassen, dass sie bei einem AjaxRequst den entsprechenden Div Block lädt.

Dazu lade ich mit renderPartial mein Kommentarfeld nach

Eine Frage habe ich noch.

User sollen sehen sobald ein neuer Kommentar erscheint

Wie erreiche ich es, dass die anderen Benutzer die auf der gleichen Seite sind, den neuen Kommentar sehen, ohne das die Seite aktualisiert wird?

Sorry, verstehe ich nicht. BeforeSend war doch zusätzlich als Status Info gedacht, kann der OP doch auch noch verwenden? "Selektor" war natürlich nur als Platzhalter für #Irgendwas gedacht.

Hallo Sisko,

eigentlich wollte ich gar nicht dir sondern yii antworten :-). So gesehen - sry für die Verwechslung. beforeSend ist ein nützlicher Event Listener um vor dem Absenden einer Action irgend etwas zu tun. Wie du schriebst, könnte man einen Status anzeigen "wird geladen" - das stimmt.

Grüße

Robert

Danke für beide Antworten.

Könnt ihr mir dazu noch was sagen

Hi yii,

könntest Du vielleicht mal die Lösung in Deiner action Methode hier posten? Das wäre super! Ich habe momentan nämlich dasselbe Problem.

Viele Grüße,

Majestic

Dazu müsstest du ein Javascript schreiben, das einen Timer setzt, der in einem festen Interval immer wieder Ajax-Abfragen sendet. Ein kleiner Anfang ;)




window.setTimeout("loadComments()", 1000);






	<?php echo CHtml::ajaxSubmitButton('kommentieren',

	CHtml::normalizeUrl(array('flashcards/view','l' => 'deutsch-kroatisch', 'id' => $oFlashcard->id)),

	array(

		'beforeSend' => 'function(){

			$("#myDiv").addClass("loading");

		}',

		'complete' => 'function(){

			$("#myDiv").removeClass("loading");

		}',

		'replace' => '#commentsTiny',	

	),

	array('class' => 'button right round-small')

	); ?>


	<div id="myDiv">DDD</div>