[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Yii fw гуру - динамическое создание виджетов, как?
vital
Есть блок на старнице, содержание которого целиком динамично, хтмл формируется аяксом.
А вот надо показать там грид, CGridView который.
И он показывается, данные выводит..
Но не навешиваются js скрипты. Вообще. Происходит примерно следующее:
$html.='ТУТА ЧАСТЬ ХТМЛ';
Yii::import('zii.widgets.grid.*');
$columns = array();
//ТУДА В массив формируем колонки и потом..
$grid = $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => ORG_OBJECT::model()->getTable($oy_id, $attr['TABLE_ID']),
'summaryText' => 'Всего элементов: {count}',
'id' => 'grid_' . $n,
'pager' => array(
'footer' => '',
'header' => ''
),
'template' => "
<div class='table_head_p'>
<a href='#' onclick='addTableData()' style='text-decoration:none'>Добавить</a>
{summary}{pager}
</div>

\n{items}", 'columns' => $columns
), true); //генерим грид, и ставим тру для того что бы хтмл вернулся в переменную.
echo $html;
exit;


Вот, js не цепляется, а надо =\
Там потом ниже еще есть CHtml::ajaxSubmitButton с той же проблемой, кнопка есть, аякса нет.



Спустя 10 минут, 8 секунд (14.06.2012 - 11:08) TMake написал(а):
vital т.е. ты пытаешься ajax'ом выгрузить весь грид, а не проще на странице организовать вывод грид, а ajax'ом подгружать уже что тебе нужно.
У меня была такая проблема, но как решил уже не помню

Спустя 7 минут, 43 секунды (14.06.2012 - 11:16) vital написал(а):
Цитата (stepan @ 14.06.2012 - 10:08)
vital т.е. ты пытаешься ajax'ом выгрузить весь грид, а не проще на странице организовать вывод грид, а ajax'ом подгружать уже что тебе нужно.
У меня была такая проблема, но как решил уже не помню

Не проще.
У меня нету статических гридов.
Кол-во гридов в блоке, колонки в них - все динамически(есть отдельная страница где создаются таблицы - создаются для них колонки, выбираются типы значений..). Я не могу их создать заранее.

т.е. грид и есть часть того, что нужно сформировать и подгрузить.

Спустя 24 минуты, 42 секунды (14.06.2012 - 11:41) vital написал(а):
Если кому интересно, происходит примерно следующее

