문서의 검색, 확장변수와 관련된 비효율적인 코드 정리

- setToAllDocumentExtraVars() 최적화
- 확장변수(-1, -2)를 이용한 문서 다국어 기능 관련 버그 수정 및 개선
- getDocumentList() 최적화 (비효율적인 코드 대거 삭제)
- _setSortIndex(), _setSearchOption() 최적화 (확장 변수 관련 쿼리들 정리)
- 권한자가 아니라면 공개글만 검색되도록 개선 (검색 옵션과 상관없이)
--- 문서 검색(제목+내용,내용,댓글)시 권한자도 비밀글을 검색할 수 없었던 문제 수정
- 'NOTICE Undefined variable' 조차 발생되지 않도록 getGrant() 수정
- '(포인트가 부족한 경우) 글 열람 금지' 옵션 사용시 본문 뿐만 아니라 확장 변수도 볼 수 없도록 숨김
- 기타 버그 수정 (많이 잡은 것 같은 데 정확히 기억안남ㅠ)
This commit is contained in:
conory 2018-06-28 19:59:21 +09:00
parent 6c28f5ac5a
commit 9fb23bd3dd
14 changed files with 544 additions and 603 deletions

View file

@ -54,8 +54,8 @@ class documentAdminView extends document
} }
$args->sort_index = 'list_order'; // /< sorting value $args->sort_index = 'list_order'; // /< sorting value
$args->module_srl = Context::get('module_srl'); $args->module_srl = Context::get('module_srl');
$args->statusList = array($this->getConfigStatus('public'), $this->getConfigStatus('secret'), $this->getConfigStatus('temp'));
// get a list // get a list
$oDocumentModel = getModel('document'); $oDocumentModel = getModel('document');

View file

