Note: this list is kept only as a demonstration for CVSNotice. For the latest CVS notices, see the Xaraya and Postnuke sites
View Statistics - Next Notice - Previous NoticeDirectory filter : [ all ] / postnuke_official / html / modules / categories [ view in CVS ]
| Date | Directory [filter] | File(s) [view] | Author [filter] |
| 13 Aug 2002 22:13:13 | postnuke_official/html/modules/categories | pnuserapi.php,1.8,1.9 | Mike |
| support AND-ing of categories for item selection/counting | |||
Update of /home/cvsroot/postnuke_official/html/modules/categories
In directory ns7.hostnuke.net:/tmp/cvs-serv12800
Modified Files:
pnuserapi.php
Log Message:
support AND-ing of categories for item selection/counting
Index: pnuserapi.php
===================================================================
RCS file: /home/cvsroot/postnuke_official/html/modules/categories/pnuserapi.php,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** pnuserapi.php 11 Aug 2002 00:49:48 -0000 1.8
--- pnuserapi.php 13 Aug 2002 22:13:11 -0000 1.9
***************
*** 301,309 ****
/**
* get links
! * @param $args['cids'] array of ids of categories to get linkage for
* @param $args['iids'] array of ids of itens to get linkage for
* @param $args['modid'] module�s ID
* @param $args['reverse'] if set to 1 the return will have as keys the 'iids'
* else the keys are the 'cids'
* @returns array
* @return item array, or false on failure
--- 301,312 ----
/**
* get links
! * @param $args['cids'] array of ids of categories to get linkage for (OR)
* @param $args['iids'] array of ids of itens to get linkage for
* @param $args['modid'] module�s ID
* @param $args['reverse'] if set to 1 the return will have as keys the 'iids'
* else the keys are the 'cids'
+ // TODO: better name for params
+ * @param $args['andcids'] array of ids of categories to get linkage for (AND)
+ * @param $args['numcids'] the number of categories you want to items grouped by
* @returns array
* @return item array, or false on failure
***************
*** 323,333 ****
// Get item IDs
! // Reverse the order if reverse is set to 1
! if ($reverse == 1) {
! $sql = 'SELECT ' . $categoriesdef['iid'] . ', ' . $categoriesdef['cid'];
! } else {
! $sql = 'SELECT ' . $categoriesdef['cid'] . ', ' . $categoriesdef['iid'];
! }
$sql .= ' FROM ' . $categoriesdef['table'];
if (!empty($categoriesdef['where'])) {
$sql .= ' WHERE ' . $categoriesdef['where'];
--- 326,334 ----
// Get item IDs
! $sql = 'SELECT ' . $categoriesdef['cid'] . ', ' . $categoriesdef['iid'];
$sql .= ' FROM ' . $categoriesdef['table'];
+ if (!empty($categoriesdef['more'])) {
+ $sql .= $categoriesdef['more'];
+ }
if (!empty($categoriesdef['where'])) {
$sql .= ' WHERE ' . $categoriesdef['where'];
***************
*** 347,351 ****
for(; !$result->EOF; $result->MoveNext())
{
! $answer[$result->fields[0]][] = $result->fields[1];
}
--- 348,368 ----
for(; !$result->EOF; $result->MoveNext())
{
! $fields = $result->fields;
! $iid = array_pop($fields);
! if ($reverse == 1) {
! // the list of categories is in the N first fields here
! if (isset($andcids) && count($andcids) > 1) {
! $answer[$iid] = $fields;
! } elseif (isset($numcids) && $numcids > 1) {
! $answer[$iid] = $fields;
! // we get 1 category per record here
! } else {
! $answer[$iid][] = $fields[0];
! }
! } else {
! // TODO: use multi-level array for multi-category grouping ?
! $cid = join('+',$fields);
! $answer[$cid][] = $iid;
! }
}
***************
*** 358,362 ****
/**
* count number of items
! * @param $args['cids'] array of cids that we are counting for
* @returns int
* @return number of items
--- 375,381 ----
/**
* count number of items
! * @param $args['cids'] optional array of cids we're counting for (OR)
! // TODO: better name for params
! * @param $args['andcids'] optional array of cids we're counting for (AND)
* @returns int
* @return number of items
***************
*** 385,390 ****
$categoriesdef = pnModAPIFunc('categories','user','leftjoin',$args);
! $sql = 'SELECT COUNT(DISTINCT ' . $categoriesdef['iid'];
$sql .= ' FROM ' . $categoriesdef['table'];
if (!empty($categoriesdef['where'])) {
$sql .= ' WHERE ' . $categoriesdef['where'];
--- 404,412 ----
$categoriesdef = pnModAPIFunc('categories','user','leftjoin',$args);
! $sql = 'SELECT COUNT(DISTINCT ' . $categoriesdef['iid'] . ')';
$sql .= ' FROM ' . $categoriesdef['table'];
+ if (!empty($categoriesdef['more'])) {
+ $sql .= $categoriesdef['more'];
+ }
if (!empty($categoriesdef['where'])) {
$sql .= ' WHERE ' . $categoriesdef['where'];
***************
*** 508,511 ****
--- 530,537 ----
* @param $args['groupby'] group entries by 'category' or by 'item'
* @param $args['modid'] module�s ID
+ * @param $args['cids'] optional array of cids we're counting for (OR)
+ // TODO: better name for params
+ * @param $args['andcids'] optional array of cids we're counting for (AND), or
+ * @param $args['numcids'] optional grouping of categories for counting (AND)
* @returns array
* @return number of items per category, or caterogies per item
***************
*** 541,544 ****
--- 567,573 ----
$sql = 'SELECT ' . $field . ', COUNT(*)';
$sql .= ' FROM ' . $categoriesdef['table'];
+ if (!empty($categoriesdef['more'])) {
+ $sql .= $categoriesdef['more'];
+ }
if (!empty($categoriesdef['where'])) {
$sql .= ' WHERE ' . $categoriesdef['where'];
***************
*** 555,559 ****
$count = array();
while (!$result->EOF) {
! list($id,$num) = $result->fields;
$count[$id] = $num;
$result->MoveNext();
--- 584,591 ----
$count = array();
while (!$result->EOF) {
! $fields = $result->fields;
! $num = array_pop($fields);
! // TODO: use multi-level array for multi-category grouping ?
! $id = join('+',$fields);
$count[$id] = $num;
$result->MoveNext();
***************
*** 629,634 ****
* @param $args['modid'] your module ID (use pnModGetIDFromName('mymodule'))
*
! * @param $args['cids'] optional array of category ids that we are selecting on
* @param $args['iids'] optional array of item ids that we are selecting on
* @returns array
* @return array('table' => 'nuke_categories_linkage',
--- 661,671 ----
* @param $args['modid'] your module ID (use pnModGetIDFromName('mymodule'))
*
! * @param $args['cids'] opt. array of category ids that we are selecting on (OR)
* @param $args['iids'] optional array of item ids that we are selecting on
+ // TODO: better name for params
+ * @param $args['andcids'] opt. array of category ids that we are selecting on
+ * (AND)
+ * @param $args['numcids'] the number of categories you want to group by/select
+ * for etc. (AND)
* @returns array
* @return array('table' => 'nuke_categories_linkage',
***************
*** 661,664 ****
--- 698,704 ----
$iids = array();
}
+ if (!isset($andcids)) {
+ $andcids = array();
+ }
// Security check
***************
*** 672,676 ****
// TODO: check this !
foreach ($cids as $cid) {
! if (!pnSecAuthAction(0, 'categories::category', 'ID::$cid', ACCESS_OVERVIEW)) {
$msg = pnML('Not authorized to view #(1) #(2)',
'category',pnVarPrepForStore($cid));
--- 712,725 ----
// TODO: check this !
foreach ($cids as $cid) {
! if (!pnSecAuthAction(0, 'categories::category', '::$cid', ACCESS_OVERVIEW)) {
! $msg = pnML('Not authorized to view #(1) #(2)',
! 'category',pnVarPrepForStore($cid));
! pnExceptionSet(PN_SYSTEM_EXCEPTION, 'NO_PERMISSION',
! new SystemException($msg));
! return array();
! }
! }
! foreach ($andcids as $cid) {
! if (!pnSecAuthAction(0, 'categories::category', '::$cid', ACCESS_OVERVIEW)) {
$msg = pnML('Not authorized to view #(1) #(2)',
'category',pnVarPrepForStore($cid));
***************
*** 691,694 ****
--- 740,753 ----
}
+ // dummy andcids array when we're going for x categories at a time
+ if (isset($numcids) && count($andcids) == 0) {
+ $isdummy = 1;
+ for ($i = 0; $i < $numcids; $i++) {
+ $andcids[] = $i;
+ }
+ } else {
+ $isdummy = 0;
+ }
+
// Table definition
$pntable = pnDBGetTables();
***************
*** 697,708 ****
$leftjoin = array();
// Add available columns in the categories table
$columns = array('cid','iid','modid');
foreach ($columns as $column) {
! $leftjoin[$column] = $categorieslinkagetable . '.pn_' . $column;
}
// Specify LEFT JOIN ... ON ... [WHERE ...] parts
! $leftjoin['table'] = $categorieslinkagetable;
$leftjoin['field'] = $leftjoin['iid'];
--- 756,795 ----
$leftjoin = array();
+ // create list of tables we'll be left joining for AND
+ if (count($andcids) > 0) {
+ $catlinks = array();
+ for ($i = 0; $i < count($andcids); $i++) {
+ $catlinks[] = 'catlink' . $i;
+ }
+ $linktable = $catlinks[0];
+ } else {
+ $linktable = $categorieslinkagetable;
+ }
+
// Add available columns in the categories table
$columns = array('cid','iid','modid');
foreach ($columns as $column) {
! $leftjoin[$column] = $linktable . '.pn_' . $column;
}
// Specify LEFT JOIN ... ON ... [WHERE ...] parts
! if (count($andcids) > 0) {
! $leftjoin['table'] = $categorieslinkagetable . ' as ' . $catlinks[0];
! $leftjoin['more'] = ' ';
! $leftjoin['cids'] = array();
! $leftjoin['cids'][] = $catlinks[0] . '.pn_cid';
! for ($i = 1; $i < count($catlinks); $i++) {
! $leftjoin['more'] .= ' LEFT JOIN ' . $categorieslinkagetable .
! ' as ' . $catlinks[$i] .
! ' ON ' . $leftjoin['iid'] . ' = ' .
! $catlinks[$i] . '.pn_iid' .
! ' AND ' . $leftjoin['modid'] . ' = ' .
! $catlinks[$i] . '.pn_modid ';
! $leftjoin['cids'][] = $catlinks[$i] . '.pn_cid';
! }
! } else {
! $leftjoin['table'] = $categorieslinkagetable;
! $leftjoin['more'] = '';
! }
$leftjoin['field'] = $leftjoin['iid'];
***************
*** 721,724 ****
--- 808,831 ----
$where[] = $leftjoin['iid'] . ' IN (' .
pnVarPrepForStore($alliids) . ')';
+ }
+ if (count($andcids) > 0) {
+ // select only the 1-2-4 combination, not the 2-1-4, 4-2-1, etc.
+ if ($isdummy) {
+ $oldcid = '';
+ foreach ($leftjoin['cids'] as $cid) {
+ if (!empty($oldcid)) {
+ $where[] .= $oldcid . ' < ' . $cid;
+ }
+ $oldcid = $cid;
+ }
+ // select the categories you wanted
+ } else {
+ for ($i = 0; $i < count($andcids); $i++) {
+ $where[] = $catlinks[$i] . '.pn_cid = ' .
+ pnVarPrepForStore($andcids[$i]);
+ }
+ }
+ // include all cids here
+ $leftjoin['cid'] = join(', ',$leftjoin['cids']);
}
if (count($where) > 0) {
View Statistics - Next Notice - Previous Notice
| Visit Developer Site - Browse CVS Repository |
Syndicate via backend.rss (max. once per hour please) | Powered by CVSNotice 0.1.3 |