1 <?php
2 3 4 5 6 7 8 9 10 11 12
13
14 Yii::import('ext.editable.EditableField');
15 Yii::import('zii.widgets.grid.CDataColumn');
16
17 class EditableColumn extends CDataColumn
18 {
19
20 public $editable = array();
21
22
23 protected $isScriptRendered = false;
24
25 public function init()
26 {
27 if (!$this->grid->dataProvider instanceOf CActiveDataProvider) {
28 throw new CException('EditableColumn can be applied only to grid based on CActiveDataProvider');
29 }
30 if (!$this->name) {
31 throw new CException('You should provide name for EditableColumn');
32 }
33
34 parent::init();
35
36 if($this->isEditable($this->grid->dataProvider->model)) {
37 $this->attachAjaxUpdateEvent();
38 }
39 }
40
41 protected function renderDataCellContent($row, $data)
42 {
43 if(!$this->isEditable($data)) {
44 parent::renderDataCellContent($row, $data);
45 return;
46 }
47
48 $options = CMap::mergeArray($this->editable, array(
49 'model' => $data,
50 'attribute' => $this->name,
51 ));
52
53
54 if(strlen($this->value)) {
55 ob_start();
56 parent::renderDataCellContent($row, $data);
57 $text = ob_get_clean();
58 $options['text'] = $text;
59 $options['encode'] = false;
60 }
61
62 $editable = $this->grid->controller->createWidget('EditableField', $options);
63
64
65 $selector = get_class($editable->model) . '_' . $editable->attribute;
66 $editable->htmlOptions['rel'] = $selector;
67
68 $editable->renderLink();
69
70
71 if (!$this->isScriptRendered) {
72 $script = $editable->registerClientScript();
73 Yii::app()->getClientScript()->registerScript(__CLASS__ . '#' . $selector.'-event', '
74 $("#'.$this->grid->id.'").parent().on("ajaxUpdate.yiiGridView", "#'.$this->grid->id.'", function() {'.$script.'});
75 ');
76 $this->isScriptRendered = true;
77 }
78 }
79
80 81 82 83 84 85 86
87 protected function attachAjaxUpdateEvent()
88 {
89 $trigger = '$("#"+id).trigger("ajaxUpdate");';
90
91
92 if(strpos($this->grid->afterAjaxUpdate, $trigger) !== false) return;
93
94
95 if(strlen($this->grid->afterAjaxUpdate)) {
96 $orig = $this->grid->afterAjaxUpdate;
97 if(strpos($orig, 'js:')===0) $orig = substr($orig,3);
98 $orig = "\n($orig).apply(this, arguments);";
99 } else {
100 $orig = '';
101 }
102 $this->grid->afterAjaxUpdate = "js: function(id, data) {
103 $trigger $orig
104 }";
105 }
106
107 108 109 110 111
112 protected function isEditable($model)
113 {
114 return $model->isAttributeSafe($this->name) && (!array_key_exists('enabled', $this->editable) || $this->editable['enabled'] === true);
115 }
116 }