2013-07-30 7 views
0

У меня проблемы с CGridView и один пользовательский Formatter, который использует javascript. Когда CGridView запускает запрос ajax любого типа, мой Formatter, который работает с javascript, перестает работать.CGridView AjaxRequests brokes javascript custom CFormatter

Давайте попробуем один тривиальный пример:

форматере

class DFormatter extends CFormatter { 

    public function formatTest(){ 
     $js  = <<<EOD 
     console.log("test"); 
     EOD; 

     $cs = Yii::app()->getClientScript(); 
     $cs->registerScript("testjs", $js); 

     return false; 
    } 
} 

Вид:

<?php $this->widget('zii.widgets.grid.CGridView', 
    array(
     'id'   => 'development-grid', 
     'dataProvider' => $model->search(), 
     'filter'  => $model, 
     'columns'  => array(
     'id', 
     array(
      'name' => 'testField', 
      'type' => 'test', 
     ), 
     array(
      'class' => 'CButtonColumn', 
     ), 
     ), 
)); ?> 

После первого Ajax запрос, то Javascript код, используемый в форматере перестает работать, как могу ли я получить код javascript после каждого вызова ajax, сделанного CGridView Widget?

Спасибо.

ответ

1

Вы не должны размещать скрипты в форматировании.

Снимите:

$js  = <<<EOD 
    console.log("test"); 
    EOD; 

    $cs = Yii::app()->getClientScript(); 
    $cs->registerScript("testjs", $js); 

Настройте вид сетки:

<?php $this->widget('zii.widgets.grid.CGridView', array(
    //.. other options 

    // ADD THIS 
    'afterAjaxUpdate' => 'function() { afterAjaxUpdate(); }', 

Добавить в <head> из /layouts/main.php:

<script src="<?= Yii::app()->getBaseUrl(true); ?>/js/myCustomJS.js"></script> 

Создать новый файл JS в /js/myCustomJS.js:

function afterAjaxUpdate() { 
    // do your formatting here 
} 
+0

Почему нет? Jacvascript и CSS используются для презентации, formatters не являются классами представления? – user1648170

+0

Нет, форматировщики должны использоваться для структурной разметки, например, для упаковки вывода с помощью HTML-тега, который, в свою очередь, будет разработан CSS клиентом. Если вы хотите запускать JavaScript каждый раз, когда сетка закончила загрузку, это рекомендуемый способ сделать это. –