Свернутый текст
public function actiongetBlock() {
set_time_limit(0);
$block_id = Yii::app()->request->getParam('block_id');
$oy_id = Yii::app()->request->getParam('oy_id');

$attrsInBlock = KF_ATTR_GROUP::model()->getPokazateliInBlock($block_id, true);
if (empty($attrsInBlock)) {
echo 'В этом блоке нету показателей!';
exit;
}
$attr_ids = array();
$table_ids = array();
foreach ($attrsInBlock as $attr) {
if (empty($attr['TABLE_ID']))
$attr_ids[] = $attr['ATTR_ID'];
}
$attrsValues = KF_ATTR::model()->getAttrValuesByIds($oy_id, $attr_ids);

$html = '<div class="form"><form id="blockForm">';
$script = '';
foreach ($attrsInBlock as $attr) {
$html.='<div class="row">';
if (empty($attr['TABLE_ID'])) {

//тут не важно
} else {
//а тут грид.
$html.='<label for="table[' . $attr['TABLE_ID'] . ']">Двумерный показатель:' . $attr['TABLE_NAME'] . '</label>';
Yii::import('zii.widgets.grid.*');
$columns = array();
$cols = KF_TABLE::model()->getTable($attr['TABLE_ID']);
$col_count = $cols->totalItemCount;
$cols = $cols->getData();
if ($col_count > 0) {
for ($i = 0; $i <= $col_count - 1; $i++) { //заполняются колонки
$columns[] = array('value' => '$data[' . $i . ']', 'header' => $cols[$i]['ATTR_NAME']);
}
$columns[] = array(
'class' => 'CButtonColumn',
'template' => '{update}{delete}',
'afterDelete' => '1',
'buttons' => array(
'delete' => array(
'url' => 'Yii::app()->createUrl("fillingforms/delRowTable", array("ids[]"=>Chtml::encode($data[count($data)-1][2])))',
'options' => array(
'onclick' => 'var url=$(this).attr("href");
$.ajax({
"url":url,
success:function(data){
alert("Cтрока удалена");
$.fn.yiiGridView.update("grid_'
. $n . '");
}
});
return false;'

)
),

'update' => array(
'url' => 'Yii::app()->createUrl("fillingforms/AddTableData",array("ids[]"=>Chtml::e ncode($data[count($data)-1][2])))',
)
)
);

}
// создается грид
$grid = $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => ORG_OBJECT::model()->getTable($oy_id, $attr['TABLE_ID']),
'summaryText' => 'Всего элементов: {count}',
'id' => 'grid_' . $n,
'pager' => array(
'footer' => '',
'header' => ''
),
'template' => "
<div class='table_head_p'>
<a href='#' onclick='addTableData()' style='text-decoration:none'>Добавить</a>
{summary}{pager}
</div>

\n{items}", 'columns' => $columns
), true);
$script.='
jQuery("#grid_'
. $n . '").yiiGridView({
"ajaxVar":"ajax",
"pagerClass":"pager",
"loadingClass":"grid-view-loading",
"filterClass":"filters",
"tableClass":"items",
"selectableRows":1});'
;
$html.= $grid;
}
$html.='</div>';
}
//кнопочки
$html.=CHtml::SubmitButton('Cохранить', array(
'onclick' => '$.post("' . $this->createUrl('fillingforms/saveForm') .
'",$("#blockForm").serialize()+"&oy_id=' . $oy_id . '&' . Yii::app()->request->csrfTokenName . '=' . Yii::app()->request->csrfToken . '"); return false;'));
$html.=CHtml::button('Отмена', array(
'onclick' => '$("#form_container").empty();$("#form_container").load("' .
$this->createUrl('fillingforms/getblock') .
'",{"' . Yii::app()->request->csrfTokenName . '":"' . Yii::app()->request->csrfToken .
'","block_id":"' . CHtml::encode($block_id) . '","oy_id":"' . CHtml::encode($oy_id) . '"})'));
$html.='</form></div>';

echo $html . '<script type="text/javascript">' . $script . '</script>';
exit;
}

Спустя 4 минуты, 18 секунд (14.06.2012 - 11:45) Dezigo написал(а):
Самое интерестное,что этот подход не как не упрощает понемание и быстроту кода.
И способ через жопу.(вместо обычного php шаблонизатора)

Спустя 4 минуты, 38 секунд (14.06.2012 - 11:50) TMake написал(а):
Цитата (Dezigo @ 14.06.2012 - 12:45)
Самое интерестное,что этот подход не как не упрощает понемание и быстроту кода.

Потому как у него все в одном контроллере и отображение и действие. А на подход грешить не стоит, каждому свое.

Спустя 3 минуты, 17 секунд (14.06.2012 - 11:53) Invis1ble написал(а):
оффтоп
Я вот как раз хотел спросить, нормально ли это, что в контроллере формируется html да еще и в перемешку с js, но постеснялся smile.gif

Спустя 4 минуты, 14 секунд (14.06.2012 - 11:57) TMake написал(а):
Invis1ble из этого можно было бы раскидать как должно быть в идеале, но мне лень, тем более vital задачу решил
P.S. Лишь бы не пришлось встретиться с этим творением. biggrin.gif

Спустя 2 минуты, 52 секунды (14.06.2012 - 12:00) vital написал(а):
Цитата
Самое интерестное,что этот подход не как не упрощает понемание и быстроту кода.
И способ через жопу.(вместо обычного php шаблонизатора)

