CJuiWidget.php
5.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
/**
* CJuiWidget class file.
*
* @author Sebastian Thierer <sebathi@gmail.com>
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008-2011 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
/**
* This is the base class for all JUI widget classes.
*
* @author Sebastian Thierer <sebathi@gmail.com>
* @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id$
* @package zii.widgets.jui
* @since 1.1
*/
abstract class CJuiWidget extends CWidget
{
/**
* @var string the root URL that contains all JUI JavaScript files.
* If this property is not set (default), Yii will publish the JUI package included in the zii release and use
* that to infer the root script URL. You should set this property if you intend to use
* a JUI package whose version is different from the one included in zii.
* Note that under this URL, there must be a file whose name is specified by {@link scriptFile}.
* Do not append any slash character to the URL.
*/
public $scriptUrl;
/**
* @var string the root URL that contains all JUI theme folders.
* If this property is not set (default), Yii will publish the JUI package included in the zii release and use
* that to infer the root theme URL. You should set this property if you intend to use
* a theme that is not found in the JUI package included in zii.
* Note that under this URL, there must be a directory whose name is specified by {@link theme}.
* Do not append any slash character to the URL.
*/
public $themeUrl;
/**
* @var string the JUI theme name. Defaults to 'base'. Make sure that under {@link themeUrl} there
* is a directory whose name is the same as this property value (case-sensitive).
*/
public $theme='base';
/**
* @var mixed the main JUI JavaScript file. Defaults to 'jquery-ui.min.js'.
* Note the file must exist under the URL specified by {@link scriptUrl}.
* If you need to include multiple script files (e.g. during development, you want to include individual
* plugin script files rather than the minized JUI script file), you may set this property
* as an array of the script file names.
* This property can also be set as false, which means the widget will not include any script file,
* and it is your responsibility to explicitly include it somewhere else.
*/
public $scriptFile='jquery-ui.min.js';
/**
* @var mixed the theme CSS file name. Defaults to 'jquery-ui.css'.
* Note the file must exist under the URL specified by {@link themeUrl}/{@link theme}.
* If you need to include multiple theme CSS files (e.g. during development, you want to include individual
* plugin CSS files), you may set this property as an array of the CSS file names.
* This property can also be set as false, which means the widget will not include any theme CSS file,
* and it is your responsibility to explicitly include it somewhere else.
*/
public $cssFile='jquery-ui.css';
/**
* @var array the initial JavaScript options that should be passed to the JUI plugin.
*/
public $options=array();
/**
* @var array the HTML attributes that should be rendered in the HTML tag representing the JUI widget.
*/
public $htmlOptions=array();
/**
* Initializes the widget.
* This method will publish JUI assets if necessary.
* It will also register jquery and JUI JavaScript files and the theme CSS file.
* If you override this method, make sure you call the parent implementation first.
*/
public function init()
{
$this->resolvePackagePath();
$this->registerCoreScripts();
parent::init();
}
/**
* Determine the JUI package installation path.
* This method will identify the JavaScript root URL and theme root URL.
* If they are not explicitly specified, it will publish the included JUI package
* and use that to resolve the needed paths.
*/
protected function resolvePackagePath()
{
if($this->scriptUrl===null || $this->themeUrl===null)
{
$cs=Yii::app()->getClientScript();
if($this->scriptUrl===null)
$this->scriptUrl=$cs->getCoreScriptUrl().'/jui/js';
if($this->themeUrl===null)
$this->themeUrl=$cs->getCoreScriptUrl().'/jui/css';
}
}
/**
* Registers the core script files.
* This method registers jquery and JUI JavaScript files and the theme CSS file.
*/
protected function registerCoreScripts()
{
$cs=Yii::app()->getClientScript();
if(is_string($this->cssFile))
$cs->registerCssFile($this->themeUrl.'/'.$this->theme.'/'.$this->cssFile);
else if(is_array($this->cssFile))
{
foreach($this->cssFile as $cssFile)
$cs->registerCssFile($this->themeUrl.'/'.$this->theme.'/'.$cssFile);
}
$cs->registerCoreScript('jquery');
if(is_string($this->scriptFile))
$this->registerScriptFile($this->scriptFile);
else if(is_array($this->scriptFile))
{
foreach($this->scriptFile as $scriptFile)
$this->registerScriptFile($scriptFile);
}
}
/**
* Registers a JavaScript file under {@link scriptUrl}.
* Note that by default, the script file will be rendered at the end of a page to improve page loading speed.
* @param string $fileName JavaScript file name
* @param integer $position the position of the JavaScript file. Valid values include the following:
* <ul>
* <li>CClientScript::POS_HEAD : the script is inserted in the head section right before the title element.</li>
* <li>CClientScript::POS_BEGIN : the script is inserted at the beginning of the body section.</li>
* <li>CClientScript::POS_END : the script is inserted at the end of the body section.</li>
* </ul>
*/
protected function registerScriptFile($fileName,$position=CClientScript::POS_END)
{
Yii::app()->getClientScript()->registerScriptFile($this->scriptUrl.'/'.$fileName,$position);
}
}