public function getCategoryList($uid = 0) { $criteria = new CriteriaCompo(); if (!empty($uid)) { $criteria->add(new Criteria("uid", $uid)); } $criteria->setOrder("ASC"); $criteria->setSort("cat_id"); $categories = $this->getAll($criteria); $catarr = array(); if ($this->getCount($criteria)) { unset($criteria); $topic_handler = xoops_getmodulehandler("topics", "press"); $criteria = new CriteriaCompo(new Criteria("cat_id", "(" . implode(",", array_keys($categories)) . ")", "in")); if (!empty($uid)) { $criteria->add(new Criteria("uid", $uid)); } $criteria->setGroupby("cat_id"); $counts = $topic_handler->getCounts($criteria); foreach ($categories as $key => $obj) { $catarr[$key]["cat_name"] = $obj->getVar("cat_name"); $catarr[$key]["cat_id"] = $key; if (!empty($uid)) { $catarr[$key]["uid"] = $uid; } $catarr[$key]["cat_topics"] = isset($counts[$key]) ? $counts[$key] : 0; } return $catarr; } }
/** * recalc rankings of sql body part * * @access protected * @param object &$add_days_criteria * @param object &$sub_days_criteria * @param bool $update_sum flag for update sum tables * @return bool false if failure */ function _recalc_sql(&$add_days_criteria, &$sub_days_criteria, $update_sum) { global $xoopsDB; $config_names = array('visible', 'new_visible', 'num_rows', 'new_num_rows'); $config = array(); foreach ($config_names as $name) { $config[$name] = $this->_get_config($name); } $config['visible'] = explode(',', $config['visible']); $config['new_visible'] = explode(',', $config['new_visible']); // days criteria $days_criteria = new CriteriaCompo(); $days_criteria->add($add_days_criteria); if ($sub_days_criteria->render() != '') { $days_criteria->add($sub_days_criteria, 'OR'); } $add_days_sql = $add_days_criteria->render(); if ($add_days_sql == '') { $add_days_sql = '0'; } $sub_days_sql = $sub_days_criteria->render(); if ($sub_days_sql == '') { $sub_days_sql = '0'; } $etids = array(); if ($config['visible'][0] || $update_sum) { $etids[] = ETID_VIEW_ITEM; } if ($config['visible'][1] || $update_sum) { $etids[] = ETID_DOWNLOAD_FILE; } if ($config['visible'][2] || $update_sum) { $etids[] = ETID_CERTIFY_ITEM; } if ($config['visible'][3] || $update_sum) { $etids[] = ETID_QUICK_SEARCH; $etids[] = ETID_ADVANCED_SEARCH; } if ($config['visible'][4] || $update_sum) { $etids[] = ETID_REQUEST_CERTIFY_ITEM; } $new_etids = array(); if ($config['new_visible'][0] || $update_sum) { $new_etids[] = ETID_CERTIFY_ITEM; } if ($config['new_visible'][1] || $update_sum) { $new_etids[] = ETID_INSERT_GROUP; } $sum = $update_sum ? 'sum_' : ''; $log_table = $xoopsDB->prefix('xoonips_event_log'); $new_group_table = $xoopsDB->prefix('xoonips_ranking_' . $sum . 'new_group'); $new_item_table = $xoopsDB->prefix('xoonips_ranking_' . $sum . 'new_item'); if (count($etids)) { $etids_str = '(' . implode(',', $etids) . ')'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $etids_str, 'IN')); $criteria->add($days_criteria); $cnt = $this->handlers['event_log']->getCount($criteria); if ($cnt) { // log changed. need recalc. // ranking viewed item if ($config['visible'][0] || $update_sum) { $etid = ETID_VIEW_ITEM; $basename = $sum . 'viewed_item'; $fields = 'tb.item_id, SUM(' . $add_days_sql . ') - SUM(' . $sub_days_sql . ') AS count'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $etid)); $criteria->add($days_criteria); $criteria->setGroupby('tb.item_id'); $join_criteria = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id', 'INNER', 'tb'); $res =& $this->handlers['event_log']->open($criteria, $fields, false, $join_criteria); while ($obj =& $this->handlers['event_log']->getNext($res)) { $item_id = $obj->getVar('item_id', 'n'); $delta = $obj->getExtraVar('count'); if (!$this->handlers[$basename]->increment($item_id, $delta)) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } $this->handlers['event_log']->close($res); } // ranking downloaded item if ($config['visible'][1] || $update_sum) { $etid = ETID_DOWNLOAD_FILE; $basename = $sum . 'downloaded_item'; $fields = 'tb.item_id, SUM(' . $add_days_sql . ') - SUM(' . $sub_days_sql . ') AS count'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $etid)); $criteria->add($days_criteria); $criteria->setGroupby('tb.item_id'); $join_criteria = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id', 'INNER', 'tb'); $res =& $this->handlers['event_log']->open($criteria, $fields, false, $join_criteria); while ($obj =& $this->handlers['event_log']->getNext($res)) { $item_id = $obj->getVar('item_id', 'n'); $delta = $obj->getExtraVar('count'); if (!$this->handlers[$basename]->increment($item_id, $delta)) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } $this->handlers['event_log']->close($res); } // ranking contributing user if ($config['visible'][2] || $update_sum) { $etid = ETID_CERTIFY_ITEM; $basename = $sum . 'contributing_user'; $fields = 'tb.item_id, tb.uid, timestamp'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $etid)); $criteria->add($add_days_criteria); $join_criteria = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id', 'INNER', 'tb'); $res =& $this->handlers['event_log']->open($criteria, $fields, false, $join_criteria); while ($obj =& $this->handlers['event_log']->getNext($res)) { $item_id = $obj->getVar('item_id', 'n'); $uid = $obj->getVar('uid', 'n'); $timestamp = $obj->getVar('timestamp', 'n'); if (!$this->handlers[$basename]->replace($item_id, $uid, $timestamp)) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } $this->handlers['event_log']->close($res); // TODO: slow if $contributing_user_table.timestamp is not indexed. // use event_log.timestamp instead? $table = $xoopsDB->prefix('xoonips_ranking_' . $basename); $xoopsDB->queryF('DELETE FROM ' . $table . ' WHERE ' . str_replace('timestamp', 'UNIX_TIMESTAMP(timestamp)', $sub_days_sql)); } // ranking searched keyword if ($config['visible'][3] || $update_sum) { $etid = '(' . ETID_QUICK_SEARCH . ',' . ETID_ADVANCED_SEARCH . ')'; $basename = $sum . 'searched_keyword'; $fields = 'search_keyword, IF(' . $add_days_sql . ',1,-1) AS count'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $etid, 'IN')); $criteria->add($days_criteria); $res =& $this->handlers['event_log']->open($criteria, $fields); while ($obj =& $this->handlers['event_log']->getNext($res)) { $keyword = $obj->getVar('search_keyword', 'n'); $delta = $obj->getExtraVar('count'); // extract keywords from log $matches = array(); if (0 == preg_match('/(?:^|&)keyword=([^&]*)(?:&|$)/', $keyword, $matches)) { continue; } $keyword = urldecode($matches[1]); preg_match_all('/([^ "()]+)|(\\()|(\\))|"([^"]+)"/', $keyword, $match, PREG_SET_ORDER); $len = count($match); for ($i = 0; $i < $len; $i++) { if (isset($match[$i][1])) { $keyword = $match[$i][1]; } else { if (isset($match[$i][4])) { $keyword = $match[$i][4]; } else { continue; } } $keyword = strtolower($keyword); if ($keyword == 'and' || $keyword == 'or') { continue; } if (strlen($keyword) > 2) { if (!$this->handlers[$basename]->increment($keyword, $delta)) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } } } $this->handlers['event_log']->close($res); } // ranking active group if ($config['visible'][4] || $update_sum) { $etid = ETID_REQUEST_CERTIFY_ITEM; $basename = $sum . 'active_group'; $fields = 'tx.gid, IF(' . $add_days_sql . ',1,-1) AS dir, COUNT( DISTINCT timestamp, item_id, tx.gid ) AS count'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $etid)); $criteria->add($days_criteria); $criteria->add(new Criteria('ISNULL(tx.gid)', '0', '=')); $criteria->setGroupby('timestamp, item_id, tx.gid'); $join_criteria = new XooNIpsJoinCriteria('xoonips_index', 'index_id', 'index_id', 'INNER', 'tx'); $res =& $this->handlers['event_log']->open($criteria, $fields, false, $join_criteria); while ($obj =& $this->handlers['event_log']->getNext($res)) { $gid = $obj->getVar('gid', 'n'); $dir = $obj->getExtraVar('dir'); $delta = $obj->getExtraVar('count'); $delta *= $dir; if (!$this->handlers[$basename]->increment($gid, $delta)) { echo $this->handlers[$basename]->getLastSQL(); die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } $this->handlers['event_log']->close($res); } } } if (count($new_etids)) { $new_etids_str = '(' . implode(',', $new_etids) . ')'; $criteria = new CriteriaCompo(); $criteria->add(new Criteria('event_type_id', $new_etids_str, 'IN')); $criteria->add($days_criteria); $cnt = $this->handlers['event_log']->getCount($criteria); if ($cnt) { // log changed. need recalc. // ranking new item if ($config['new_visible'][0] || $update_sum) { // TODO: support 'REPLACE INTO ... (...) SELECT ...' query by object // handler $sql = 'REPLACE INTO ' . $new_item_table . ' ( item_id, timestamp ) SELECT t.item_id, FROM_UNIXTIME(timestamp) FROM ' . $log_table . ' AS t INNER JOIN ' . $xoopsDB->prefix('xoonips_index_item_link') . ' AS txil ON t.item_id=txil.item_id INNER JOIN ' . $xoopsDB->prefix('xoonips_index') . ' AS tx ON txil.index_id=tx.index_id WHERE tx.open_level=' . OL_PUBLIC . ' AND event_type_id=' . ETID_CERTIFY_ITEM . ' AND ( ' . $add_days_sql . ' ) GROUP BY t.item_id ORDER BY timestamp DESC LIMIT ' . $config['new_num_rows']; $result = $xoopsDB->queryF($sql); if ($result == false) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } // remove old entry if (!$this->handlers[$sum . 'new_item']->trim($config['new_num_rows'])) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } // ranking new group if ($config['new_visible'][1] || $update_sum) { // TODO: support 'REPLACE INTO ... (...) SELECT ...' query by object // handler $sql = 'REPLACE INTO ' . $new_group_table . ' ( gid, timestamp ) SELECT t.gid, FROM_UNIXTIME(timestamp) FROM ' . $log_table . ' AS t INNER JOIN ' . $xoopsDB->prefix('xoonips_groups') . ' AS tg ON t.gid=tg.gid WHERE tg.gid IS NOT NULL AND event_type_id=' . ETID_INSERT_GROUP . ' AND ( ' . $add_days_sql . ' ) ORDER BY timestamp DESC LIMIT ' . $config['new_num_rows']; $result = $xoopsDB->queryF($sql); if ($result == false) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } // remove old entry if (!$this->handlers[$sum . 'new_group']->trim($config['new_num_rows'])) { die('fatal error in ' . __FILE__ . ' at ' . __LINE__); } } } } }
$visibility = $visibility_handler->create(); $visibility->setVar('field_id', $_REQUEST['field_id']); $visibility->setVar('user_group', $_REQUEST['ug']); $visibility->setVar('profile_group', $_REQUEST['pg']); $visibility_handler->insert($visibility, true); } if ($op == "del") { $criteria = new CriteriaCompo(new Criteria('field_id', intval($_REQUEST['field_id']))); $criteria->add(new Criteria('user_group', intval($_REQUEST['ug']))); $criteria->add(new Criteria('profile_group', intval($_REQUEST['pg']))); $visibility_handler->deleteAll($criteria, true); redirect_header("visibility.php", 2, sprintf(_PROFILE_AM_DELETEDSUCCESS, _PROFILE_AM_PROF_VISIBLE)); exit; } $criteria = new CriteriaCompo(); $criteria->setGroupby("field_id, user_group, profile_group"); $visibilities = $visibility_handler->getAll($criteria); $member_handler = xoops_gethandler('member'); $groups = $member_handler->getGroupList(); $groups[0] = _PROFILE_AM_FIELDVISIBLETOALL; asort($groups); $GLOBALS['xoopsTpl']->assign('fields', $fields); $GLOBALS['xoopsTpl']->assign('visibilities', $visibilities); $GLOBALS['xoopsTpl']->assign('groups', $groups); $add_form = new XoopsSimpleForm('', 'addform', 'visibility.php'); $sel_field = new XoopsFormSelect(_PROFILE_AM_FIELDVISIBLE, 'field_id'); $sel_field->setExtra("style='width: 200px;'"); $sel_field->addOptionArray($fields); $add_form->addElement($sel_field); $sel_ug = new XoopsFormSelect(_PROFILE_AM_FIELDVISIBLEFOR, 'ug'); $sel_ug->addOptionArray($groups);
function _findDuplicateItemIds($item) { //Item A:title=A,B,C,C //Item B:title=A,B,B,C //Item C:title=A,B,C //Item D:title=A,B,C,C // //Item A != Item B //Item A != Item C //Item A == Item D //Item B != Item C //Item B != Item D //Item C != Item D global $xoopsDB, $xoopsUser; $basic =& $item->getVar('basic'); $title_handler =& xoonips_getormhandler('xoonips', 'title'); $titles = array(); foreach ($item->getVar('titles') as $title) { if (array_key_exists($title->get('title'), $titles)) { $titles[$title->get('title')]++; } else { $titles[$title->get('title')] = 1; } } // title matching // select item that has same number of each titles // $item_ids = array(); foreach ($titles as $title => $count) { $criteria = new CriteriaCompo(new Criteria('title', $title)); $criteria->add(new Criteria('item_type_id', $basic->get('item_type_id'))); $criteria->add(new Criteria('uid', $xoopsUser->getVar('uid'))); if (count($item_ids) > 0) { $criteria->add(new Criteria('tb.item_id', '(' . implode(',', $item_ids) . ')', 'IN')); } $criteria->setGroupby('tb.item_id,title having count(*)=' . $count); $join = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id', 'LEFT', 'tb'); $results =& $title_handler->getObjects($criteria, false, '*, count(*)', null, $join); $item_ids = array(); foreach ($results as $result) { $item_ids[] = $result->get('item_id'); } } if (count($item_ids) == 0) { // return only doi conflict item id // if no conflict items of title matching return $this->_findDoiConflictItemIds($item); } // // select item that has same number of title // $criteria = new Criteria('item_id', '(' . implode(',', $item_ids) . ')', 'IN'); $criteria->setGroupby('item_id having count(*)=' . count($item->getVar('titles'))); $titles =& $title_handler->getObjects($criteria); if (count($titles) == 0) { return array(); } // no conflict item $item_ids = array(); foreach ($titles as $title) { $item_ids[] = $title->get('item_id'); } $ids = array_unique(array_merge($item_ids, $this->_findDoiConflictItemIds($item))); return $ids; }
/** get ids of group-certified item. * @param gid * @return item_id[] */ function getCertifiedGroupItemIds($gid) { $index_item_link_handler =& xoonips_getormhandler('xoonips', 'index_item_link'); $join = new XooNIpsJoinCriteria('xoonips_index', 'index_id', 'index_id'); $criteria = new CriteriaCompo(); $criteria->add(new Criteria('gid', $gid)); $criteria->add(new Criteria('open_level', OL_GROUP_ONLY)); $criteria->add(new Criteria('certify_state', CERTIFIED)); $criteria->setGroupby('item_id'); $index_item_links =& $index_item_link_handler->getObjects($criteria, false, 'item_id', false, $join); $iids = array(); foreach ($index_item_links as $link) { $iids[] = $link->get('item_id'); } return $iids; }