145 lines
5.4 KiB
PHP
145 lines
5.4 KiB
PHP
<?php
|
|
// 模块的搜索
|
|
|
|
$this->_is_list_search = 1;
|
|
|
|
$total = (int)$system['total'];
|
|
unset($system['total']);
|
|
|
|
// 没有数据时返回空
|
|
if (!$total) {
|
|
return $this->_return($system['return'], 'total参数为空', '', 0);
|
|
} elseif (!$dirname) {
|
|
return $this->_return($system['return'], 'module参数不能为空');
|
|
} elseif (!$param['id']) {
|
|
return $this->_return($system['return'], 'id参数为空', '', 0);
|
|
}
|
|
|
|
$module = \Phpcmf\Service::L('cache')->get('module-'.$system['site'].'-'.$dirname);
|
|
if (!$module) {
|
|
return $this->_return($system['return'], '模块('.$dirname.')未安装');
|
|
}
|
|
|
|
$tableinfo = \Phpcmf\Service::L('cache')->get('table-'.$system['site']);
|
|
// 没有表结构缓存时返回空
|
|
if (!$tableinfo) {
|
|
return $this->_return($system['return'], '表结构缓存不存在');
|
|
}
|
|
|
|
$table = \Phpcmf\Service::M()->dbprefix(dr_module_table_prefix($module['dirname'], $system['site'])); // 模块主表`
|
|
if (!isset($tableinfo[$table])) {
|
|
return $this->_return($system['return'], '表('.$table.')结构缓存不存在');
|
|
}
|
|
|
|
if ($where) {
|
|
foreach ($where as $i => $t) {
|
|
if ($t['name'] == 'id') {
|
|
unset($where[$i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
$index = \Phpcmf\Service::L('cache')->get_data('module-search-'.$dirname.'-'.$param['id']);
|
|
if (!$index) {
|
|
$index = $this->_query('SELECT `params` FROM `'.$table.'_search` WHERE `id`="'.$param['id'].'"', $system, 0);
|
|
if ($index) {
|
|
$p = dr_string2array($index['params']);
|
|
$index['sql'] = $p['sql'];
|
|
$index['where'] = $p['where'];
|
|
} else {
|
|
return $this->_return($system['return'], '没有搜索结果', '', 0);
|
|
}
|
|
}
|
|
|
|
if (isset($index['where']) && $index['where']) {
|
|
$where[] = [
|
|
'adj' => 'SQL',
|
|
'value' => $index['where']
|
|
];
|
|
} elseif (isset($index['sql']) && $index['sql']) {
|
|
$where[] = [
|
|
'adj' => 'SQL',
|
|
'value' => '(`'.$table.'`.`id` IN('.$index['sql'].'))'
|
|
];
|
|
} else {
|
|
return $this->_return($system['return'], '没有查询到内容', $index['sql'], 0);
|
|
}
|
|
|
|
unset($param['id']);
|
|
|
|
// 排序操作
|
|
if (!$system['order'] && isset($where['id']) && $where['id']['adj'] == 'IN' && $where['id']['value']) {
|
|
// 按id序列来排序
|
|
$system['order'] = strlen($where['id']['value']) < 10000 && $where['id']['value'] ? 'FIELD(`'.$table.'`.`id`, '.$where['id']['value'].')' : 'NULL';
|
|
} else {
|
|
// 默认排序参数
|
|
!$system['order'] && ($system['order'] = $system['flag'] ? 'updatetime_desc' : ($action == 'hits' ? 'hits' : 'updatetime'));
|
|
}
|
|
|
|
$fields = $module['field']; // 主表的字段
|
|
$_order = [$table => $tableinfo[$table]];
|
|
$sql_from = '`'.$table.'`';
|
|
$sql_where = $this->_get_where($where); // sql的where子句
|
|
|
|
// 关联栏目模型表
|
|
if ($system['more'] && isset($module['category_data_field']) && $module['category_data_field']) {
|
|
$fields = array_merge($fields, $module['category_data_field']);
|
|
$table_more = $table.'_category_data'; // 栏目模型表
|
|
$sql_from.= " LEFT JOIN $table_more ON `$table_more`.`id`=`$table`.`id`"; // sql的from子句
|
|
$_order[$table_more] = $tableinfo[$table_more];
|
|
if (!$system['field']) {
|
|
$system['field'] = '`'.$table.'`.*';
|
|
$fields_more = \Phpcmf\Service::M()->db->getFieldNames($table_more);
|
|
if ($fields_more) {
|
|
foreach ($fields_more as $f) {
|
|
if (!in_array($f, ['id', 'catid', 'uid'])) {
|
|
$system['field'].= ',`'.$table_more.'`.`'.$f.'`';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$system['order'] = $this->_set_orders_field_prefix($system['order'], $_order); // 给排序字段加上表前缀
|
|
|
|
// 分页处理
|
|
$page = $this->_get_page_id($system['page']);
|
|
$pagesize = (int)$system['pagesize'];
|
|
!$pagesize && $pagesize = 10;
|
|
if ($module['setting']['search']['max'] && $page * $pagesize > $module['setting']['search']['max']) {
|
|
$return_data = $this->_return($system['return'], '搜索设置最大显示'.$module['setting']['search']['max'].'条,当前('.($page * $pagesize).')已超出', '', 0);
|
|
return;
|
|
}
|
|
isset($index['params']) && $index['params'] && $system['firsturl'] = \Phpcmf\Service::L('Router')->search_url($index['params']);
|
|
$pages = $this->_new_pagination($system, $pagesize, $total);
|
|
$sql_limit = 'LIMIT ' . intval($pagesize * ($page - 1)) . ',' . $pagesize;
|
|
|
|
// 查询结果
|
|
$sql = "SELECT " .$this->_get_select_field($system['field'] ? $system['field'] : '*') . " FROM $sql_from " . ($sql_where ? "WHERE $sql_where" : "") . ($system['order'] == "null" || !$system['order'] ? "" : " ORDER BY {$system['order']}") . " $sql_limit";
|
|
$data = $this->_query($sql, $system);
|
|
|
|
// 缓存查询结果
|
|
if (is_array($data) && $data) {
|
|
// 模块表的系统字段
|
|
$fields['inputtime'] = ['fieldtype' => 'Date'];
|
|
$fields['updatetime'] = ['fieldtype' => 'Date'];
|
|
// 格式化显示自定义字段内容
|
|
$dfield = \Phpcmf\Service::L('Field')->app($module['dirname']);
|
|
foreach ($data as $i => $t) {
|
|
$t['url'] = dr_url_rel(dr_url_prefix($t['url'], $dirname, $system['site'], $this->_is_mobile));
|
|
$data[$i] = $dfield->format_value($fields, $t, 1);
|
|
}
|
|
}
|
|
|
|
// 存储缓存
|
|
$system['cache'] && $this->_save_cache_data($cache_name, [
|
|
'data' => $data,
|
|
'sql' => $sql,
|
|
'total' => $total,
|
|
'pages' => $pages,
|
|
'pagesize' => $pagesize,
|
|
'page_used' => $this->_page_used,
|
|
'page_urlrule' => $this->_page_urlrule,
|
|
], $system['cache']);
|
|
|
|
return $this->_return($system['return'], $data, $sql, $total, $pages, $pagesize); |