1 <?php
2 3 4 5 6 7 8 9
10
11 Yii::import('zii.widgets.jui.CJuiInputWidget');
12
13 14 15 16 17 18 19 20 21 22 23 24
25 class JuiJSONEditorInput extends CJuiInputWidget
26 {
27 28 29 30 31 32
33 public $cssFile;
34
35 36 37
38 public $data = '{}';
39
40 41 42
43 public $rootNodeName = 'root';
44
45 46 47
48 public $inputButtonLabel = 'Switch to text input';
49
50 51 52
53 public $initButtonLabel = 'Switch to JSON editor';
54
55 public function init()
56 {
57 list($name, $id) = $this->resolveNameID();
58
59 if(isset($this->htmlOptions['id']))
60 $id=$this->htmlOptions['id'];
61 else
62 $this->htmlOptions['id']=$id;
63
64 if(isset($this->htmlOptions['name']))
65 $name=$this->htmlOptions['name'];
66 else
67 $this->htmlOptions['name']=$name;
68
69 if(!isset($this->htmlOptions['style']))
70 $this->htmlOptions['style'] = 'border:solid 2px #ccc; width:100%;';
71
72 if($this->hasModel() && is_string($this->model->{$this->attribute}))
73 {
74 $this->data = $this->model->{$this->attribute};
75 }
76
77 $this->registerClientScript();
78 }
79
80 public function run()
81 {
82 echo CHtml::button($this->inputButtonLabel, array(
83 'onclick'=>"jQuery(\"#{$this->htmlOptions['id']}\").jsoneditor('input')"
84 ));
85 echo CHtml::button($this->initButtonLabel, array(
86 'onclick'=>"jQuery(\"#{$this->htmlOptions['id']}\").jsoneditor('init');"
87 ));
88 echo CHtml::tag('div', $this->htmlOptions, "");
89 }
90
91 public function registerClientScript()
92 {
93 $cs=Yii::app()->getClientScript();
94 $url = Yii::app()->getAssetManager()->publish(dirname(__FILE__).DIRECTORY_SEPARATOR.'lib');
95
96 $name = $this->htmlOptions['name'];
97 $id = $this->htmlOptions['id'];
98
99 $cs->registerScriptFile($url.'/jquery.json-2.2.min.js');
100 $cs->registerScriptFile($url.'/jquery.jsoneditor.js');
101
102 if($this->cssFile===null)
103 $cs->registerCssFile($url.'/jsoneditor.css');
104 else if($this->cssFile!==false)
105 $cs->registerCssFile($this->cssFile);
106
107 $cs->registerScript(
108 'JuiJSONEditorInput#'.$id,
109 "jQuery(\"#{$id}\").jsoneditor('init', {root:'{$this->rootNodeName}', data:{$this->data}});"
110 );
111
112 $cs->registerScript(
113 'JuiJSONEditorInput-form#'.$id,
114 "
115 jQuery(\"#{$id}\").parents('form:last').submit(function(){
116 var obj = jQuery(\"#{$id}\");
117
118 obj.jsoneditor('input');
119 obj.children('textarea').attr('name', '{$name}');
120 });
121 "
122 );
123 }
124 }
125