public function actionUpdate($class) { FormField::$inEditor = true; $isPHP = Helper::explodeLast(".", $class); $class = $isPHP == "php" ? substr($class, 0, -4) : $class; $class = FormBuilder::classPath($class); $this->layout = "//layouts/blank"; ## reset form builder session FormBuilder::resetSession($class); ## load form builder class and session $fb = FormBuilder::load($class); $fb->resetTimestamp(); $fb->updateExtendsFrom('Blog'); $classPath = $class; $class = Helper::explodeLast(".", $class); if (is_subclass_of($fb->model, 'ActiveRecord')) { $formType = "ActiveRecord"; FormsController::setModelFieldList($class::model()->getAttributesList(), "AR", $class); } else { if (is_subclass_of($fb->model, 'FormField')) { $formType = "FormField"; $mf = new $class(); FormsController::setModelFieldList($mf->attributes, "FF"); } else { if (is_subclass_of($fb->model, 'Form')) { $formType = "Form"; $mf = new $class(); FormsController::setModelFieldList($mf->attributes, "FF"); } } } $fieldData = $fb->fields; FormsController::$modelField = $fieldData; $toolbar = $this->renderAllToolbar($formType); Yii::import('application.modules.' . $fb->module . '.controllers.*'); echo $this->render('form', array('fb' => $fb, 'class' => $class, 'classPath' => $classPath, 'formType' => $formType, 'moduleName' => Helper::explodeFirst(".", $classPath), 'toolbarData' => @$toolbar['data'], 'fieldData' => $fieldData), true); }
/** * load * Fungsi ini digunakan untuk me-load FormBuilder * @param array $class * @param array $findByAttributes * @return mixed me-return null jika class tidak ada, jika ada maka me-return array $model */ public static function load($class, $findByAttributes = []) { if (!is_string($class)) { return null; } $originalClass = $class; if (strpos($class, ".") !== false) { $classFile = FormBuilder::classPath($class); $class = Helper::explodeLast(".", $classFile); try { Yii::import($classFile); } catch (Exception $e) { if (isset(Yii::app()->controller) && isset(Yii::app()->controller->module)) { $basePath = Yii::app()->controller->module->basePath; $classFile = str_replace(".", DIRECTORY_SEPARATOR, $classFile) . ".php"; $classFile = $basePath . DIRECTORY_SEPARATOR . 'forms' . DIRECTORY_SEPARATOR . $classFile; require_once $classFile; } } if (!class_exists($class)) { throw new CException("Class \"{$class}\" does not exists"); } } $model = new FormBuilder(); if (!empty($findByAttributes) && method_exists($class, 'model')) { if (is_subclass_of($class, 'ActiveRecord')) { $model->model = $class::model()->findByAttributes($findByAttributes); if (is_null($model->model)) { $model->model = new $class(); } } } else { $model->model = new $class(); } $model->originalClass = $originalClass; if (!is_null($findByAttributes)) { $model->model->attributes = $findByAttributes; } ## get method line and length if (isset(Yii::app()->session)) { if (is_null(Yii::app()->session['FormBuilder_' . $originalClass])) { $reflector = new ReflectionClass($class); $model->sourceFile = $reflector->getFileName(); $model->file = file($model->sourceFile, FILE_IGNORE_NEW_LINES); $methods = $reflector->getMethods(); foreach ($methods as $m) { if ($m->class == $class) { $line = $m->getStartLine() - 1; $length = $m->getEndLine() - $line; $model->methods[$m->name] = ['line' => $line, 'length' => $length]; } } Yii::app()->session['FormBuilder_' . $originalClass] = ['sourceFile' => $model->sourceFile, 'file' => $model->file, 'methods' => $model->methods]; } else { $s = Yii::app()->session['FormBuilder_' . $originalClass]; $model->sourceFile = $s['sourceFile']; $model->file = $s['file']; $model->methods = $s['methods']; if (isset($s['timestamp'])) { $model->timestamp = $s['timestamp']; } } } return $model; }
/** * render * Fungsi ini untuk me-render field dan atributnya * @return mixed me-return sebuah field dan atribut checkboxlist dari hasil render */ public function render() { $this->addClass('form-group form-group-sm flat', 'options'); $this->addClass($this->layoutClass, 'options'); $this->addClass($this->errorClass, 'options'); $this->fieldOptions['ui-tree-node'] = ''; $this->fieldOptions['ng-repeat'] = 'item in value'; $this->fieldOptions['ng-init'] = 'initItem(value, $index)'; $this->addClass('list-view-item', 'fieldOptions'); Yii::import(FormBuilder::classPath($this->templateForm)); $class = Helper::explodeLast(".", $this->templateForm); if (($this->fieldTemplate == 'form' || $this->fieldTemplate == 'datasource') && class_exists($class)) { $fb = FormBuilder::load($class); $model = new $class(); if ($this->value == "") { $this->value = []; } $this->templateAttributes = $model->attributes; $fb->model = $model; $this->renderTemplateForm = $fb->render($model, ['wrapForm' => false]); } else { if ($this->fieldTemplate == 'default') { $field = new $this->singleView(); $field->attributes = $this->singleViewOption; $field->renderID = $this->name . rand(0, 10000); $field->builder = $this->builder; $field->formProperties = $this->formProperties; $this->templateAttributes = ['val' => '']; $this->renderTemplateForm = $field->render(); } } $this->setDefaultOption('ng-model', "model.{$this->originalName}", $this->options); $jspath = explode(".", FormBuilder::classPath($this->templateForm)); array_pop($jspath); $jspath = implode(".", $jspath); $inlineJS = str_replace("/", DIRECTORY_SEPARATOR, trim($this->inlineJS, "/")); $inlineJS = Yii::getPathOfAlias($jspath) . DIRECTORY_SEPARATOR . $inlineJS; if (is_file($inlineJS)) { $inlineJS = file_get_contents($inlineJS); } else { $inlineJS = ''; } return $this->renderInternal('template_render.php', ['inlineJS' => $inlineJS]); }