<?php namespace Phpcmf\Model;
class Field extends \Phpcmf\Model
{
public $data;
public $func;
public $relatedid;
public $relatedname;
public function get_table_name($siteid, $field) {
$table = '';
list($case_name, $a) = explode('-', $field['relatedname']);
switch ($case_name) {
case 'form':
list($a, $siteid) = explode('-', $this->relatedname);
$data = $this->table($siteid.'_form')->get($this->relatedid);
if (!$data) {
return;
}
$table = $field['ismain'] ? $siteid.'_form_'.$data['table'] : $siteid.'_form_'.$data['table'].'_data_{tableid}';
break;
case 'tag':
$table = $field['relatedid'].'_tag';
break;
case 'linkage':
$table = 'linkage_data_'.$field['relatedid'];
break;
case 'member':
$table = 'member_data';
break;
case 'navigator':
$table = $field['relatedid'].'_navigator';
break;
case 'order':
$table = $field['relatedid'].'_order';
break;
case 'page':
$table = $field['relatedid'].'_order';
break;
case 'table':
return $a;
break;
case 'module':
$data = \Phpcmf\Service::M()->table('module')->get($field['relatedid']);
if ($data) {
$table = $field['ismain'] ? '{siteid}_'.$data['dirname'] : '{siteid}_'.$data['dirname'].'_data_{tableid}';
}
break;
case 'mform':
$data = \Phpcmf\Service::M()->table('module_form')->get($field['relatedid']);
if (!$data) {
$table = $field['ismain'] ? '{siteid}_'.$a.'_form_'.$data['table'] : '{siteid}_'.$a.'_form_'.$data['table'].'_data_{tableid}';
}
break;
case 'category':
$table = $siteid.'_'.$a.'_category';
break;
default:
if (strpos($field['relatedname'], 'comment-module') !== false) {
list($a, $b, $module) = explode('-', $field['relatedname']);
$cache = \Phpcmf\Service::L('cache')->get('module-'.SITE_ID.'-'.$module);
if (!$cache) {
$table = $siteid.'_'.$cache['dirname'].'_comment';
}
} else {
list($module, $s) = explode('-', $field['relatedname']);
$cache = \Phpcmf\Service::L('cache')->get('module-'.$s.'-'.$module);
if ($cache) {
$data = $cache['category'][$field['relatedid']];
if ($data) {
if ($module == 'share') {
if ($data['tid'] != 1) {
} else {
$table = $field['ismain'] ? SITE_ID.'_'.$data['mid'].'_category_data' : SITE_ID.'_'.$data['mid'].'_category_data_{tableid}';
}
} else {
$table = $field['ismain'] ? SITE_ID.'_'.$module.'_category_data' : SITE_ID.'_'.$module.'_category_data_{tableid}';
}
}
}
}
break;
}
return str_replace('{siteid}', $siteid, $table);
}
public function get_all() {
if (!$this->relatedname) {
return null;
}
$data = $this->db->table('field')
->where('relatedid', $this->relatedid)
->where('relatedname', $this->relatedname)
->orderBy('disabled ASC,displayorder ASC,id ASC')
->get()
->getResultArray();
if (!$data) {
return null;
}
$rt = [];
foreach ($data as $i => $t) {
$t['spacer'] = '';
$t['setting'] = dr_string2array($t['setting']);
$rt[$t['id']] = $t;
}
return $rt;
}
public function get_mytable_field($table, $siteid = 0) {
$name = 'table-'.$table;
$value = \Phpcmf\Service::L('cache')->init()->get($name);
if (!$value) {
$field = $this->db->table('field')
->where('disabled', 0)
->where('relatedid', $siteid)
->where('relatedname', $name)
->orderBy('displayorder ASC,id ASC')
->get()
->getResultArray();
if ($field) {
foreach ($field as $t) {
$t['setting'] = dr_string2array($t['setting']);
$value[$t['fieldname']] = $t;
}
}
\Phpcmf\Service::L('cache')->init()->save($name, $value);
}
return $value;
}
public function delete_field($ids) {
foreach ($ids as $id) {
$id = intval($id);
$data = $this->table('field')->get($id);
if (!$data) {
return dr_return_data(0, dr_lang('字段不存在(id:%s)', $id));
} elseif ($data['issystem']) {
return dr_return_data(0, dr_lang('系统字段不允许删除(id:%s)', $id));
}
$rt = $this->table('field')->delete($id);
if (!$rt['code']) {
return dr_return_data(0, $rt['msg']);
}
$field = \Phpcmf\Service::L('field')->get($data['fieldtype']);
if ($field) {
$sql = $field->drop_sql($data['fieldname']);
$sql && $this->update_table($sql, $data['ismain']);
}
}
return dr_return_data(1, '');
}
public function add($data, $field) {
$sql = $field->create_sql($data['fieldname'], $data['setting']['option'], $data['name']);
$data['fieldtype'] == 'Ueditor' && $data['setting']['validate']['xss'] = 1;
$data['ismain'] = (int)$data['ismain'];
$data['setting'] = dr_array2string($data['setting']);
$data['issystem'] = 0;
$data['issearch'] = (int)$data['issearch'];
$data['ismember'] = (int)$data['ismember'];
$data['disabled'] = (int)$data['disabled'];
$data['relatedid'] = $this->relatedid;
$data['relatedname'] = $this->relatedname;
$data['displayorder'] = (int)$data['displayorder'];
$rt = $this->table('field')->insert($data);
if ($rt['code'] && $sql) {
$this->_table_field = [];
$this->update_table($sql, $data['ismain']);
$this->db->resetDataCache() if ($this->_table_field && $yz = $field->test_sql($this->_table_field, $data['fieldname'])) {
$this->table('field')->delete($rt['code']);
return dr_return_data(0, dr_lang('字段创建失败: %s', $yz));
}
}
return $rt;
}
public function edit($_data, $data, $sql) {
if (!$_data || !$data) {
return dr_return_data(0, dr_lang('参数不完整'));
}
($data['setting']['option']['fieldtype'] != $_data['setting']['option']['fieldtype']
|| $data['setting']['option']['fieldlength'] != $_data['setting']['option']['fieldlength'])
&& $this->update_table($sql, $_data['ismain']);
if (isset($_data['setting']['diy'])) {
$data['setting']['diy'] = $_data['setting']['diy'];
}
$data['setting'] = dr_array2string($data['setting']);
$data['issearch'] = (int)$data['issearch'];
$data['ismember'] = (int)$data['ismember'];
$data['disabled'] = (int)$data['disabled'];
return $this->table('field')->update($_data['id'], $data);
}
public function update_table($sql, $ismain) {
if (!$sql || !$this->func) {
return null;
}
return call_user_func_array(array($this, '_sql_'.$this->func), array($sql, $ismain));
}
public function exitsts($name) {
if (!$name) {
return 1;
}
return call_user_func_array(array($this, '_field_'.$this->func), array($name));
}
private function _field_exitsts($id, $name, $table, $siteid = 0) {
if (!$table) {
return 0;
}
return $this->db->fieldExists($name, $table);
}
private function _sql_category_data($sql, $ismain) {
$table = $this->dbprefix(SITE_ID.'_'.$this->data['dirname'].'_category_data'); if (!$this->db->tableExists($table)) {
return;
}
if ($ismain) {
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
} else {
for ($i = 0; $i < 200; $i ++) {
if (!$this->db->query("SHOW TABLES LIKE '".$table.'_'.$i."'")->getRowArray()) {
break;
}
$this->db->simpleQuery(str_replace('{tablename}', $table.'_'.$i, $sql)); $this->_table_field[] = $table.'_'.$i;
}
}
}
private function _field_category_data($name) {
$table = $this->dbprefix(SITE_ID.'_'.$this->data['dirname']);
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
$rt = $this->_field_exitsts('id', $name, $table.'_data_0', SITE_ID);
if ($rt) {
return 1;
}
$table = $this->dbprefix(SITE_ID.'_'.$this->data['dirname'].'_category_data');
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
$rt = $this->_field_exitsts('id', $name, $table.'_0', SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_comment($sql, $ismain) {
foreach (\Phpcmf\Service::C()->site_info as $sid => $v) {
$table = $this->dbprefix($sid.'_'.$this->data.'_comment');
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
}
private function _field_comment($name) {
$table = $this->dbprefix(SITE_ID.'_'.$this->data.'_comment');
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_category($sql, $ismain) {
foreach (\Phpcmf\Service::C()->site_info as $sid => $v) {
$table = $this->dbprefix($sid.'_'.$this->data.'_category');
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
}
private function _field_category($name) {
$table = $this->dbprefix(SITE_ID.'_'.$this->data.'_category');
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_member($sql, $ismain) {
$this->db->simpleQuery(str_replace('{tablename}', $this->dbprefix('member_data'), $sql));
$this->_table_field[] = $this->dbprefix('member_data');
}
private function _field_member($name) {
$table = $this->dbprefix('member_data');
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_form($sql, $ismain) {
$table = $this->dbprefix(SITE_ID.'_form_'.$this->data['table']); if (!$this->db->tableExists($table)) {
return;
}
if ($ismain) {
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
} else {
for ($i = 0; $i < 200; $i ++) {
if (!$this->db->query("SHOW TABLES LIKE '".$table.'_data_'.$i."'")->getRowArray()) {
break;
}
$this->db->simpleQuery(str_replace('{tablename}', $table.'_data_'.$i, $sql)); $this->_table_field[] = $table.'_data_'.$i;
}
}
}
private function _field_form($name) {
$table = $this->dbprefix(SITE_ID.'_form_'.$this->data['table']);
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
$rt = $this->_field_exitsts('id', $name, $table.'_data_0', SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_linkage($sql, $ismain) {
$table = $this->dbprefix('linkage_data_'.$this->relatedid);
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
private function _field_linkage($name) {
$table = $this->dbprefix('linkage_data_'.$this->relatedid);
$rt = $this->_field_exitsts('id', $name, $table, $this->relatedid);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_tag($sql, $ismain) {
$table = $this->dbprefix($this->relatedid.'_tag');
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
private function _field_tag($name) {
$table = $this->dbprefix($this->relatedid.'_tag');
$rt = $this->_field_exitsts('id', $name, $table, $this->relatedid);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_navigator($sql, $ismain) {
$table = $this->dbprefix($this->relatedid.'_navigator');
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
private function _field_navigator($name) {
$table = $this->dbprefix($this->relatedid.'_navigator');
$rt = $this->_field_exitsts('id', $name, $table, $this->relatedid);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_order($sql, $ismain) {
$table = $this->dbprefix($this->relatedid.'_order');
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
private function _field_order($name) {
$table = $this->dbprefix($this->relatedid.'_order');
$rt = $this->_field_exitsts('id', $name, $table, $this->relatedid);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_page($sql, $ismain) {
$table = $this->dbprefix($this->relatedid.'_page');
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
private function _field_page($name) {
$table = $this->dbprefix($this->relatedid.'_page');
$rt = $this->_field_exitsts('id', $name, $table, $this->relatedid);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_module($sql, $ismain) {
foreach (\Phpcmf\Service::C()->site_info as $sid => $v) {
$table = $this->dbprefix($sid.'_'.$this->data['dirname']); if (!$this->db->tableExists($table)) {
continue;
}
if ($ismain) {
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
} else {
for ($i = 0; $i < 200; $i ++) {
if (!$this->db->query("SHOW TABLES LIKE '".$table.'_data_'.$i."'")->getRowArray()) {
break;
}
$this->db->simpleQuery(str_replace('{tablename}', $table.'_data_'.$i, $sql)); $this->_table_field[] = $table.'_data_'.$i;
}
}
}
}
private function _field_module($name) {
$table = $this->dbprefix(SITE_ID.'_'.$this->data['dirname']);
$rt = $this->_field_exitsts('id', $name, $table, SITE_ID);
if ($rt) {
return 1;
}
$rt = $this->_field_exitsts('id', $name, $table.'_data_0', SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_mform($sql, $ismain) {
foreach (\Phpcmf\Service::C()->site_info as $sid => $v) {
$table = $this->dbprefix($sid.'_'.$this->data['module'].'_form_'.$this->data['table']); if (!$this->db->tableExists($table)) {
continue;
}
if ($ismain) {
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
} else {
for ($i = 0; $i < 200; $i ++) {
if (!$this->db->query("SHOW TABLES LIKE '".$table.'_data_'.$i."'")->getRowArray()) {
break;
}
$this->db->simpleQuery(str_replace('{tablename}', $table.'_data_'.$i, $sql)); $this->_table_field[] = $table.'_data_'.$i;
}
}
}
}
private function _field_mform($name) {
$table = $this->dbprefix(dr_module_table_prefix($this->data['module']).'_form_'.$this->data['table']);
$rt = $this->_field_exitsts('id', $name, $table, $this->data['module'] == 'space' ? 0 : SITE_ID);
if ($rt) {
return 1;
}
$rt = $this->_field_exitsts('id', $name, $table.'_data_0', $this->data['module'] == 'space' ? 0 : SITE_ID);
if ($rt) {
return 1;
}
return 0;
}
private function _sql_table($sql, $ismain) {
$table = $this->dbprefix($this->data);
if (!$this->db->tableExists($table)) {
return;
}
$this->db->simpleQuery(str_replace('{tablename}', $table, $sql));
$this->_table_field[] = $table;
}
private function _field_table($name) {
$table = $this->dbprefix($this->data);
$rt = $this->_field_exitsts('id', $name, $table, $this->relatedid);
if ($rt) {
return 1;
}
return 0;
}
}