HCE Project DC service web UI  0.2
Hierarchical Cluster Engine DC service web UI
 All Classes Namespaces Files Functions Variables Pages
ProfileFieldController.php
Go to the documentation of this file.
1 <?php
2 
4 {
8  private $_model;
9  private static $_widgets = array();
10  public $defaultAction = 'admin';
11  public $layout = '//layouts/column2';
12 
16  public function filters()
17  {
18  return CMap::mergeArray(parent::filters(), array(
19  'accessControl', // perform access control for CRUD operations
20  ));
21  }
22 
29  public function accessRules()
30  {
31  return array(
32  array('allow', // allow all users to perform 'index' and 'view' actions
33  'actions' => array('*'),
34  'users' => array('*'),
35  ),
36  array('allow', // allow admin user to perform 'admin' and 'delete' actions
37  'actions' => array('create','update','view','admin','delete'),
38  'users' => UserModule::getAdmins(),
39  ),
40  array('deny', // deny all users
41  'users' => array('*'),
42  ),
43  );
44  }
45 
49  public function actionView()
50  {
51  $this->render('view', array(
52  'model' => $this->loadModel(),
53  ));
54  }
55 
59  public function registerScript()
60  {
61  $basePath = Yii::getPathOfAlias('application.modules.user.views.asset');
62  $baseUrl = Yii::app()->getAssetManager()->publish($basePath);
63  $cs = Yii::app()->getClientScript();
64  $cs->registerCoreScript('jquery');
65  $cs->registerCssFile($baseUrl.'/css/redmond/jquery-ui.css');
66  $cs->registerCssFile($baseUrl.'/css/style.css');
67  $cs->registerScriptFile($baseUrl.'/js/jquery-ui.min.js');
68  $cs->registerScriptFile($baseUrl.'/js/form.js');
69  $cs->registerScriptFile($baseUrl.'/js/jquery.json.js');
70 
71  $widgets = self::getWidgets();
72 
73  $wgByTypes = ProfileField::itemAlias('field_type');
74  foreach ($wgByTypes as $k => $v) {
75  $wgByTypes[$k] = array();
76  }
77 
78  foreach ($widgets[1] as $widget) {
79  if (isset($widget['fieldType']) && count($widget['fieldType'])) {
80  foreach ($widget['fieldType'] as $type) {
81  array_push($wgByTypes[$type], $widget['name']);
82  }
83  }
84  }
85  //echo '<pre>'; print_r($widgets[1]); die();
86  $js = "
87 
88  var name = $('#name'),
89  value = $('#value'),
90  allFields = $([]).add(name).add(value),
91  tips = $('.validateTips');
92 
93  var listWidgets = jQuery.parseJSON('".str_replace("'", "\'", CJavaScript::jsonEncode($widgets[0]))."');
94  var widgets = jQuery.parseJSON('".str_replace("'", "\'", CJavaScript::jsonEncode($widgets[1]))."');
95  var wgByType = jQuery.parseJSON('".str_replace("'", "\'", CJavaScript::jsonEncode($wgByTypes))."');
96 
97  var fieldType = {
98  'INTEGER':{
99  'hide':['match','other_validator','widgetparams'],
100  'val':{
101  'field_size':10,
102  'default':'0',
103  'range':'',
104  'widgetparams':''
105  }
106  },
107  'VARCHAR':{
108  'hide':['widgetparams'],
109  'val':{
110  'field_size':255,
111  'default':'',
112  'range':'',
113  'widgetparams':''
114  }
115  },
116  'TEXT':{
117  'hide':['field_size','range','widgetparams'],
118  'val':{
119  'field_size':0,
120  'default':'',
121  'range':'',
122  'widgetparams':''
123  }
124  },
125  'DATE':{
126  'hide':['field_size','field_size_min','match','range','widgetparams'],
127  'val':{
128  'field_size':0,
129  'default':'0000-00-00',
130  'range':'',
131  'widgetparams':''
132  }
133  },
134  'FLOAT':{
135  'hide':['match','other_validator','widgetparams'],
136  'val':{
137  'field_size':'10.2',
138  'default':'0.00',
139  'range':'',
140  'widgetparams':''
141  }
142  },
143  'DECIMAL':{
144  'hide':['match','other_validator','widgetparams'],
145  'val':{
146  'field_size':'10,2',
147  'default':'0',
148  'range':'',
149  'widgetparams':''
150  }
151  },
152  'BOOL':{
153  'hide':['field_size','field_size_min','match','widgetparams'],
154  'val':{
155  'field_size':0,
156  'default':0,
157  'range':'1==".UserModule::t('Yes').";0==".UserModule::t('No')."',
158  'widgetparams':''
159  }
160  },
161  'BLOB':{
162  'hide':['field_size','field_size_min','match','widgetparams'],
163  'val':{
164  'field_size':0,
165  'default':'',
166  'range':'',
167  'widgetparams':''
168  }
169  },
170  'BINARY':{
171  'hide':['field_size','field_size_min','match','widgetparams'],
172  'val':{
173  'field_size':0,
174  'default':'',
175  'range':'',
176  'widgetparams':''
177  }
178  }
179  };
180 
181  function showWidgetList(type) {
182  $('div.widget select').empty();
183  $('div.widget select').append('<option value=\"\">".UserModule::t('No')."</option>');
184  if (wgByType[type]) {
185  for (var k in wgByType[type]) {
186  $('div.widget select').append('<option value=\"'+wgByType[type][k]+'\">'+widgets[wgByType[type][k]]['label']+'</option>');
187  }
188  }
189  }
190 
191  function setFields(type) {
192  if (fieldType[type]) {
193  if (".((isset($_GET['id'])) ? 0 : 1).") {
194  showWidgetList(type);
195  $('#widgetlist option:first').attr('selected', 'selected');
196  }
197 
198  $('div.row').addClass('toshow').removeClass('tohide');
199  if (fieldType[type].hide.length) $('div.'+fieldType[type].hide.join(', div.')).addClass('tohide').removeClass('toshow');
200  if ($('div.widget select').val()) {
201  $('div.widgetparams').removeClass('tohide');
202  }
203  $('div.toshow').show(500);
204  $('div.tohide').hide(500);
205  ".((!isset($_GET['id'])) ? "
206  for (var k in fieldType[type].val) {
207  $('div.'+k+' input').val(fieldType[type].val[k]);
208  }" : '')."
209  }
210  }
211 
212  function isArray(obj) {
213  if (obj.constructor.toString().indexOf('Array') == -1)
214  return false;
215  else
216  return true;
217  }
218 
219  $('#dialog-form').dialog({
220  autoOpen: false,
221  height: 400,
222  width: 400,
223  modal: true,
224  buttons: {
225  '".UserModule::t('Save')."': function() {
226  var wparam = {};
227  var fparam = {};
228  $('#dialog-form fieldset .wparam').each(function(){
229  if ($(this).val()) wparam[$(this).attr('name')] = $(this).val();
230  });
231 
232  var tab = $('#tabs ul li.ui-tabs-selected').text();
233  fparam[tab] = {};
234  $('#dialog-form fieldset .tab-'+tab).each(function(){
235  if ($(this).val()) fparam[tab][$(this).attr('name')] = $(this).val();
236  });
237 
238  if ($.JSON.encode(wparam)!='{}') $('div.widgetparams input').val($.JSON.encode(wparam));
239  if ($.JSON.encode(fparam[tab])!='{}') $('div.other_validator input').val($.JSON.encode(fparam));
240 
241  $(this).dialog('close');
242  },
243  '".UserModule::t('Cancel')."': function() {
244  $(this).dialog('close');
245  }
246  },
247  close: function() {
248  }
249  });
250 
251 
252  $('#widgetparams').focus(function() {
253  var widget = widgets[$('#widgetlist').val()];
254  var html = '';
255  var wparam = ($('div.widgetparams input').val())?$.JSON.decode($('div.widgetparams input').val()):{};
256  var fparam = ($('div.other_validator input').val())?$.JSON.decode($('div.other_validator input').val()):{};
257 
258  // Class params
259  for (var k in widget.params) {
260  html += '<label for=\"name\">'+((widget.paramsLabels[k])?widget.paramsLabels[k]:k)+'</label>';
261  html += '<input type=\"text\" name=\"'+k+'\" id=\"widget_'+k+'\" class=\"text wparam ui-widget-content ui-corner-all\" value=\"'+((wparam[k])?wparam[k]:widget.params[k])+'\" />';
262  }
263  // Validator params
264  if (widget.other_validator) {
265  var tabs = '';
266  var li = '';
267  for (var t in widget.other_validator) {
268  tabs += '<div id=\"tab-'+t+'\" class=\"tab\">';
269  li += '<li'+((fparam[t])?' class=\"ui-tabs-selected\"':'')+'><a href=\"#tab-'+t+'\">'+t+'</a></li>';
270 
271  for (var k in widget.other_validator[t]) {
272  tabs += '<label for=\"name\">'+((widget.paramsLabels[k])?widget.paramsLabels[k]:k)+'</label>';
273  if (isArray(widget.other_validator[t][k])) {
274  tabs += '<select type=\"text\" name=\"'+k+'\" id=\"filter_'+k+'\" class=\"text fparam ui-widget-content ui-corner-all tab-'+t+'\">';
275  for (var i in widget.other_validator[t][k]) {
276  tabs += '<option value=\"'+widget.other_validator[t][k][i]+'\"'+((fparam[t]&&fparam[t][k])?' selected=\"selected\"':'')+'>'+widget.other_validator[t][k][i]+'</option>';
277  }
278  tabs += '</select>';
279  } else {
280  tabs += '<input type=\"text\" name=\"'+k+'\" id=\"filter_'+k+'\" class=\"text fparam ui-widget-content ui-corner-all tab-'+t+'\" value=\"'+((fparam[t]&&fparam[t][k])?fparam[t][k]:widget.other_validator[t][k])+'\" />';
281  }
282  }
283  tabs += '</div>';
284  }
285  html += '<div id=\"tabs\"><ul>'+li+'</ul>'+tabs+'</div>';
286  }
287 
288  $('#dialog-form fieldset').html(html);
289 
290  $('#tabs').tabs();
291 
292  // Show form
293  $('#dialog-form').dialog('open');
294  });
295 
296  $('#field_type').change(function() {
297  setFields($(this).val());
298  });
299 
300  $('#widgetlist').change(function() {
301  if ($(this).val()) {
302  $('div.widgetparams').show(500);
303  } else {
304  $('div.widgetparams').hide(500);
305  }
306 
307  });
308 
309  // show all function
310  $('div.form p.note').append('<br/><a href=\"#\" id=\"showAll\">".UserModule::t('Show all')."</a>');
311  $('#showAll').click(function(){
312  $('div.row').show(500);
313  return false;
314  });
315 
316  // init
317  setFields($('#field_type').val());
318 
319  ";
320  $cs->registerScript(__CLASS__.'#dialog', $js);
321  }
322 
327  public function actionCreate()
328  {
329  $model = new ProfileField();
330  $scheme = get_class(Yii::app()->db->schema);
331  if (isset($_POST['ProfileField'])) {
332  $model->attributes = $_POST['ProfileField'];
333 
334  if ($model->validate()) {
335  $sql = 'ALTER TABLE '.Profile::model()->tableName().' ADD `'.$model->varname.'` ';
336  $sql .= $this->fieldType($model->field_type);
337  if (
338  $model->field_type != 'TEXT'
339  && $model->field_type != 'DATE'
340  && $model->field_type != 'BOOL'
341  && $model->field_type != 'BLOB'
342  && $model->field_type != 'BINARY'
343  ) {
344  $sql .= '('.$model->field_size.')';
345  }
346  $sql .= ' NOT NULL ';
347 
348  if ($model->field_type != 'TEXT' && $model->field_type != 'BLOB' || $scheme != 'CMysqlSchema') {
349  if ($model->default) {
350  $sql .= " DEFAULT '".$model->default."'";
351  } else {
352  $sql .= ((
353  $model->field_type == 'TEXT'
354  || $model->field_type == 'VARCHAR'
355  || $model->field_type == 'BLOB'
356  || $model->field_type == 'BINARY'
357  ) ? " DEFAULT ''" : (($model->field_type == 'DATE') ? " DEFAULT '0000-00-00'" : " DEFAULT 0"));
358  }
359  }
360  $model->dbConnection->createCommand($sql)->execute();
361  $model->save();
362  $this->redirect(array('view', 'id' => $model->id));
363  }
364  }
365 
366  $this->registerScript();
367  $this->render('create', array(
368  'model' => $model,
369  ));
370  }
371 
376  public function actionUpdate()
377  {
378  $model = $this->loadModel();
379  if (isset($_POST['ProfileField'])) {
380  $model->attributes = $_POST['ProfileField'];
381  if ($model->save()) {
382  $this->redirect(array('view', 'id' => $model->id));
383  }
384  }
385  $this->registerScript();
386 
387  $this->render('update', array(
388  'model' => $model,
389  ));
390  }
391 
396  public function actionDelete()
397  {
398  if (Yii::app()->request->isPostRequest) {
399  // we only allow deletion via POST request
400  $scheme = get_class(Yii::app()->db->schema);
401  $model = $this->loadModel();
402  if ($scheme == 'CSqliteSchema') {
403  $attr = Profile::model()->attributes;
404  unset($attr[$model->varname]);
405  $attr = array_keys($attr);
406  $connection = Yii::app()->db;
407  $transaction = $connection->beginTransaction();
408  $status = true;
409  try {
410  $sql = '';
411  $connection->createCommand(
412  "CREATE TEMPORARY TABLE ".Profile::model()->tableName()."_backup (".implode(',', $attr).")"
413  )->execute();
414 
415  $connection->createCommand(
416  "INSERT INTO ".Profile::model()->tableName()."_backup SELECT ".implode(',', $attr)." FROM ".Profile::model()->tableName()
417  )->execute();
418 
419  $connection->createCommand(
420  "DROP TABLE ".Profile::model()->tableName()
421  )->execute();
422 
423  $connection->createCommand(
424  "CREATE TABLE ".Profile::model()->tableName()." (".implode(',', $attr).")"
425  )->execute();
426 
427  $connection->createCommand(
428  "INSERT INTO ".Profile::model()->tableName()." SELECT ".implode(',', $attr)." FROM ".Profile::model()->tableName()."_backup"
429  )->execute();
430 
431  $connection->createCommand(
432  "DROP TABLE ".Profile::model()->tableName()."_backup"
433  )->execute();
434 
435  $transaction->commit();
436  } catch (Exception $e) {
437  $transaction->rollBack();
438  $status = false;
439  }
440  if ($status) {
441  $model->delete();
442  }
443  } else {
444  $sql = 'ALTER TABLE '.Profile::model()->tableName().' DROP `'.$model->varname.'`';
445  if ($model->dbConnection->createCommand($sql)->execute()) {
446  $model->delete();
447  }
448  }
449 
450  // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
451  if (!isset($_POST['ajax'])) {
452  $this->redirect(array('admin'));
453  }
454  } else {
455  throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
456  }
457  }
458 
462  public function actionAdmin()
463  {
464  $model = new ProfileField('search');
465  $model->unsetAttributes(); // clear any default values
466  if (isset($_GET['ProfileField'])) {
467  $model->attributes = $_GET['ProfileField'];
468  }
469 
470  $this->render('admin', array(
471  'model' => $model,
472  ));
473  /*
474  $dataProvider=new CActiveDataProvider('ProfileField', array(
475  'pagination'=>array(
476  'pageSize'=>Yii::app()->controller->module->fields_page_size,
477  ),
478  'sort'=>array(
479  'defaultOrder'=>'position',
480  ),
481  ));
482 
483  $this->render('admin',array(
484  'dataProvider'=>$dataProvider,
485  ));//*/
486  }
487 
492  public function loadModel()
493  {
494  if ($this->_model === null) {
495  if (isset($_GET['id'])) {
496  $this->_model = ProfileField::model()->findbyPk($_GET['id']);
497  }
498  if ($this->_model === null) {
499  throw new CHttpException(404, 'The requested page does not exist.');
500  }
501  }
502 
503  return $this->_model;
504  }
505 
513  public function fieldType($type)
514  {
515  $type = str_replace('UNIX-DATE', 'INTEGER', $type);
516 
517  return $type;
518  }
519 
520  public static function getWidgets($fieldType = '')
521  {
522  $basePath = Yii::getPathOfAlias('application.modules.user.components');
523  $widgets = array();
524  $list = array('' => UserModule::t('No'));
525  if (self::$_widgets) {
526  $widgets = self::$_widgets;
527  } else {
528  $d = dir($basePath);
529  while (false !== ($file = $d->read())) {
530  if (strpos($file, 'UW') === 0) {
531  list($className) = explode('.', $file);
532  if (class_exists($className)) {
533  $widgetClass = new $className();
534  if ($widgetClass->init()) {
535  $widgets[$className] = $widgetClass->init();
536  if ($fieldType) {
537  if (in_array($fieldType, $widgets[$className]['fieldType'])) {
538  $list[$className] = $widgets[$className]['label'];
539  }
540  } else {
541  $list[$className] = $widgets[$className]['label'];
542  }
543  }
544  }
545  }
546  }
547  $d->close();
548  }
549 
550  return array($list,$widgets);
551  }
552 
558  protected function performAjaxValidation($model)
559  {
560  if (isset($_POST['ajax']) && $_POST['ajax'] === 'profile-field-form') {
561  echo CActiveForm::validate($model);
562  Yii::app()->end();
563  }
564  }
565 }