Exemplo n.º 1
0
 /**
 * 
 $criteria =  new CDbCriteria();
 $criteria->condition = "id = 1 or id =1";
 $node = Node::find('post',$criteria); 
 Node::find('post',1); 
 */
 static function find($table, $criteria, $pager = false, $pageSize = 10)
 {
     if (!is_object($criteria)) {
         $id = $criteria;
     }
     //所以字段key以及对应的model
     $cache = cache('node__field_table');
     $now = $cache[$table];
     $realTable = "field_" . $table;
     //设置NodeModel的表名
     NodeModel::$_table = $realTable;
     $t = new NodeModel();
     $t->refreshMetaData();
     if (is_object($criteria)) {
         if (true === $pager) {
             $count = NodeModel::model()->count($criteria);
             $pages = new CPagination($count);
             $pages->pageSize = $pageSize;
             $pages->applyLimit($criteria);
         }
         $posts = NodeModel::model()->findAll($criteria);
         if (!$posts) {
             return null;
         }
         foreach ($posts as $r) {
             $allRows[] = static::find($table, $r->id);
         }
         if (true === $pager) {
             $out = array('posts' => $allRows, 'pages' => $pages);
             return $out;
         }
         if ($criteria->limit == 1) {
             return ArrHelper::first($allRows);
         }
         return $allRows;
     }
     $fields = cache('node__content_field');
     if (!fields) {
         return null;
     }
     $rows = NodeModel::model()->findByPk($id);
     foreach ($fields[$table] as $k => $v) {
         $row[$k] = $rows->{$k};
     }
     //没有缓存是有问题的
     if (!$cache) {
         return $row;
     }
     foreach ($now as $k => $v) {
         $name = trim($v->name);
         $_relation_table = $realTable . "_" . $name;
         //真实的第三方表的内容
         $deep = $v->_relation_table;
         //是多个值的,并且是关联其他表的情况
         if ($v->relation && $v->mvalue == 1) {
             $allR = CDB()->from($_relation_table)->where('nid=:nid', array(':nid' => $id))->queryAll();
             if ($allR) {
                 foreach ($allR as $key => $al) {
                     $value = $al['value'];
                     $values = CDB()->from($deep)->where('id=:id', array(':id' => $value))->queryRow();
                     $all[$name][$value] = $values;
                 }
                 foreach ($all as $key => $value) {
                     $row[$key] = $value;
                 }
             }
         } else {
             if ($v->relation) {
                 $value = CDB()->from($deep)->where('id=:id', array(':id' => $row[$name]))->queryRow();
                 $row[$name] = $value;
             }
         }
     }
     return $row;
 }
Exemplo n.º 2
0
echo CHtml::submitButton($model->isNewRecord ? __('create') : __('save'), array('class' => 'btn btn-primary'));
?>
	</div>

<?php 
$this->endWidget();
?>
	