@ -145,18 +145,30 @@ class documentItem extends BaseObject
$this->lang_code = $attribute->lang_code; $this->lang_code = $attribute->lang_code;
$this->adds($attribute); $this->adds($attribute);
// Tags // set XE_DOCUMENT_LIST
$GLOBALS['XE_DOCUMENT_LIST'][$this->document_srl] = $this;
// set tags
if($this->get('tags')) if($this->get('tags'))
{ {
$this->add('tag_list', $this->getTags()); $this->add('tag_list', $this->getTags());
} }
// set extra vars
if($load_extra_vars) if($load_extra_vars)
{ {
getModel('document')->setToAllDocumentExtraVars(); getModel('document')->setToAllDocumentExtraVars();
} }
$GLOBALS['XE_DOCUMENT_LIST'][$this->document_srl] = $this; // set content in user language
if(isset($GLOBALS['RX_DOCUMENT_LANG'][$this->document_srl]['title']))
{
$this->add('title', $GLOBALS['RX_DOCUMENT_LANG'][$this->document_srl]['title']);
}
if(isset($GLOBALS['RX_DOCUMENT_LANG'][$this->document_srl]['content']))
{
$this->add('content', $GLOBALS['RX_DOCUMENT_LANG'][$this->document_srl]['content']);
}
} }
function isExists() function isExists()
@ -824,11 +836,6 @@ class documentItem extends BaseObject
} }
$extra_vars = $this->getExtraVars(); $extra_vars = $this->getExtraVars();
if(!is_array($extra_vars))
{
return array();
}
foreach($extra_vars as $idx => $key) foreach($extra_vars as $idx => $key)
{ {
$this->extra_eids[$key->eid] = $key; $this->extra_eids[$key->eid] = $key;

View file

@ -48,79 +48,102 @@ class documentModel extends document
*/ */
function setToAllDocumentExtraVars() function setToAllDocumentExtraVars()
{ {
static $checked_documents = array(); // get document list
$_document_list = &$GLOBALS['XE_DOCUMENT_LIST']; $_document_list = &$GLOBALS['XE_DOCUMENT_LIST'];
if(empty($_document_list))
{
return;
}
// XE XE_DOCUMENT_LIST all documents that the object referred to the global variable settings static $checked = array();
if(countobj($_document_list) <= 0) return; static $module_extra_keys = array();
// Find all called the document object variable has been set extension // check documents
$document_srls = array(); $document_srls = array();
foreach($_document_list as $key => $val) foreach($_document_list as $document_srl => $oDocument)
{ {
if(!$val->document_srl || $checked_documents[$val->document_srl]) continue; if(isset($checked[$document_srl]) || !($oDocument instanceof documentItem) || !$oDocument->isExists())
$checked_documents[$val->document_srl] = true;
$document_srls[] = $val->document_srl;
}
// If the document number, return detected
if(!count($document_srls)) return;
// Expand variables mijijeongdoen article about a current visitor to the extension of the language code, the search variable
//$obj->document_srl = implode(',',$document_srls);
$output = $this->getDocumentExtraVarsFromDB($document_srls);
if($output->toBool() && $output->data)
{
$extra_vars = array();
foreach($output->data as $key => $val)
{ {
if(!isset($val->value)) continue; continue;
if(!$extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0]) $extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0] = trim($val->value);
$extra_vars[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value);
} }
$checked[$document_srl] = true;
$document_srls[] = $document_srl;
} }
$user_lang_code = Context::getLangType(); if(!$document_srls)
for($i=0,$c=count($document_srls);$i<$c;$i++)
{ {
$document_srl = $document_srls[$i]; return;
unset($vars); }
if(!$_document_list[$document_srl] || !is_object($_document_list[$document_srl]) || !$_document_list[$document_srl]->isExists()) continue; // get extra values of documents
$module_srl = $_document_list[$document_srl]->get('module_srl'); $extra_values = array();
$extra_keys = $this->getExtraKeys($module_srl); $output = $this->getDocumentExtraVarsFromDB($document_srls);
$vars = $extra_vars[$document_srl]; foreach($output->data as $key => $val)
$document_lang_code = $_document_list[$document_srl]->get('lang_code'); {
// Expand the variable processing if(!$val->value)
if(count($extra_keys))
{ {
foreach($extra_keys as $idx => $key) continue;
}
$extra_values[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value);
}
// set extra variables and document language
$user_lang_code = Context::getLangType();
foreach($document_srls as $document_srl)
{
$oDocument = $_document_list[$document_srl];
$module_srl = $oDocument->get('module_srl');
$document_lang_code = $oDocument->get('lang_code');
$document_extra_values = $extra_values[$document_srl];
// set XE_EXTRA_VARS
if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl]))
{
// get extra keys of the module
if(!isset($module_extra_keys[$module_srl]))
{ {
$extra_keys[$idx] = clone($key); $module_extra_keys[$module_srl] = $this->getExtraKeys($module_srl);
$val = $vars[$idx]; }
if(isset($val[$user_lang_code])) $v = $val[$user_lang_code];
else if(isset($val[$document_lang_code])) $v = $val[$document_lang_code]; // set extra variables of the document
else if(isset($val[0])) $v = $val[0]; if($module_extra_keys[$module_srl])
else $v = null; {
$extra_keys[$idx]->value = $v; $document_extra_vars = array();
foreach($module_extra_keys[$module_srl] as $idx => $key)
{
$document_extra_vars[$idx] = clone($key);
// set variable value in user language
if(isset($document_extra_values[$idx][$user_lang_code]))
{
$document_extra_vars[$idx]->setValue($document_extra_values[$idx][$user_lang_code]);
}
elseif(isset($document_extra_values[$idx][$document_lang_code]))
{
$document_extra_vars[$idx]->setValue($document_extra_values[$idx][$document_lang_code]);
}
}
$GLOBALS['XE_EXTRA_VARS'][$document_srl] = $document_extra_vars;
} }
} }
unset($evars); // set RX_DOCUMENT_LANG
$evars = new ExtraVar($module_srl); if(!isset($GLOBALS['RX_DOCUMENT_LANG'][$document_srl]) && $document_lang_code !== $user_lang_code)
$evars->setExtraVarKeys($extra_keys);
// Title Processing
if($vars[-1][$user_lang_code]) $_document_list[$document_srl]->add('title',$vars[-1][$user_lang_code]);
// Information processing
if($vars[-2][$user_lang_code]) $_document_list[$document_srl]->add('content',$vars[-2][$user_lang_code]);
// static 데이터를 갱신해주기 위해 들어간 코드같으나 어차피 언어 변경 자체는 페이지 전환이 일어나면서 발생하는게 대부분이라 효용이 없음. 또한 예기치않게 권한이 없는 다국어 문서 내용을 보여주는 부효과가 일어남
/*
if($vars[-1][$user_lang_code] || $vars[-2][$user_lang_code])
{ {
unset($checked_documents[$document_srl]); if(isset($document_extra_values[-1][$user_lang_code]))
{
$oDocument->add('title', $document_extra_values[-1][$user_lang_code]);
$GLOBALS['RX_DOCUMENT_LANG'][$document_srl]['title'] = $document_extra_values[-1][$user_lang_code];
}
if(isset($document_extra_values[-2][$user_lang_code]))
{
$oDocument->add('content', $document_extra_values[-2][$user_lang_code]);
$GLOBALS['RX_DOCUMENT_LANG'][$document_srl]['content'] = $document_extra_values[-2][$user_lang_code];
}
} }
*/
$GLOBALS['XE_EXTRA_VARS'][$document_srl] = $evars->getExtraVars();
} }
} }
@ -132,22 +155,20 @@ class documentModel extends document
* @param array $columnList * @param array $columnList
* @return documentItem * @return documentItem
*/ */
function getDocument($document_srl=0, $is_admin = false, $load_extra_vars=true, $columnList = array()) function getDocument($document_srl = 0, $is_admin = false, $load_extra_vars = true, $columnList = array())
{ {
if(!$document_srl) return new documentItem(); if(!$document_srl)
{
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) return new documentItem();
}
if(!isset($GLOBALS['XE_DOCUMENT_LIST'][$document_srl]))
{ {
$oDocument = new documentItem($document_srl, $load_extra_vars, $columnList); $oDocument = new documentItem($document_srl, $load_extra_vars, $columnList);
if(!$oDocument->isExists()) if(!$oDocument->isExists())
{ {
return $oDocument; return $oDocument;
} }
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
if($load_extra_vars) $this->setToAllDocumentExtraVars();
} }
if($is_admin) if($is_admin)
{ {
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->setGrant(); $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->setGrant();
@ -173,25 +194,19 @@ class documentModel extends document
$output = executeQueryArray('document.getDocuments', $args, $columnList); $output = executeQueryArray('document.getDocuments', $args, $columnList);
$documents = array(); $documents = array();
foreach($output->data as $key => $attribute) foreach($output->data as $attribute)
{ {
if(!$document_srl = $attribute->document_srl) if(!isset($GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl]))
{
continue;
}
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl])
{ {
$oDocument = new documentItem(); $oDocument = new documentItem();
$oDocument->setAttribute($attribute, false); $oDocument->setAttribute($attribute, false);
if($is_admin) }
{ if($is_admin)
$oDocument->setGrant(); {
} $GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl]->setGrant();
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
} }
$documents[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; $documents[$attribute->document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl];
} }
if($load_extra_vars) if($load_extra_vars)
@ -210,15 +225,17 @@ class documentModel extends document
* @param array $columnList * @param array $columnList
* @return Object * @return Object
*/ */
function getDocumentList($obj, $except_notice = false, $load_extra_vars=true, $columnList = array()) function getDocumentList($obj, $except_notice = false, $load_extra_vars = true, $columnList = array())
{ {
$sort_check = $this->_setSortIndex($obj, $load_extra_vars); $sort_check = $this->_setSortIndex($obj, $load_extra_vars);
$obj->sort_index = $sort_check->sort_index; $obj->sort_index = $sort_check->sort_index;
$obj->isExtraVars = $sort_check->isExtraVars; $obj->isExtraVars = $sort_check->isExtraVars;
unset($obj->use_alternate_output); $obj->except_notice = $except_notice;
$obj->columnList = $columnList; $obj->columnList = $columnList;
// Call trigger (before) // Call trigger (before)
// This trigger can be used to set an alternative output using a different search method // This trigger can be used to set an alternative output using a different search method
unset($obj->use_alternate_output);
$output = ModuleHandler::triggerCall('document.getDocumentList', 'before', $obj); $output = ModuleHandler::triggerCall('document.getDocumentList', 'before', $obj);
if($output instanceof BaseObject && !$output->toBool()) if($output instanceof BaseObject && !$output->toBool())
{ {
@ -226,110 +243,42 @@ class documentModel extends document
} }
// If an alternate output is set, use it instead of running the default queries // If an alternate output is set, use it instead of running the default queries
$use_alternate_output = (isset($obj->use_alternate_output) && $obj->use_alternate_output instanceof BaseObject); if (isset($obj->use_alternate_output) && $obj->use_alternate_output instanceof BaseObject)
if (!$use_alternate_output)
{
$this->_setSearchOption($obj, $args, $query_id, $use_division);
}
if ($use_alternate_output)
{ {
$output = $obj->use_alternate_output; $output = $obj->use_alternate_output;
unset($obj->use_alternate_output);
}
elseif ($sort_check->isExtraVars && substr_count($obj->search_target,'extra_vars'))
{
$query_id = 'document.getDocumentListWithinExtraVarsExtraSort';
$args->sort_index = str_replace('documents.','',$args->sort_index);
$output = executeQueryArray($query_id, $args);
}
elseif ($sort_check->isExtraVars)
{
$output = executeQueryArray($query_id, $args);
} }
// execute query
else else
{ {
// document.getDocumentList query execution $this->_setSearchOption($obj, $args, $query_id, $use_division);
// Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because $output = executeQueryArray($query_id, $args, $args->columnList);
$groupByQuery = array('document.getDocumentListWithinComment' => 1, 'document.getDocumentListWithinTag' => 1, 'document.getDocumentListWithinExtraVars' => 1);
if(isset($groupByQuery[$query_id]))
{
$group_args = clone($args);
$group_args->sort_index = 'documents.'.$args->sort_index;
$output = executeQueryArray($query_id, $group_args);
if(!$output->toBool()||!count($output->data)) return $output;
foreach($output->data as $key => $val)
{
if($val->document_srl) $target_srls[] = $val->document_srl;
}
$page_navigation = $output->page_navigation;
$keys = array_keys($output->data);
$virtual_number = $keys[0];
$target_args = new stdClass();
$target_args->document_srls = implode(',',$target_srls);
$target_args->list_order = $args->sort_index;
$target_args->order_type = $args->order_type;
$target_args->list_count = $args->list_count;
$target_args->page = 1;
$output = executeQueryArray('document.getDocuments', $target_args);
$output->page_navigation = $page_navigation;
$output->total_count = $page_navigation->total_count;
$output->total_page = $page_navigation->total_page;
$output->page = $page_navigation->cur_page;
}
else
{
$output = executeQueryArray($query_id, $args, $columnList);
}
} }
// Return if no result or an error occurs // Return if no result or an error occurs
if(!$output->toBool()||!count($output->data)) return $output; if(!$output->toBool() || !$result = $output->data)
$idx = 0;
$data = $output->data;
unset($output->data);
if(!isset($virtual_number))
{ {
$keys = array_keys($data); return $output;
$virtual_number = $keys[0];
} }
if($except_notice) $output->data = array();
foreach($result as $key => $attribute)
{ {
foreach($data as $key => $attribute) if(!isset($GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl]))
{ {
if($attribute->is_notice == 'Y') $virtual_number --;
}
}
foreach($data as $key => $attribute)
{
if($except_notice && $attribute->is_notice == 'Y') continue;
$document_srl = $attribute->document_srl;
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl])
{
$oDocument = null;
$oDocument = new documentItem(); $oDocument = new documentItem();
$oDocument->setAttribute($attribute, false); $oDocument->setAttribute($attribute, false);
if($is_admin) $oDocument->setGrant(); }
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; if($is_admin)
{
$GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl]->setGrant();
} }
$output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; $output->data[$key] = $GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl];
$virtual_number--;
} }
if($load_extra_vars) $this->setToAllDocumentExtraVars(); if($load_extra_vars)
if(count($output->data))
{ {
foreach($output->data as $number => $document) $this->setToAllDocumentExtraVars();
{
$output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl];
}
} }
// Call trigger (after) // Call trigger (after)
@ -348,32 +297,27 @@ class documentModel extends document
{ {
$args = new stdClass(); $args = new stdClass();
$args->module_srl = $obj->module_srl; $args->module_srl = $obj->module_srl;
$args->category_srl= $obj->category_srl; $args->category_srl = $obj->category_srl;
$output = executeQueryArray('document.getNoticeList', $args, $columnList); $output = executeQueryArray('document.getNoticeList', $args, $columnList);
if(!$output->toBool()||!$output->data) return; if(!$output->toBool() || !$result = $output->data)
foreach($output->data as $key => $val)
{ {
$document_srl = $val->document_srl; return;
if(!$document_srl) continue; }
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) $output->data = array();
foreach($result as $attribute)
{
if(!isset($GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl]))
{ {
$oDocument = null;
$oDocument = new documentItem(); $oDocument = new documentItem();
$oDocument->setAttribute($val, false); $oDocument->setAttribute($attribute, false);
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
} }
$result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl];
$output->data[$attribute->document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl];
} }
$this->setToAllDocumentExtraVars(); $this->setToAllDocumentExtraVars();
foreach($result->data as $document_srl => $val) return $output;
{
$result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl];
}
return $result;
} }
/** /**
@ -465,13 +409,17 @@ class documentModel extends document
{ {
if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])) if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl]))
{ {
// Extended to extract the values of variables set $this->getDocument($document_srl);
$oDocument = $this->getDocument($document_srl, false);
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
$this->setToAllDocumentExtraVars(); $this->setToAllDocumentExtraVars();
} }
if(is_array($GLOBALS['XE_EXTRA_VARS'][$document_srl])) ksort($GLOBALS['XE_EXTRA_VARS'][$document_srl]); if(empty($GLOBALS['XE_EXTRA_VARS'][$document_srl]) || !is_array($GLOBALS['XE_EXTRA_VARS'][$document_srl]))
return $GLOBALS['XE_EXTRA_VARS'][$document_srl] ?: array(); {
return array();
}
ksort($GLOBALS['XE_EXTRA_VARS'][$document_srl]);
return $GLOBALS['XE_EXTRA_VARS'][$document_srl];
} }
/** /**
@ -621,7 +569,7 @@ class documentModel extends document
*/ */
function getDocumentPage($oDocument, $opt) function getDocumentPage($oDocument, $opt)
{ {
$sort_check = $this->_setSortIndex($opt, TRUE); $sort_check = $this->_setSortIndex($opt);
$opt->sort_index = $sort_check->sort_index; $opt->sort_index = $sort_check->sort_index;
$opt->isExtraVars = $sort_check->isExtraVars; $opt->isExtraVars = $sort_check->isExtraVars;
@ -1250,41 +1198,41 @@ class documentModel extends document
* @param bool $load_extra_vars * @param bool $load_extra_vars
* @return object * @return object
*/ */
function _setSortIndex($obj, $load_extra_vars) function _setSortIndex($obj, $load_extra_vars = true)
{ {
$sortIndex = $obj->sort_index; $args = new stdClass;
$isExtraVars = false; $args->sort_index = $obj->sort_index;
if(!in_array($sortIndex, array('list_order','regdate','last_update','update_order','readed_count','voted_count','blamed_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) $args->isExtraVars = false;
{
// get module_srl extra_vars list
if ($load_extra_vars)
{
$extra_args = new stdClass();
$extra_args->module_srl = $obj->module_srl;
$extra_output = executeQueryArray('document.getGroupsExtraVars', $extra_args);
if (!$extra_output->data || !$extra_output->toBool())
{
$sortIndex = 'list_order';
}
else
{
$check_array = array();
foreach($extra_output->data as $val)
{
$check_array[] = $val->eid;
}
if(!in_array($sortIndex, $check_array)) $sortIndex = 'list_order';
else $isExtraVars = true;
}
}
else
$sortIndex = 'list_order';
}
$returnObj = new stdClass();
$returnObj->sort_index = $sortIndex;
$returnObj->isExtraVars = $isExtraVars;
return $returnObj; // check it's default sort
$default_sort = array('list_order', 'regdate', 'last_update', 'update_order', 'readed_count', 'voted_count', 'blamed_count', 'comment_count', 'trackback_count', 'uploaded_count', 'title', 'category_srl');
if(in_array($args->sort_index, $default_sort))
{
return $args;
}
// check it can use extra variable
if(!$load_extra_vars || !$extra_keys = $this->getExtraKeys($obj->module_srl))
{
$args->sort_index = 'list_order';
return $args;
}
$eids = array();
foreach($extra_keys as $idx => $key)
{
$eids[] = $key->eid;
}
// check it exists in extra keys of the module
if(!in_array($args->sort_index, $eids))
{
$args->sort_index = 'list_order';
return $args;
}
$args->isExtraVars = true;
return $args;
} }
/** /**
@ -1299,110 +1247,85 @@ class documentModel extends document
*/ */
function _setSearchOption($searchOpt, &$args, &$query_id, &$use_division) function _setSearchOption($searchOpt, &$args, &$query_id, &$use_division)
{ {
// Variable check $args = new stdClass;
$args = new stdClass(); $args->module_srl = $searchOpt->module_srl;
$args->category_srl = $searchOpt->category_srl?$searchOpt->category_srl:null; $args->exclude_module_srl = $searchOpt->exclude_module_srl;
$args->order_type = $searchOpt->order_type; $args->category_srl = $searchOpt->category_srl ?: null;
$args->page = $searchOpt->page?$searchOpt->page:1;
$args->list_count = $searchOpt->list_count?$searchOpt->list_count:20;
$args->page_count = $searchOpt->page_count?$searchOpt->page_count:10;
$args->start_date = $searchOpt->start_date?$searchOpt->start_date:null;
$args->end_date = $searchOpt->end_date?$searchOpt->end_date:null;
$args->member_srl = $searchOpt->member_srl ?: ($searchOpt->member_srls ?: null); $args->member_srl = $searchOpt->member_srl ?: ($searchOpt->member_srls ?: null);
$args->order_type = $searchOpt->order_type === 'desc' ? 'desc' : 'asc';
$logged_info = Context::get('logged_info');
$args->sort_index = $searchOpt->sort_index; $args->sort_index = $searchOpt->sort_index;
$args->page = $searchOpt->page ?: 1;
$args->list_count = $searchOpt->list_count ?: 20;
$args->page_count = $searchOpt->page_count ?: 10;
$args->start_date = $searchOpt->start_date ?: null;
$args->end_date = $searchOpt->end_date ?: null;
$args->s_is_notice = $searchOpt->except_notice ? 'N' : null;
$args->statusList = $searchOpt->statusList ?: array($this->getConfigStatus('public'), $this->getConfigStatus('secret'));
$args->columnList = $searchOpt->columnList ?: array();
// Check the target and sequence alignment // get directly module_srl by mid
$orderType = array('desc' => 1, 'asc' => 1);
if(!isset($orderType[$args->order_type])) $args->order_type = 'asc';
// If that came across mid module_srl instead of a direct module_srl guhaejum
if($searchOpt->mid) if($searchOpt->mid)
{ {
$oModuleModel = getModel('module'); $args->module_srl = getModel('module')->getModuleSrlByMid($searchOpt->mid);
$args->module_srl = $oModuleModel->getModuleSrlByMid($searchOpt->mid);
unset($searchOpt->mid);
} }
// Module_srl passed the array may be a check whether the array // add subcategories
if(is_array($searchOpt->module_srl)) $args->module_srl = implode(',', $searchOpt->module_srl);
else $args->module_srl = $searchOpt->module_srl;
// Except for the test module_srl
if(is_array($searchOpt->exclude_module_srl)) $args->exclude_module_srl = implode(',', $searchOpt->exclude_module_srl);
else $args->exclude_module_srl = $searchOpt->exclude_module_srl;
// only admin document list, temp document showing
if($searchOpt->statusList) $args->statusList = $searchOpt->statusList;
else
{
if($logged_info->is_admin == 'Y' && !$searchOpt->module_srl)
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp'));
else
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'));
}
// Category is selected, further sub-categories until all conditions
if($args->category_srl) if($args->category_srl)
{ {
$category_list = $this->getCategoryList($args->module_srl); $category_list = $this->getCategoryList($args->module_srl);
$category_info = $category_list[$args->category_srl]; if(isset($category_list[$args->category_srl]))
$category_info->childs[] = $args->category_srl; {
$args->category_srl = implode(',',$category_info->childs); $categories = $category_list[$args->category_srl]->childs;
$categories[] = $args->category_srl;
$args->category_srl = $categories;
}
} }
// Used to specify the default query id (based on several search options to query id modified) // default
$query_id = 'document.getDocumentList'; $query_id = null;
// If the search by specifying the document division naeyonggeomsaekil processed for
$use_division = false; $use_division = false;
// Search options
$search_target = $searchOpt->search_target; $search_target = $searchOpt->search_target;
$search_keyword = $searchOpt->search_keyword; $search_keyword = trim($searchOpt->search_keyword);
// search
if($search_target && $search_keyword) if($search_target && $search_keyword)
{ {
switch($search_target) switch($search_target)
{ {
case 'title' : case 'title' :
case 'content' : case 'content' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); case 'comment' :
$args->{"s_".$search_target} = $search_keyword; case 'tag' :
$use_division = true;
break;
case 'title_content' : case 'title_content' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_title = $search_keyword;
$args->s_content = $search_keyword;
$use_division = true; $use_division = true;
$search_keyword = str_replace(' ', '%', $search_keyword);
if($search_target == 'title_content')
{
$args->s_title = $search_keyword;
$args->s_content = $search_keyword;
}
else
{
if($search_target == 'comment')
{
$query_id = 'document.getDocumentListWithinComment';
}
elseif($search_target == 'tag')
{
$query_id = 'document.getDocumentListWithinTag';
}
$args->{'s_' . $search_target} = $search_keyword;
}
break; break;
case 'user_id' : case 'user_id' :
if($search_keyword) $search_keyword = trim($search_keyword);
$args->s_user_id = $search_keyword;
$args->sort_index = 'documents.'.$args->sort_index;
break;
case 'user_name' : case 'user_name' :
case 'nick_name' : case 'nick_name' :
if($search_keyword) $search_keyword = trim($search_keyword);
$args->{"s_".$search_target} = $search_keyword;
break;
case 'email_address' : case 'email_address' :
case 'homepage' : case 'homepage' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); case 'regdate' :
$args->{"s_".$search_target} = $search_keyword; case 'last_update' :
break; case 'ipaddress' :
case 'is_notice' : $args->{'s_' . $search_target} = str_replace(' ', '%', $search_keyword);
if($search_keyword=='N') $args->{"s_".$search_target} = 'N';
elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y';
else $args->{"s_".$search_target} = '';
break;
case 'is_secret' :
if($search_keyword=='N') $args->statusList = array($this->getConfigStatus('public'));
elseif($search_keyword=='Y') $args->statusList = array($this->getConfigStatus('secret'));
elseif($search_keyword=='temp') $args->statusList = array($this->getConfigStatus('temp'));
break; break;
case 'member_srl' : case 'member_srl' :
case 'readed_count' : case 'readed_count' :
@ -1410,138 +1333,117 @@ class documentModel extends document
case 'comment_count' : case 'comment_count' :
case 'trackback_count' : case 'trackback_count' :
case 'uploaded_count' : case 'uploaded_count' :
$args->{"s_".$search_target} = (int)$search_keyword; $args->{'s_' . $search_target} = (int)$search_keyword;
break; break;
case 'blamed_count' : case 'blamed_count' :
$args->{"s_".$search_target} = (int)$search_keyword * -1; $args->{'s_' . $search_target} = (int)$search_keyword * -1;
break; break;
case 'regdate' : case 'is_notice' :
case 'last_update' : $args->{'s_' . $search_target} = $search_keyword == 'Y' ? 'Y' : 'N';
case 'ipaddress' :
$args->{"s_".$search_target} = $search_keyword;
break; break;
case 'comment' : case 'is_secret' :
$args->s_comment = $search_keyword; if($search_keyword == 'N')
$query_id = 'document.getDocumentListWithinComment'; {
$use_division = true; $args->statusList = array($this->getConfigStatus('public'));
break; }
case 'tag' : elseif($search_keyword == 'Y')
$args->s_tags = str_replace(' ','%',$search_keyword); {
$query_id = 'document.getDocumentListWithinTag'; $args->statusList = array($this->getConfigStatus('secret'));
break; }
case 'extra_vars': elseif($search_keyword == 'temp')
$args->var_value = str_replace(' ', '%', $search_keyword); {
$query_id = 'document.getDocumentListWithinExtraVars'; $args->statusList = array($this->getConfigStatus('temp'));
}
break; break;
default : default :
if(strpos($search_target,'extra_vars')!==false) { // search extra variable
$args->var_idx = substr($search_target, strlen('extra_vars')); if(preg_match('/^extra_vars([0-9]+)?$/', $search_target, $matches))
$args->var_value = str_replace(' ','%',$search_keyword); {
$args->sort_index = 'documents.'.$args->sort_index; $args->var_idx = !empty($matches[1]) ? $matches[1] : null;
$query_id = 'document.getDocumentListWithExtraVars'; $args->var_value = str_replace(' ', '%', $search_keyword);
} }
break; break;
} }
// Exclude secret documents if searching content or comment // exclude secret documents in searching if current user does not have privilege
// https://github.com/rhymix/rhymix/issues/1021 if(!$args->member_srl || !Context::get('is_logged') || $args->member_srl !== Context::get('logged_info')->member_srl)
if($search_target === 'content' || $search_target === 'title_content' || $search_target === 'comment')
{ {
$args->statusList = array($this->getConfigStatus('public')); $module_info = getModel('module')->getModuleInfoByModuleSrl($args->module_srl);
$args->comment_is_secret = 'N'; if(!getModel('module')->getGrant($module_info, Context::get('logged_info'))->manager)
{
$args->comment_is_secret = 'N';
$args->statusList = array($this->getConfigStatus('public'));
}
} }
} }
if ($searchOpt->isExtraVars) // set query
if(!$query_id)
{ {
$query_id = 'document.getDocumentListExtraSort'; // by extra variable
} if($searchOpt->isExtraVars || !empty($args->var_value))
else
{
/**
* list_order asc sort of division that can be used only when
*/
if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false;
/**
* If it is true, use_division changed to use the document division
*/
if($use_division)
{ {
// Division begins if($searchOpt->isExtraVars)
$division = (int)Context::get('division');
// order by list_order and (module_srl===0 or module_srl may count), therefore case table full scan
if($args->sort_index == 'list_order' && ($args->exclude_module_srl === '0' || count(explode(',', $args->module_srl)) > 5))
{ {
$listSqlID = 'document.getDocumentListUseIndex'; $args->sort_eid = $args->sort_index;
$divisionSqlID = 'document.getDocumentDivisionUseIndex'; $args->sort_lang = Context::getLangType();
$args->sort_index = 'extra_sort.value';
} }
else $query_id = 'document.getDocumentListWithExtraVars';
{
$listSqlID = 'document.getDocumentList';
$divisionSqlID = 'document.getDocumentDivision';
}
// If you do not value the best division top
if(!$division)
{
$division_args = new stdClass();
$division_args->module_srl = $args->module_srl;
$division_args->exclude_module_srl = $args->exclude_module_srl;
$division_args->list_count = 1;
$division_args->sort_index = $args->sort_index;
$division_args->order_type = $args->order_type;
$division_args->statusList = $args->statusList;
$output = executeQuery($divisionSqlID, $division_args, array('list_order'));
if($output->data)
{
$item = array_pop($output->data);
$division = $item->list_order;
}
$division_args = null;
}
// The last division
$last_division = (int)Context::get('last_division');
// Division after division from the 5000 value of the specified Wanted
if(!$last_division)
{
$last_division_args = new stdClass();
$last_division_args->module_srl = $args->module_srl;
$last_division_args->exclude_module_srl = $args->exclude_module_srl;
$last_division_args->list_count = 1;
$last_division_args->sort_index = $args->sort_index;
$last_division_args->order_type = $args->order_type;
$last_division_args->list_order = $division;
$last_division_args->page = 5001;
$output = executeQuery($divisionSqlID, $last_division_args, array('list_order'));
if($output->data)
{
$item = array_pop($output->data);
$last_division = $item->list_order;
}
}
// Make sure that after last_division article
if($last_division)
{
$last_division_args = new stdClass();
$last_division_args->module_srl = $args->module_srl;
$last_division_args->exclude_module_srl = $args->exclude_module_srl;
$last_division_args->list_order = $last_division;
$output = executeQuery('document.getDocumentDivisionCount', $last_division_args);
if($output->data->count<1) $last_division = null;
}
$args->division = $division;
$args->last_division = $last_division;
Context::set('division', $division);
Context::set('last_division', $last_division);
} }
else
{
$query_id = 'document.getDocumentList';
}
}
// other queries not support to sort extra variable
elseif($searchOpt->isExtraVars)
{
$args->sort_index = 'list_order';
}
// division search by 5,000
if($use_division)
{
$args->order_type = 'asc';
$args->sort_index = 'list_order';
$args->division = (int)Context::get('division');
$args->last_division = (int)Context::get('last_division');
$division_args = new stdClass;
$division_args->module_srl = $args->module_srl;
$division_args->exclude_module_srl = $args->exclude_module_srl;
// get start point of first division
if(Context::get('division') === null)
{
$args->division = (int)executeQuery('document.getDocumentDivision', $division_args)->data->list_order;
}
// get end point of the division
if(Context::get('last_division') === null && $args->division)
{
$division_args->offset = 5000;
$division_args->list_order = $args->division;
$args->last_division = (int)executeQuery('document.getDocumentDivision', $division_args)->data->list_order;
}
Context::set('division', $args->division);
Context::set('last_division', $args->last_division);
}
// add default prefix
if($args->sort_index && strpos($args->sort_index, '.') === false)
{
$args->sort_index = 'documents.' . $args->sort_index;
}
foreach($args->columnList as $key => $column)
{
if(strpos($column, '.') !== false)
{
continue;
}
$args->columnList[$key] = 'documents.' . $column;
} }
} }

View file

@ -1,19 +1,18 @@
<query id="getDocumentDivision" action="select"> <query id="getDocumentDivision" action="select">
<tables> <tables>
<table name="documents" /> <table name="documents" />
</tables> </tables>
<columns> <columns>
<column name="*" /> <column name="list_order" />
</columns> </columns>
<conditions> <conditions>
<condition operation="in" column="module_srl" var="module_srl" filter="number" /> <condition operation="in" column="module_srl" var="module_srl" filter="number" />
<condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" /> <condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="more" column="list_order" var="list_order" filter="number" pipe="and" /> <condition operation="more" column="list_order" var="list_order" filter="number" pipe="and" />
</conditions> </conditions>
<navigation> <navigation>
<index var="sort_index" default="list_order" order="order_type" /> <index var="sort_index" default="list_order" order="asc" />
<list_count var="list_count" default="1" /> <list_count var="list_count" default="1" />
<page_count var="page_count" default="1" /> <offset var="offset" default="0" />
<page var="page" default="1" /> </navigation>
</navigation>
</query> </query>

View file

@ -1,13 +1,13 @@
<query id="getDocumentDivisionCount" action="select"> <query id="getDocumentDivisionCount" action="select">
<tables> <tables>
<table name="documents" /> <table name="documents" />
</tables> </tables>
<columns> <columns>
<column name="count(*)" alias="count" /> <column name="count(*)" alias="count" />
</columns> </columns>
<conditions> <conditions>
<condition operation="in" column="module_srl" var="module_srl" filter="number" /> <condition operation="in" column="module_srl" var="module_srl" filter="number" />
<condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" /> <condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="excess" column="list_order" var="list_order" filter="number" pipe="and" /> <condition operation="excess" column="list_order" var="list_order" filter="number" pipe="and" />
</conditions> </conditions>
</query> </query>

View file

@ -1,28 +1,57 @@
<query id="getDocumentListWithExtraVars" action="select"> <query id="getDocumentListWithExtraVars" action="select">
<tables> <tables>
<table name="documents" /> <table name="documents" />
<table name="document_extra_vars" alias="extra_vars" /> <table name="document_extra_vars" alias="extra_vars" />
</tables> <table name="document_extra_vars" alias="extra_sort" />
<columns> </tables>
<column name="documents.*" /> <columns>
</columns> <column name="documents.*" />
<conditions> </columns>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" /> <conditions>
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" /> <condition operation="like" column="extra_vars.value" var="var_value" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" /> <condition operation="equal" column="extra_vars.var_idx" var="var_idx" pipe="and" />
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" /> <condition operation="equal" column="documents.document_srl" default="extra_vars.document_srl" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" /> <condition operation="equal" column="extra_sort.eid" var="sort_eid" pipe="and" />
<condition operation="equal" column="extra_vars.var_idx" var="var_idx" notnull="notnull" pipe="and" /> <condition operation="equal" column="extra_sort.lang_code" var="sort_lang" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" /> <condition operation="equal" column="documents.document_srl" default="extra_sort.document_srl" pipe="and" />
<condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" /> <condition operation="in" column="documents.module_srl" var="module_srl" filter="number" pipe="and" />
</conditions> <condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" />
<condition operation="more" column="documents.list_order" var="division" pipe="and" />
<condition operation="below" column="documents.list_order" var="last_division" pipe="and" />
<condition operation="more" column="documents.last_update" var="start_date" pipe="and" />
<condition operation="less" column="documents.last_update" var="end_date" pipe="and" />
<group pipe="and">
<condition operation="like" column="documents.title" var="s_title" />
<condition operation="like" column="documents.content" var="s_content" pipe="or" />
<condition operation="equal" column="documents.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="documents.user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="documents.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="documents.email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="documents.homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="documents.tags" var="s_tags" pipe="or" />
<condition operation="equal" column="documents.member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="documents.readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="documents.voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="documents.blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="documents.comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="documents.trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="documents.uploaded_count" var="s_uploaded_count" pipe="or" />
<condition operation="like_prefix" column="documents.regdate" var="s_regdate" pipe="or" />
<condition operation="like_prefix" column="documents.last_update" var="s_last_update" pipe="or" />
<condition operation="like_prefix" column="documents.ipaddress" var="s_ipaddress" pipe="or" />
</group>
</conditions>
<groups> <groups>
<group column="extra_vars.document_srl" /> <group column="documents.document_srl" />
</groups> </groups>
<navigation> <navigation>
<index var="sort_index" default="documents.list_order" order="order_type" /> <index var="sort_index" default="documents.list_order" order="order_type" />
<list_count var="list_count" default="20" /> <list_count var="list_count" default="20" />
<page_count var="page_count" default="10" /> <page_count var="page_count" default="10" />
<page var="page" default="1" /> <page var="page" default="1" />
</navigation> </navigation>
</query> </query>

View file

@ -13,6 +13,7 @@
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" /> <condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" /> <condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" />
<condition operation="equal" column="extra_vars.var_idx" var="var_idx" notnull="notnull" pipe="and" /> <condition operation="equal" column="extra_vars.var_idx" var="var_idx" notnull="notnull" pipe="and" />
<condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" /> <condition operation="in" column="documents.status" var="statusList" pipe="and" />
<condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" /> <condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" />
<group pipe="and"> <group pipe="and">

View file

@ -1,33 +1,33 @@
<query id="getDocumentListWithinComment" action="select"> <query id="getDocumentListWithinComment" action="select">
<tables> <tables>
<table name="documents" alias="documents" /> <table name="documents" />
<table name="comments" alias="comments" /> <table name="comments" />
</tables> </tables>
<columns> <columns>
<column name="documents.document_srl" /> <column name="documents.*" />
<column name="documents.list_order" /> </columns>
</columns> <conditions>
<conditions> <condition operation="like" column="comments.content" var="s_comment" notnull="notnull" />
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" />
<condition operation="equal" column="documents.document_srl" default="comments.document_srl" notnull="notnull" pipe="and" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="more" column="documents.list_order" var="division" pipe="and" />
<condition operation="below" column="documents.list_order" var="last_division" pipe="and" />
</group>
<condition operation="like" column="comments.content" var="s_comment" notnull="notnull" pipe="and" />
<condition operation="equal" column="comments.is_secret" var="comment_is_secret" pipe="and" /> <condition operation="equal" column="comments.is_secret" var="comment_is_secret" pipe="and" />
</conditions> <condition operation="equal" column="documents.document_srl" default="comments.document_srl" pipe="and" />
<navigation> <condition operation="in" column="documents.module_srl" var="module_srl" filter="number" pipe="and" />
<index var="sort_index" default="comments.list_order" order="asc" /> <condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<list_count var="list_count" default="20" /> <condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<page_count var="page_count" default="10" /> <condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<page var="page" default="1" /> <condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
</navigation> <condition operation="in" column="documents.status" var="statusList" pipe="and" />
<groups> <condition operation="more" column="documents.list_order" var="division" pipe="and" />
<group column="documents.document_srl" /> <condition operation="below" column="documents.list_order" var="last_division" pipe="and" />
</groups> <condition operation="more" column="documents.last_update" var="start_date" pipe="and" />
<condition operation="less" column="documents.last_update" var="end_date" pipe="and" />
</conditions>
<groups>
<group column="documents.document_srl" />
</groups>
<navigation>
<index var="sort_index" default="documents.list_order" order="order_type" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query> </query>

View file

@ -11,6 +11,7 @@
<condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" /> <condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" /> <condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" />
<condition operation="equal" column="documents.document_srl" default="comments.document_srl" notnull="notnull" pipe="and" /> <condition operation="equal" column="documents.document_srl" default="comments.document_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" /> <condition operation="in" column="documents.status" var="statusList" pipe="and" />
<group pipe="and"> <group pipe="and">

View file

@ -1,27 +1,28 @@
<query id="getDocumentListWithinExtraVars" action="select"> <query id="getDocumentListWithinExtraVars" action="select">
<tables> <tables>
<table name="documents" /> <table name="documents" />
<table name="document_extra_vars" alias="extra_vars" /> <table name="document_extra_vars" alias="extra_vars" />
</tables> </tables>
<columns> <columns>
<column name="documents.*" /> <column name="documents.*" />
</columns> </columns>
<conditions> <conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" /> <condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.module_srl" var="module_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" /> <condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" /> <condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" /> <condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" /> <condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
<condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" /> <condition operation="in" column="documents.status" var="statusList" pipe="and" />
</conditions> <condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" />
<groups> </conditions>
<group column="extra_vars.document_srl" /> <groups>
</groups> <group column="extra_vars.document_srl" />
<navigation> </groups>
<index var="sort_index" default="documents.list_order" order="order_type" /> <navigation>
<list_count var="list_count" default="20" /> <index var="sort_index" default="documents.list_order" order="order_type" />
<page_count var="page_count" default="10" /> <list_count var="list_count" default="20" />
<page var="page" default="1" /> <page_count var="page_count" default="10" />
</navigation> <page var="page" default="1" />
</navigation>
</query> </query>

View file

@ -1,28 +1,32 @@
<query id="getDocumentListWithinTag" action="select"> <query id="getDocumentListWithinTag" action="select">
<tables> <tables>
<table name="documents" alias="documents" /> <table name="documents" />
<table name="tags" alias="tags" /> <table name="tags" />
</tables> </tables>
<columns> <columns>
<column name="documents.document_srl" /> <column name="documents.*" />
<column name="documents.list_order" /> </columns>
</columns> <conditions>
<conditions> <condition operation="like" column="tags.tag" var="s_tag" notnull="notnull" />
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" /> <condition operation="equal" column="documents.document_srl" default="tags.document_srl" pipe="and" />
<condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.module_srl" var="module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.document_srl" default="tags.document_srl" notnull="notnull" pipe="and" /> <condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="like" column="tags.tag" var="s_tags" notnull="notnull" pipe="and" /> <condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" /> <condition operation="in" column="documents.status" var="statusList" pipe="and" />
</conditions> <condition operation="more" column="documents.list_order" var="division" pipe="and" />
<navigation> <condition operation="below" column="documents.list_order" var="last_division" pipe="and" />
<index var="sort_index" default="documents.list_order" order="order_type" /> <condition operation="more" column="documents.last_update" var="start_date" pipe="and" />
<list_count var="list_count" default="20" /> <condition operation="less" column="documents.last_update" var="end_date" pipe="and" />
<page_count var="page_count" default="10" /> </conditions>
<page var="page" default="1" /> <groups>
</navigation> <group column="documents.document_srl" />
<groups> </groups>
<group column="documents.document_srl" /> <navigation>
</groups> <index var="sort_index" default="documents.list_order" order="order_type" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query> </query>

View file

@ -11,6 +11,7 @@
<condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" /> <condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.document_srl" default="tags.document_srl" notnull="notnull" pipe="and" /> <condition operation="equal" column="documents.document_srl" default="tags.document_srl" notnull="notnull" pipe="and" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.is_notice" var="s_is_notice" pipe="and" />
<condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" /> <condition operation="in" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="like" column="tags.tag" var="s_tags" notnull="notnull" pipe="and" /> <condition operation="like" column="tags.tag" var="s_tags" notnull="notnull" pipe="and" />
<group pipe="and"> <group pipe="and">

View file

@ -2015,11 +2015,16 @@ class moduleModel extends module
/** /**
* @brief Return privileges(granted) information by using module info, xml info and member info * @brief Return privileges(granted) information by using module info, xml info and member info
*/ */
function getGrant($module_info, $member_info, $xml_info = '') function getGrant($module_info, $member_info, $xml_info = null)
{ {
$__cache = &$GLOBALS['__MODULE_GRANT__'][$module_info->module][intval($module_info->module_srl)][intval($member_info->member_srl)]; if(empty($module_info->module))
{
$module_info = new stdClass;
$module_info->module = $module_info->module_srl = 0;
}
if (!$xml_info && is_object($__cache)) $__cache = &$GLOBALS['__MODULE_GRANT__'][$module_info->module][intval($module_info->module_srl)][intval($member_info->member_srl)];
if (is_object($__cache) && !$xml_info)
{ {
return $__cache; return $__cache;
} }
@ -2031,21 +2036,14 @@ class moduleModel extends module
{ {
$xml_info = $this->getModuleActionXml($module_info->module); $xml_info = $this->getModuleActionXml($module_info->module);
} }
$xml_grant_list = isset($xml_info->grant) ? (array)$xml_info->grant : array();
// Get group information of member // Get group information of member
if(is_array($member_info->group_list)) $member_group = !empty($member_info->group_list) ? array_keys($member_info->group_list) : array();
{ $is_module_admin = !empty($module_info->module_srl) ? $this->isModuleAdmin($member_info, $module_info->module_srl) : false;
$member_group = array_keys($member_info->group_list);
}
else
{
$member_group = array();
}
$is_module_admin = $module_info->module_srl ? $this->isModuleAdmin($member_info, $module_info->module_srl) : false;
// Get 'privilege name' list from module.xml // Get 'privilege name' list from module.xml
$privilege_list = array_keys((array) $xml_info->grant); $privilege_list = array_keys($xml_grant_list);
// Prepend default 'privilege name' // Prepend default 'privilege name'
// manager, is_site_admin not distinguish because of compatibility. // manager, is_site_admin not distinguish because of compatibility.
@ -2068,7 +2066,7 @@ class moduleModel extends module
$grant->{$val} = true; $grant->{$val} = true;
} }
// If module_srl doesn't exist, grant access // If module_srl doesn't exist, grant access
else if(!$module_info->module_srl && $val === 'access') else if(empty($module_info->module_srl) && $val === 'access')
{ {
$grant->{$val} = true; $grant->{$val} = true;
} }
@ -2143,41 +2141,38 @@ class moduleModel extends module
} }
// Grant privileges by default information of module // Grant privileges by default information of module
if(!empty($grant_list = (array) $xml_info->grant)) foreach($xml_grant_list as $name => $item)
{ {
foreach($grant_list as $name => $item) if(isset($checked[$name]) || $grant->{$name})
{ {
if(isset($checked[$name]) || $grant->{$name}) continue;
{ }
continue;
}
// All user // All user
if($item->default == 'guest') if($item->default == 'guest')
{
$grant->{$name} = true;
continue;
}
// Log-in member only
if($member_info->member_srl)
{
if($item->default == 'member')
{ {
$grant->{$name} = true; $grant->{$name} = true;
continue;
} }
else if($item->default == 'site')
// Log-in member only
if($member_info->member_srl)
{ {
if($item->default == 'member') // Grant if no information of the currently connected site exists
if(!Context::get('site_module_info')->site_srl)
{ {
$grant->{$name} = true; $grant->{$name} = true;
} }
else if($item->default == 'site') else if(count($member_group))
{ {
// Grant if no information of the currently connected site exists $grant->{$name} = true;
if(!Context::get('site_module_info')->site_srl)
{
$grant->{$name} = true;
}
else if(count($member_group))
{
$grant->{$name} = true;
}
} }
} }
} }

View file

@ -470,6 +470,7 @@ class pointController extends point
{ {
$message = sprintf(lang('msg_disallow_by_point'), abs($reader_point), $cur_point); $message = sprintf(lang('msg_disallow_by_point'), abs($reader_point), $cur_point);
$obj->add('content', $message); $obj->add('content', $message);
$GLOBALS['XE_EXTRA_VARS'][$obj->document_srl] = array();
$_SESSION['banned_document'][$obj->document_srl] = true; $_SESSION['banned_document'][$obj->document_srl] = true;
return new BaseObject(-1, $message); return new BaseObject(-1, $message);
} }