Как же бесят такие хорошие люди которые не понимают сути=\ Но считают себя мега-умными и пишут =\

Окей, сделай мне шаблон для страницы КОТОРАЯ ПОЛНОСТЬЮ ДИНАМИЧНА.
ТАМ НЕТУ КУСКОВ ХТМЛА К-Е МОЖНО СОЗДАТЬ ЗАРАНЕЕ.

Цитата
Я вот как раз хотел спросить, нормально ли это, что в контроллере формируется html да еще и в перемешку с js, но постеснялся

Есть варианты - иногда проще вернуть json - и руками создавать на клиенте все, иногда - вернуть готовый хтмл.

зависит часто от объема данных - скажем, в этой же прилаге было место, где аяксом подгружалось дерево <ul>\<li> списком, из ~800элементов - так браузеры подвисали, а ие вообще не мог отрендерить это дерево.

Переделав на возврат json-a, а создание хтмла тегов на клиенте этой проблемы нет.

Но конкретно в данном случае просто нету другого варианта. Ибо весьма разнообразный контент, те же гриды я не могу создать на клиенте. Как и кучу всяких разных штук.

Спустя 2 минуты, 4 секунды (14.06.2012 - 12:02) vital написал(а):
Цитата (stepan @ 14.06.2012 - 10:57)
Invis1ble из этого можно было бы раскидать как должно быть в идеале, но мне лень, тем более vital задачу решил
P.S. Лишь бы не пришлось встретиться с этим творением. biggrin.gif

Ни пользоваться, ни дорабатывать это тебе никто никогда в жизни не даст, не переживай.

Спустя 2 минуты, 34 секунды (14.06.2012 - 12:05) vital написал(а):
Цитата
И способ через жопу.(вместо обычного php шаблонизатора)

Сделаешь лучше - заплачу мою месячную зп.
Если согласен - напишу тз и выложу публично.
Если не сделаешь - ты мне.
Слабо?

Спустя 2 минуты, 33 секунды (14.06.2012 - 12:07) TMake написал(а):
Цитата (vital @ 14.06.2012 - 13:00)
Есть варианты - иногда проще вернуть json - и руками создавать на клиенте все, иногда - вернуть готовый хтмл.

Но пихать все в один контроллер не стоит, а где же MVC, ведь в твоей портянки такой микс.

Спустя 59 секунд (14.06.2012 - 12:08) vital написал(а):
Цитата
тем более vital задачу решил

не совсем =\
залез в код фреймворка и почти все сделал, осталость только найти где навешиваются евенты на кнопки в гриде, к-й CButtonColumn и тоже продублировать

Спустя 1 минута, 48 секунд (14.06.2012 - 12:10) TMake написал(а):
Цитата (vital @ 14.06.2012 - 13:02)
Ни пользоваться, ни дорабатывать это тебе никто никогда в жизни не даст, не переживай.

Не уж то завышенная само оценка???
И слава богу.

Спустя 7 секунд (14.06.2012 - 12:10) vital написал(а):
Цитата (stepan @ 14.06.2012 - 11:07)
Цитата (vital @ 14.06.2012 - 13:00)
Есть варианты - иногда проще вернуть json - и руками создавать на клиенте все, иногда - вернуть готовый хтмл.

Но пихать все в один контроллер не стоит, а где же MVC, ведь в твоей портянки такой микс.

Тоже самое что и на пост выше.
Там нету другого варианта.

Спустя 2 минуты, 21 секунда (14.06.2012 - 12:12) vital написал(а):
Инпост, все-равно смотришь тему - включите мне чат вверху плиз.

Спустя 8 минут, 34 секунды (14.06.2012 - 12:21) redreem написал(а):
Цитата
Но не навешиваются js скрипты


т.е. не срабатывают автоматом после прогрузки?
если в этом проблема, то это нормально - сунь их в функцию, а функцию вызови после приема контента.