<?php 
/**
* 字段类型 使用AJAX
* 数据库表名及字段名
*/
$rows = CDB('SHOW TABLES')->queryAll();
foreach ($rows as $v) {
    $mysql_table = ArrHelper::first($v);
    if (in_array($mysql_table, array('node_field', 'node_content'))) {
        continue;
    }
    $row = CDB("SHOW  COLUMNS FROM  {$mysql_table}")->queryAll();
    foreach ($row as $k) {
        $f = $k['Field'];
        if (!in_array($f, array('uid', 'created', 'id', 'updated', 'language_id', 'vid', 'sort', 'display')) && strpos($f, 'id') === false) {
            $ajax_str .= "'" . $mysql_table . '.' . $f . "',";
        }
    }
}
$ajax_str = substr($ajax_str, 0, -1);
/**
* ajax 自动完成的验证规则
*/
Exemplo n.º 3
0
 function run()
 {
     $this->db = Yii::app()->db->createCommand();
     //取得文件完整路径
     $file = Yii::getPathOfAlias($this->config) . '.php';
     //取得文件配置信息
     $row = self::loadFile($file);
     $this->model = new AutoModel();
     //验证规则
     $this->model->rules = $row['_rules'];
     $_AutoModel = $row['_AutoModel'];
     //关联表的表名
     $this->relation_table = $row['_relation_table'];
     $_config = cache('config');
     if (!$_config['mlanguage']) {
         unset($row['_multiLanguage'], $row['language_id']);
     }
     //判断是不是启用了多语言
     $this->_multiLanguage = $_multiLanguage = $row['_multiLanguage'];
     $data['error'] = $row['_error'];
     unset($row['_rules'], $row['_error'], $row['_AutoModel'], $row['_multiLanguage'], $row['_relation_table']);
     $this->row = $row;
     if (!$this->table) {
         //取得数据库的名称
         $this->table = substr($this->config, strrpos($this->config, '.') + 1);
     }
     //判断是否是更新
     if (true === $this->save) {
         $id = (int) $this->id;
         if ($id) {
             $dbRow = $this->db->from($this->table)->where('id=:id', array(':id' => $id))->queryRow();
             if ($dbRow) {
                 $this->update = true;
                 $node_id = $dbRow['id'];
                 //取数据库中原来的UUID
                 $uuid = $dbRow['uuid'];
                 foreach ($row as $key => $value) {
                     $row[$key]['value'] = $dbRow[$key];
                     $this->model->{$key} = $dbRow[$key];
                 }
                 /**
                  * 取得关联表的值
                  */
                 if ($this->relation_table) {
                     // key是字段名 ,value是表名
                     foreach ($this->relation_table as $key => $value) {
                         $allR = CDB()->from($value)->where('nid=:nid', array(':nid' => $node_id))->queryAll();
                         if ($allR) {
                             foreach ($allR as $al) {
                                 $all[$key][] = $al['value'];
                             }
                             foreach ($all as $k => $v) {
                                 $_POST['Field'][$k] = $v;
                             }
                         }
                     }
                 }
             }
         }
         //设置模型对应的属性,供自动翻译多语言
         $this->model->set_attrs($row);
         $fixVid = null;
         //启用多语言判断,多语言一定是有VID的
         if (true === $_multiLanguage) {
             if ($dbRow['vid'] && $dbRow['language_id'] != trim($_POST['AutoModel']['language_id'])) {
                 $fixVid = $dbRow['vid'];
             }
             $vid = $dbRow['vid'];
             /**
              * 已经存在的多语言记录
              */
             $all = Yii::app()->db->createCommand()->from($this->table)->where("vid=:vid", array(':vid' => $dbRow['vid']))->queryAll();
             foreach ($all as $al) {
                 $muitLang[$al['language_id']] = $al['id'];
             }
         }
         if (isset($_POST['AutoModel'])) {
             //关联到其他表的值
             $NodeField = $_POST['NodeField'];
             if ($NodeField) {
                 foreach ($NodeField as $key => $value) {
                     //关联表名
                     $rale = $this->relation_table[$key];
                     //用来保存到数据库的
                     $relation_datas[$rale] = $value;
                 }
             }
             //对AutoModel属性赋值
             foreach ($row as $key => $value) {
                 $postV = $_POST['AutoModel'][$key];
                 //判断是否是多值
                 if ($NodeField[$key]['mvalue'] != 1 && is_array($postV)) {
                     $postV = ArrHelper::first($postV);
                 } elseif (is_array($postV)) {
                     $postV = serialize($postV);
                 }
                 //当字段配置中 insert 值为false时不写入主表
                 if ($value['insert'] === false) {
                     continue;
                 }
                 $this->model->{$key} = trim($postV);
                 $saveDatas[$key] = trim($postV);
             }
             //验证规则
             if ($this->model->validate()) {
                 $column = cache('DBColumns_' . $this->table);
                 if (!$column) {
                     $columns = Yii::app()->db->createCommand("SHOW  COLUMNS FROM  `" . $this->table . "`")->queryAll();
                     foreach ($columns as $c) {
                         $column[$c['Field']] = $c['Field'];
                     }
                 }
                 /**
                  * 自动加载 application.components.AutoModel 下的文件
                  */
                 $insertDatas = array();
                 $updateDatas = array();
                 if ($_AutoModel) {
                     foreach ($_AutoModel as $AutoModel) {
                         $AutoModel = $AutoModel . 'AutoModel';
                         Yii::import("application.components.AutoModel.{$AutoModel}");
                         $objModel = new $AutoModel();
                         if (method_exists($AutoModel, 'insert')) {
                             $insertDatas += $objModel->insert($saveDatas);
                         }
                         if (method_exists($AutoModel, 'update')) {
                             $updateDatas += $objModel->update($saveDatas);
                         }
                         if (method_exists($AutoModel, 'after')) {
                             $after[] = $objModel;
                         }
                         /**
                          * 判断字段是否存在
                          */
                         if (is_array($objModel->fields)) {
                             foreach ($objModel->fields as $v) {
                                 if (!$column[$v]) {
                                     unset($insertDatas[$v], $updateDatas[$v]);
                                 }
                             }
                         } else {
                             $v = $objModel->fields;
                             if (!$column[$v]) {
                                 unset($insertDatas[$v], $updateDatas[$v]);
                             }
                         }
                     }
                 }
                 //如果不是更新,将取AUTOMODEL里面的UUID值
                 if (!$uuid) {
                     $uuid = $insertDatas['uuid'];
                 }
                 if (true === $this->update) {
                     /**
                      * 判断更新需要操作的字段
                      */
                     if ($fixVid) {
                         $updateDatas['vid'] = $fixVid;
                     }
                     if ($updateDatas) {
                         foreach ($updateDatas as $_k => $_v) {
                             $saveDatas[$_k] = $_v;
                         }
                     }
                     if ($fixVid) {
                         if (!$this->db->from($this->table)->where('vid=' . $fixVid . ' and language_id=' . $saveDatas['language_id'])->queryRow()) {
                             $this->db->insert($this->table, $saveDatas);
                         } else {
                             unset($saveDatas['vid']);
                             $this->db->update($this->table, $saveDatas, 'id=:id', array(':id' => $id));
                         }
                     } else {
                         unset($saveDatas['vid']);
                         $this->db->update($this->table, $saveDatas, 'id=:id', array(':id' => $id));
                     }
                 } else {
                     /**
                      * 判断写入需要操作的字段
                      */
                     if ($insertDatas) {
                         foreach ($insertDatas as $_k => $_v) {
                             $saveDatas[$_k] = $_v;
                         }
                     }
                     $this->db->insert($this->table, $saveDatas);
                 }
                 //写入主表完成,写入关联表
                 if ($relation_datas) {
                     /**
                      * 当没有node_id 时,也就是新建操作时,将查寻一次数据库取得node_id的值
                      */
                     if (!$node_id) {
                         $row = $this->db->from($this->table)->where('uuid=:uuid', array(':uuid' => $uuid))->queryRow();
                         $node_id = $dbRow['id'];
                     }
                     foreach ($relation_datas as $RT => $volist) {
                         CDB()->delete($RT, 'nid=:nid', array(':nid' => $node_id));
                         foreach ($volist as $vo) {
                             CDB()->insert($RT, array('nid' => $node_id, 'value' => $vo));
                         }
                     }
                 }
                 //所以操作后
                 if ($after) {
                     foreach ($after as $af) {
                         $af->after($this->db, $this->table, $data, $id);
                     }
                 }
                 if (true === $_multiLanguage) {
                     cache('language_' . $this->table . $vid, false);
                 }
                 flash('success', __('success'));
                 $this->controller->refresh();
             }
         }
         if (!$this->editUrl) {
             $this->editUrl = $this->controller->module->id . '/' . $this->controller->id . '/update';
         }
         if (!$this->createUrl) {
             $this->createUrl = $this->controller->module->id . '/' . $this->controller->id . '/create';
         }
         $data['model'] = $this->model;
         $data['row'] = $row;
         $data['multiLanguage'] = $this->_multiLanguage;
         $data['muitLang'] = $muitLang;
         $data['createUrl'] = $this->createUrl;
         $data['editUrl'] = $this->editUrl;
         $this->render('BuilderView', $data);
     }
 }