CHtml::ajaxSubmitButton

Ситуация такая:

Имеем стандартную сгенерированную с помощью yiic форму, которую подключаем к нужной страничке:

[html]

<div id="needForm">

<?

&#036;p = Yii::app()-&gt;createController('need');


&#036;p[0]-&gt;actionCreate();   

?>

</div>

[/html]

От стандартности форму отличает только то, что сабмитить её нужно с помощью ajax и выдавать результат на то же место, где она была.

Добавляем туда кнопку




echo CHtml::ajaxSubmitButton('Submit', '/need/create', array(

    'type' => 'POST',

    'update' => '#needForm',

),

array(

   'type' => 'submit'

));



При первом нажатии всё хорошо. Проходит запрос, ответ пишется куда нам надо.

Но при втором нажатии кнопка больше не обрабатывается жава-скриптом и форма сабмитится обычным образом отправляя нас на страничку /need/create .

При создании страницы кнопка именуется id="yt2" и на неё вешается скрипт:


jQuery('#yt2').click(function(){ ... });

При обновлении формы кнопка уже имеет id="yt1" и собственно говоря перестаёт работать.

Пока писал пост почти придумал решение - расширить html options:


array(

   'type' => 'submit',

   'id' => 'myButton',

   'name' => 'myButton'

));

Кнопка в обоих случаях уже имеет одно и то же имя и id, но со второй попытка по-прежнему не срабатывает ajax.

Как вариант решил проблему уже таким образом:

после




echo CHtml::ajaxSubmitButton('Submit', '/need/create', array(

    'type' => 'POST',

    'update' => '#needForm',

),

   array(

   'type' => 'submit',

   'id' => 'myButton',

   'name' => 'myButton'

));



добавил

[html]

<script type="text/javascript">

/<![CDATA[/

jQuery(document).ready(function() {

jQuery(’#myButton’).click(function(){ //скопировал то что было сгенерировано автоматически });

});

/]]>/

</script>

[/html]

Но до верха изящества такому варианту немного далековато.

Подскажет ли уважаемое коммьюнити более интересные идеи? :)

В файле CClientScript.php не особо понял принцип работы функции




	protected function recordCachingAction($context,$method,$params)

	{

            if(($controller=Yii::app()->getController())!==null){

			$controller->recordCachingAction($context,$method,$params);

            }

	}



По какому принципу она работает?

Пока расширил её так:





	protected function recordCachingAction($context,$method,$params)

	{

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

            echo '<script type="text/javascript">/*<![CDATA[*/

                        jQuery(document).ready(function() {

                            '.$params[1].'

                        });

                    /*]]>*/</script>';

            }

            elseif(($controller=Yii::app()->getController())!==null){

			$controller->recordCachingAction($context,$method,$params);

            }

	}



Но должно быть и более элегантное решение. :(

В общем нашлось решение.




$this->renderPartial('create',array('model'=>$model),false,true);



Установить четвёртый параметр в true, для того чтоб сгенерировался скрипт.

Пообщался сам с собой называется :)

"Синку, хай тебе Бог благословить))))))"

Дружище, риальне спасибо, два часа ипал мозги. Так что твои посты не потерялись даром ;)

большое спасибо :) а то решал подобные проблемы адскими костылями

Также есть очень полезное свойство ‘live’=>false.

Оно помогает когда обновляется вся форма вместе с кнопкой. В этом случае запросы каждый раз будут увеличиваться на 1. ‘live’=>false исключает этот момент.

Что бы запросы не увеличивались на 1 нужно делать уникальный id кнопке при каждой загрузке.




'id' => 'form_submit_' . rand(1, 255),



И еще иногда полезно отключать повторную загрузку js:




Yii::app()->clientScript->scriptMap["*.js"]=false;