Ninja
(Dog)
September 18, 2009, 6:08pm
1
Ситуация такая:
Имеем стандартную сгенерированную с помощью yiic форму, которую подключаем к нужной страничке:
[html]
<div id="needForm">
<?
$p = Yii::app()->createController('need');
$p[0]->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.
Ninja
(Dog)
September 18, 2009, 6:23pm
2
Как вариант решил проблему уже таким образом:
после
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]
Но до верха изящества такому варианту немного далековато.
Подскажет ли уважаемое коммьюнити более интересные идеи?
Ninja
(Dog)
September 20, 2009, 10:35am
3
В файле 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);
}
}
Но должно быть и более элегантное решение.
Ninja
(Dog)
September 20, 2009, 6:14pm
4
В общем нашлось решение.
$this->renderPartial('create',array('model'=>$model),false,true);
Установить четвёртый параметр в true, для того чтоб сгенерировался скрипт.
Пообщался сам с собой называется
"Синку, хай тебе Бог благословить))))))"
Дружище, риальне спасибо, два часа ипал мозги. Так что твои посты не потерялись даром
большое спасибо а то решал подобные проблемы адскими костылями
jazz666
(Ilyin Stanislav)
March 25, 2015, 1:21pm
7
Также есть очень полезное свойство ‘live’=>false.
Оно помогает когда обновляется вся форма вместе с кнопкой. В этом случае запросы каждый раз будут увеличиваться на 1. ‘live’=>false исключает этот момент.
ineersa
(Ineersa)
March 26, 2015, 7:50am
8
jazz666:
Также есть очень полезное свойство ‘live’=>false.
Оно помогает когда обновляется вся форма вместе с кнопкой. В этом случае запросы каждый раз будут увеличиваться на 1. ‘live’=>false исключает этот момент.
Что бы запросы не увеличивались на 1 нужно делать уникальный id кнопке при каждой загрузке.
'id' => 'form_submit_' . rand(1, 255),
И еще иногда полезно отключать повторную загрузку js:
Yii::app()->clientScript->scriptMap["*.js"]=false;