Спустя 2 минуты, 16 секунд (14.06.2012 - 12:23) vital написал(а):
Цитата (stepan @ 14.06.2012 - 11:10)
Цитата (vital @ 14.06.2012 - 13:02)
Ни пользоваться, ни дорабатывать это тебе никто никогда в жизни не даст, не переживай.

Не уж то завышенная само оценка???
И слава богу.

Не совсем.

Просто никто из вас не попробовал задуматься о треде, но как писать сразу что фуу ты не выводищь в шаблон так сразу все горазды.

Так вот, там есть шаблоны. Много шаблонов. А еще кеширование в мемкеш статических кусков, автогзип-минифай и куча всего прочего. Вот только к сути треда не относится.

А еше писать госприлаги не дадут никогда фрилансеру.

Спустя 4 минуты, 23 секунды (14.06.2012 - 12:28) vital написал(а):
Цитата (redreem @ 14.06.2012 - 11:21)
Цитата
Но не навешиваются js скрипты


т.е. не срабатывают автоматом после прогрузки?
если в этом проблема, то это нормально - сунь их в функцию, а функцию вызови после приема контента.

не совсем. Я же спецом про фреймоврк уточнил.
т.е. мои скрипты я знаю как выполнить smile.gif

Есть еще скрипты, к-е относятся к виджетам фреймворка - дефолтные обработчики вских кнопок\евентов. И вот они подключаются там каким-то внутренним способом в фреймоврке я не совсем точно представляю как.

Сами файлы я подключил отдельно, они на странице есть, но вот как фреймворк навешивает обработчики на скажем кнопку удалить в гриде(например) - я хз. Суть треда именно в том, что что еще надо сделать что бы навесились евенты дефолтные, посколько где генерится яваскрипт не понятно.

Спустя 10 минут, 8 секунд (14.06.2012 - 12:38) redreem написал(а):
покажи js кусок, который оказывается в браузере после приема. предположу что проблема связана с затиранием привязки событий фреймворка жкверевскими методами, такими как live например. из php куска воссоздавать js визуально - влом.

Спустя 2 минуты, 22 секунды (14.06.2012 - 12:40) Семён написал(а):

 ! 

М
Vital,Следим за своим языком, тут еще следует посмотреть кто из вас *удак, судя по написанию твоей каши в контрллере
Семён

Спустя 1 минута, 39 секунд (14.06.2012 - 12:42) vital написал(а):
Цитата
покажи js кусок, который оказывается в браузере после приема

Да нету этого куска.(он то мне и нужен)
Ничего там не затирается потому что нечему.

В том и суть, что как Yii генерит свой встроенный js и как его навешивает? И как мне попросить это сделать?

Спустя 1 минута, 14 секунд (14.06.2012 - 12:43) vital написал(а):
Цитата (redreem @ 14.06.2012 - 11:38)
покажи js кусок, который оказывается в браузере после приема. предположу что проблема связана с затиранием привязки событий фреймворка жкверевскими методами, такими как live например. из php куска воссоздавать js визуально - влом.

Собственно яваскрипт в контроллере - я потому и написал, что тот js к-й Yii генерит сам по себе - не появился.

В том и вопрос, что как сделать так, что бы дефолтный js появился.

Спустя 21 минута, 48 секунд (14.06.2012 - 13:05) redreem написал(а):
$grid = $this->widget('zii.widgets.grid.CGridView', array(
...

'afterAjaxUpdate'=>'function(id) { $(' . 'grid_' . $n ').yiiGridView.update(id); }',
...


Спустя 5 минут, 59 секунд (14.06.2012 - 13:11) vital написал(а):
Цитата
'afterAjaxUpdate'=>'function(id) { $(' . 'grid_' . $n ').yiiGridView.update(id); }',

Этот код не сработает smile.gif
Точно так же как не сработают клики по кнопке удалить, не сработает клик по чекбоксу для выделить все и т.п.
Я с этого и начал smile.gif

А не сработает т.к. yii не навесит эти все обработчики.


_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.