예제 #1
0
 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__);
                 }
             }
         }
     }
 }
예제 #3
0
    $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;
 }