Example #1
0
/**
 * get the number of publications per publication type
 * @param $args['state'] array of requested status(es) for the publications
 * @return array array(id => count), or false on failure
 */
function publications_userapi_getpubcount($args)
{
    if (!empty($args['state'])) {
        $statestring = 'all';
    } else {
        if (is_array($args['state'])) {
            sort($args['state']);
            $statestring = join('+', $args['state']);
        } else {
            $statestring = $args['state'];
        }
    }
    if (xarVarIsCached('Publications.PubCount', $statestring)) {
        return xarVarGetCached('Publications.PubCount', $statestring);
    }
    $pubcount = array();
    $dbconn = xarDB::getConn();
    $tables = xarDB::getTables();
    sys::import('xaraya.structures.query');
    $q = new Query('SELECT', $tables['publications']);
    $q->addfield('pubtype_id');
    $q->addfield('COUNT(state) AS count');
    $q->addgroup('pubtype_id');
    if (!empty($args['state'])) {
    } else {
        if (is_array($args['state'])) {
            $q->in('state', $args['state']);
        } else {
            $q->eq('state', $args['state']);
        }
    }
    //    $q->qecho();
    if (!$q->run()) {
        return;
    }
    $pubcount = array();
    foreach ($q->output() as $key => $value) {
        $pubcount[$value['pubtype_id']] = $value['count'];
    }
    xarVarSetCached('Publications.PubCount', $statestring, $pubcount);
    return $pubcount;
}
Example #2
0
/**
 * view article map
 */
function publications_user_viewmap($args)
{
    // Get parameters
    if (!xarVarFetch('ptid', 'id', $ptid, xarModVars::get('publications', 'defaultpubtype'), XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('by', 'enum:pub:cat:grid', $by, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('go', 'str', $go, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('catid', 'str', $catid, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('cids', 'array', $cids, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    // Override if needed from argument array
    extract($args);
    $default = xarModVars::get('publications', 'defaultpubtype');
    if (empty($by)) {
        if (empty($default) && empty($ptid)) {
            $by = 'cat';
        } else {
            $by = 'pub';
        }
    }
    // turn $catid into $cids array (and set $andcids flag)
    if (!empty($catid)) {
        if (strpos($catid, ' ')) {
            $cids = explode(' ', $catid);
            $andcids = true;
        } elseif (strpos($catid, '+')) {
            $cids = explode('+', $catid);
            $andcids = true;
        } else {
            $cids = explode('-', $catid);
            $andcids = false;
        }
    }
    $seencid = array();
    if (isset($cids) && is_array($cids)) {
        foreach ($cids as $cid) {
            // make sure cids are numeric
            if (!empty($cid) && is_numeric($cid)) {
                $seencid[$cid] = 1;
            }
        }
        $cids = array_keys($seencid);
        sort($cids, SORT_NUMERIC);
    }
    // Get publication types
    sys::import('modules.dynamicdata.class.objects.master');
    $object = DataObjectMaster::getObjectList(array('name' => 'publications_types'));
    $data['pubtypes'] = $object->getItems();
    // redirect to filtered view
    if (!empty($go) && (!empty($ptid) || $by == 'cat')) {
        if (is_array($cids) && count($cids) > 0) {
            $catid = join('+', $cids);
        } else {
            $catid = NULL;
        }
        $url = xarModURL('publications', 'user', 'view', array('ptid' => $ptid, 'catid' => $catid));
        xarController::redirect($url);
        return;
    }
    $data['catfilter'] = array();
    $data['cattree'] = array();
    $data['catgrid'] = array();
    $dump = '';
    $publinks = array();
    if ($by == 'cat') {
        $data['maplink'] = xarModURL('publications', 'user', 'viewmap', array('by' => 'cat'));
        // TODO: re-evaluate this after user feedback...
        // *trick* Use the 'default' categories here, instead of all rootcats
        $basecats = xarModAPIFunc('categories', 'user', 'getallcatbases', array('module' => 'publications'));
        $catlist = array();
        foreach ($basecats as $basecat) {
            $catlist[$basecat['category_id']] = 1;
        }
        $data['basecids'] = array_keys($catlist);
        // create the category tree for each root category
        // TODO: make sure permissions are taken into account here !
        foreach ($catlist as $cid => $val) {
            if (empty($val)) {
                continue;
            }
            $data['cattree'][$cid] = xarModAPIFunc('publications', 'user', 'getchildcats', array('state' => array(PUBLICATIONS_STATE_APPROVED, PUBLICATIONS_STATE_FRONTPAGE), 'cid' => $cid, 'ptid' => null, 'showcid' => true));
        }
    } elseif ($by == 'grid') {
        $data['catgrid'][0] = array();
        $data['catgrid'][0][0] = '';
        // Get the base categories
        if (!empty($ptid)) {
            $rootcats = xarModAPIFunc('categories', 'user', 'getallcatbases', array('module' => 'publications', 'itemtype' => $ptid));
        } else {
            $rootcats = xarModAPIFunc('categories', 'user', 'getallcatbases', array('module' => 'publications', 'itemtype' => 0));
            $ptid = null;
        }
        if (count($rootcats) != 2) {
            $data['catgrid'][0][0] = xarML('You need 2 base categories in order to use this grid view');
        } else {
            $catlist = array();
            if (!empty($rootcats) && is_array($rootcats)) {
                foreach ($rootcats as $cid) {
                    $catlist[$catid['category_id']] = 1;
                }
            }
            $cattree = array();
            // Get the category tree for each base category
            foreach ($catlist as $cid => $val) {
                if (empty($val)) {
                    continue;
                }
                $cattree[$cid] = xarModAPIFunc('publications', 'user', 'getchildcats', array('state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'cid' => $cid, 'ptid' => $ptid, 'showcid' => true));
            }
            // Find out which category tree is the shortest
            if (count($cattree[$rootcats[0]]) > count($cattree[$rootcats[1]])) {
                $rowcat = $rootcats[0];
                $colcat = $rootcats[1];
            } else {
                $rowcat = $rootcats[1];
                $colcat = $rootcats[0];
            }
            // Fill in the column headers
            $row = 0;
            $col = 1;
            $colcid = array();
            foreach ($cattree[$colcat] as $info) {
                $data['catgrid'][$row][$col] = '<a href="' . $info['link'] . '">' . $info['name'] . '</a>';
                $colcid[$info['id']] = $col;
                $col++;
            }
            $maxcol = $col;
            // Fill in the row headers
            $row = 1;
            $col = 0;
            $data['catgrid'][$row] = array();
            $rowcid = array();
            foreach ($cattree[$rowcat] as $info) {
                $data['catgrid'][$row][$col] = '<a href="' . $info['link'] . '">' . $info['name'] . '</a>';
                $rowcid[$info['id']] = $row;
                $row++;
            }
            $maxrow = $row;
            // Initialise the rest of the array
            for ($row = 1; $row < $maxrow; $row++) {
                if (!isset($data['catgrid'][$row])) {
                    $data['catgrid'][$row] = array();
                }
                for ($col = 1; $col < $maxcol; $col++) {
                    $data['catgrid'][$row][$col] = '';
                }
            }
            // Get the counts for all groups of (N) categories
            $pubcatcount = xarModAPIFunc('publications', 'user', 'getpubcatcount', array('state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'ptid' => $ptid, 'groupcids' => 2, 'reverse' => 1));
            if (!empty($ptid)) {
                $what = $ptid;
            } else {
                $what = 'total';
            }
            // Fill in the count values
            foreach ($pubcatcount as $cids => $counts) {
                list($ca, $cb) = explode('+', $cids);
                if (isset($rowcid[$ca]) && isset($colcid[$cb])) {
                    $link = xarModURL('publications', 'user', 'view', array('ptid' => $ptid, 'catid' => $ca . '+' . $cb));
                    $data['catgrid'][$rowcid[$ca]][$colcid[$cb]] = '<a href="' . $link . '"> ' . $counts[$what] . ' </a>';
                }
                if (isset($rowcid[$cb]) && isset($colcid[$ca])) {
                    $link = xarModURL('publications', 'user', 'view', array('ptid' => $ptid, 'catid' => $cb . '+' . $ca));
                    $data['catgrid'][$rowcid[$cb]][$colcid[$ca]] = '<a href="' . $link . '"> ' . $counts[$what] . ' </a>';
                }
            }
        }
        if (!empty($ptid)) {
            $descr = $data['pubtypes'][$ptid]['description'];
        }
    } else {
        $data['maplink'] = xarModURL('publications', 'user', 'viewmap', array('by' => 'pub'));
        // get the links and counts for all publication types
        $publinks = xarModAPIFunc('publications', 'user', 'getpublinks', array('state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'all' => 1));
        // build the list of root categories for all publication types
        // and save results in publinks as well
        $catlist = array();
        for ($i = 0; $i < count($publinks); $i++) {
            $pubid = $publinks[$i]['pubid'];
            $cidstring = xarModVars::get('publications', 'mastercids.' . $pubid);
            if (!empty($cidstring)) {
                $rootcats = explode(';', $cidstring);
                foreach ($rootcats as $cid) {
                    $catlist[$cid] = 1;
                }
                $publinks[$i]['rootcats'] = $rootcats;
            } else {
                $publinks[$i]['rootcats'] = array();
            }
        }
        // for all publication types
        for ($i = 0; $i < count($publinks); $i++) {
            $publinks[$i]['cats'] = array();
            $pubid = $publinks[$i]['pubid'];
            // for each root category of this publication type
            foreach ($publinks[$i]['rootcats'] as $cid) {
                // add the category tree to the list of categories to show
                $childcats = xarModAPIFunc('publications', 'user', 'getchildcats', array('state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'cid' => $cid, 'ptid' => $pubid, 'showcid' => true));
                $publinks[$i]['cats'][] = $childcats;
            }
        }
        $array = array();
        if (empty($ptid)) {
            $ptid = $default;
        }
        if (!empty($ptid)) {
            for ($i = 0; $i < count($publinks); $i++) {
                if ($ptid == $publinks[$i]['pubid']) {
                    $array = $publinks[$i]['rootcats'];
                }
            }
        }
        foreach ($publinks as $pub) {
            if ($pub['pubid'] == $ptid) {
                $descr = $pub['pubtitle'];
            }
        }
    }
    if (empty($descr)) {
        $descr = xarML('Publications');
        $data['descr'] = '';
    } else {
        $data['descr'] = $descr;
    }
    // Save some variables to (temporary) cache for use in blocks etc.
    xarVarSetCached('Blocks.publications', 'ptid', $ptid);
    //if ($shownavigation) {
    xarVarSetCached('Blocks.categories', 'module', 'publications');
    xarVarSetCached('Blocks.categories', 'itemtype', $ptid);
    if (!empty($descr)) {
        xarVarSetCached('Blocks.categories', 'title', $descr);
        xarTplSetPageTitle(xarML('Map'), xarVarPrepForDisplay($descr));
    }
    //}
    if (empty($ptid)) {
        $ptid = null;
    }
    $data['publinks'] = $publinks;
    $data['ptid'] = $ptid;
    $data['viewlabel'] = xarML('Back to') . ' ' . $descr;
    $data['viewlink'] = xarModURL('publications', 'user', 'view', array('ptid' => $ptid));
    $data['archivelabel'] = xarML('View Archives');
    $data['archivelink'] = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid));
    $data['dump'] = $dump;
    if (count($data['catfilter']) == 2) {
    }
    if (!empty($ptid)) {
        $object = DataObjectMaster::getObject(array('name' => 'publications_types'));
        $object->getItem(array('itemid' => $ptid));
        $template = $object->properties['template']->value;
    } else {
        // TODO: allow templates per category ?
        $template = null;
    }
    // Pass the type of map to the template, so we can decide what links to show
    $data['by'] = $by;
    return xarTplModule('publications', 'user', 'viewmap', $data, $template);
}
Example #3
0
function publications_user_view($args)
{
    // Get parameters
    if (!xarVarFetch('ptid', 'id', $ptid, xarModVars::get('publications', 'defaultpubtype'), XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('startnum', 'int:0', $startnum, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('cids', 'array', $cids, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('andcids', 'str', $andcids, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('catid', 'str', $catid, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('itemtype', 'id', $itemtype, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    // TODO: put the query string through a proper parser, so searches on multiple words can be done.
    if (!xarVarFetch('q', 'pre:trim:passthru:str:1:200', $q, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    // can't use list enum here, because we don't know which sorts might be used
    // True - but we can provide some form of validation and normalisation.
    // The original 'regexp:/^[\w,]*$/' lets through *any* non-space character.
    // This validation will accept a list of comma-separated words, and will lower-case, trim
    // and strip out non-alphanumeric characters from each word.
    if (!xarVarFetch('sort', 'strlist:,:pre:trim:lower:alnum', $sort, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('numcols', 'int:0', $numcols, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('owner', 'id', $owner, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('pubdate', 'str:1', $pubdate, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    // This may not be set via user input, only e.g. via template tags, API calls, blocks etc.
    //    if(!xarVarFetch('startdate','int:0', $startdate, NULL, XARVAR_NOT_REQUIRED)) {return;}
    //    if(!xarVarFetch('enddate',  'int:0', $enddate,   NULL, XARVAR_NOT_REQUIRED)) {return;}
    //    if(!xarVarFetch('where',    'str',   $where,     NULL, XARVAR_NOT_REQUIRED)) {return;}
    // Added to impliment an Alpha Pager
    if (!xarVarFetch('letter', 'pre:lower:passthru:str:1:20', $letter, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    // Override if needed from argument array (e.g. ptid, numitems etc.)
    extract($args);
    $pubtypes = xarModAPIFunc('publications', 'user', 'get_pubtypes');
    // We need a valid pubtype number here
    if (!is_numeric($ptid) || !isset($pubtypes[$ptid])) {
        return xarResponse::NotFound();
    }
    // Constants used throughout.
    //
    // publications module ID
    $c_modid = xarMod::getID('publications');
    // state: front page or approved
    $c_posted = array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED);
    // Default parameters
    if (!isset($startnum)) {
        $startnum = 1;
    }
    // Check if we want the default 'front page'
    if (!isset($catid) && !isset($cids) && empty($ptid) && !isset($owner)) {
        $ishome = true;
        // default publication type
        $ptid = xarModVars::get('publications', 'defaultpubtype');
        // frontpage state
        $state = array(PUBLICATIONS_STATE_FRONTPAGE);
    } else {
        $ishome = false;
        // frontpage or approved state
        $state = $c_posted;
    }
    // Get the publication type for this display
    $data['pubtypeobject'] = DataObjectMaster::getObject(array('name' => 'publications_types'));
    $data['pubtypeobject']->getItem(array('itemid' => $ptid));
    // Get the settings of this publication type
    $data['settings'] = xarMod::apiFunc('publications', 'user', 'getsettings', array('ptid' => $ptid));
    // Get the template for this publication type
    if ($ishome) {
        $data['template'] = 'frontpage';
    } else {
        $data['template'] = $data['pubtypeobject']->properties['template']->getValue();
    }
    $isdefault = 0;
    // check default view for this type of publications
    if (empty($catid) && empty($cids) && empty($owner) && empty($sort)) {
        if (substr($data['settings']['defaultview'], 0, 1) == 'c') {
            $catid = substr($data['settings']['defaultview'], 1);
        }
    }
    // Do not transform titles if we are not transforming output at all.
    if (empty($data['settings']['do_transform'])) {
        $data['settings']['dotitletransform'] = 0;
    }
    // Page template for frontpage or depending on publication type (optional)
    // Note : this cannot be overridden in templates
    if (!empty($data['settings']['page_template'])) {
        xarTplSetPageTemplateName($data['settings']['page_template']);
    }
    if (empty($data['settings']['defaultsort'])) {
        $defaultsort = 'date';
    } else {
        $defaultsort = $data['settings']['defaultsort'];
    }
    if (empty($sort)) {
        $sort = $defaultsort;
    }
    // TODO: show this *after* category list when we start from categories :)
    // Navigation links
    $data['publabel'] = xarML('Publication');
    $data['publinks'] = xarModAPIFunc('publications', 'user', 'getpublinks', array('ptid' => $ishome ? '' : $ptid, 'state' => $c_posted, 'count' => $data['settings']['show_pubcount']));
    $data['pager'] = '';
    // Add Sort to data passed to template so that we can automatically turn on alpha pager, if needed
    $data['sort'] = $sort;
    // Add current display letter, so that we can highlight the current filter in the alpha pager
    $data['letter'] = $letter;
    // Get the users requested number of stories per page.
    // If user doesn't care, use the site default
    if (xarUserIsLoggedIn()) {
        // TODO: figure how to let users specify their settings
        // COMMENT: if the settings were split into separate module variables,
        // then they could all be individually over-ridden by each user.
        //$numitems = xarModUserGetVar('items_per_page');
    }
    if (empty($numitems)) {
        if (!empty($settings['items_per_page'])) {
            $numitems = $settings['items_per_page'];
        } else {
            $numitems = 20;
        }
    }
    // turn $catid into $cids array and set $andcids flag
    if (!empty($catid)) {
        if (strpos($catid, ' ')) {
            $cids = explode(' ', $catid);
            $andcids = true;
        } elseif (strpos($catid, '+')) {
            $cids = explode('+', $catid);
            $andcids = true;
        } elseif (strpos($catid, '-')) {
            $cids = explode('-', $catid);
            $andcids = false;
        } else {
            $cids = array($catid);
            if (strstr($catid, '_')) {
                $andcids = false;
                // don't combine with current category
            } else {
                $andcids = true;
            }
        }
    } else {
        if (empty($cids)) {
            $cids = array();
        }
        if (!isset($andcids)) {
            $andcids = true;
        }
    }
    // rebuild $catid in standard format again
    $catid = null;
    if (count($cids) > 0) {
        $seencid = array();
        foreach ($cids as $cid) {
            // make sure cids are numeric
            if (!empty($cid) && preg_match('/^_?[0-9]+$/', $cid)) {
                $seencid[$cid] = 1;
            }
        }
        $cids = array_keys($seencid);
        sort($cids, SORT_NUMERIC);
        if ($andcids) {
            $catid = join('+', $cids);
        } else {
            $catid = join('-', $cids);
        }
    }
    // every field you always wanted to know about but were afraid to ask for :)
    $extra = array();
    //    $extra[] = 'author';
    // Note: we always include cids for security checks now (= performance impact if show_categories was 0)
    $extra[] = 'cids';
    if ($data['settings']['show_hitcount']) {
        $extra[] = 'counter';
    }
    if ($data['settings']['show_ratings']) {
        $extra[] = 'rating';
    }
    $now = time();
    if (empty($startdate) || !is_numeric($startdate) || $startdate > $now) {
        $startdate = null;
    }
    if (empty($enddate) || !is_numeric($enddate) || $enddate > $now) {
        $enddate = $now;
    }
    if (empty($pubdate) || !preg_match('/^\\d{4}(-\\d+(-\\d+|)|)$/', $pubdate)) {
        $pubdate = null;
    }
    if (empty($where)) {
        $where = null;
    }
    // Modify the where clause if an Alpha filter has been specified.
    if (!empty($letter)) {
        // We will allow up to three initial letters, anything more than that is assumed to be 'Other'.
        // Need to also be very wary of SQL injection, since we are not using bind variables here.
        // TODO: take into account international characters.
        if (preg_match('/^[a-z]{1,3}$/i', $letter)) {
            $extrawhere = "title LIKE '{$letter}%'";
        } else {
            // Loop through the alphabet for the 'not in' part.
            $letterwhere = array();
            for ($i = ord('a'); $i <= ord('z'); $i++) {
                $letterwhere[] = "title NOT LIKE '" . chr($i) . "%'";
            }
            $extrawhere = implode(' and ', $letterwhere);
        }
        if ($where == null) {
            $where = $extrawhere;
        } else {
            $where .= $extrawhere;
        }
    }
    // Get publications
    $publications = xarModAPIFunc('publications', 'user', 'getall', array('startnum' => $startnum, 'cids' => $cids, 'andcids' => $andcids, 'ptid' => isset($ptid) ? $ptid : null, 'owner' => $owner, 'state' => $state, 'sort' => $sort, 'extra' => $extra, 'where' => $where, 'search' => $q, 'numitems' => $numitems, 'pubdate' => $pubdate, 'startdate' => $startdate, 'enddate' => $enddate));
    if (!is_array($publications)) {
        throw new Exception('Failed to retrieve publications');
    }
    // TODO : support different 'index' templates for different types of publications
    //        (e.g. News, Sections, ...), depending on what "view" the user
    //        selected (per category, per publication type, a combination, ...) ?
    if (!empty($owner)) {
        $data['author'] = xarUserGetVar('name', $owner);
        if (empty($data['author'])) {
            xarErrorHandled();
            $data['author'] = xarML('Unknown');
        }
    }
    if (!empty($pubdate)) {
        $data['pubdate'] = $pubdate;
    }
    // Save some variables to (temporary) cache for use in blocks etc.
    xarVarSetCached('Blocks.publications', 'ptid', $ptid);
    xarVarSetCached('Blocks.publications', 'cids', $cids);
    xarVarSetCached('Blocks.publications', 'owner', $owner);
    if (isset($data['author'])) {
        xarVarSetCached('Blocks.publications', 'author', $data['author']);
    }
    if (isset($data['pubdate'])) {
        xarVarSetCached('Blocks.publications', 'pubdate', $data['pubdate']);
    }
    // TODO: add this to publications configuration ?
    if ($ishome) {
        $data['ptid'] = null;
        if (xarSecurityCheck('SubmitPublications', 0)) {
            $data['submitlink'] = xarModURL('publications', 'admin', 'new');
        }
    } else {
        $data['ptid'] = $ptid;
        if (!empty($ptid)) {
            $curptid = $ptid;
        } else {
            $curptid = 'All';
        }
        if (count($cids) > 0) {
            foreach ($cids as $cid) {
                if (xarSecurityCheck('SubmitPublications', 0, 'Publication', "{$curptid}:{$cid}:All:All")) {
                    $data['submitlink'] = xarModURL('publications', 'admin', 'new', array('ptid' => $ptid, 'catid' => $catid));
                    break;
                }
            }
        } elseif (xarSecurityCheck('SubmitPublications', 0, 'Publication', "{$curptid}:All:All:All")) {
            $data['submitlink'] = xarModURL('publications', 'admin', 'new', array('ptid' => $ptid));
        }
    }
    $data['cids'] = $cids;
    $data['catid'] = $catid;
    xarVarSetCached('Blocks.categories', 'module', 'publications');
    xarVarSetCached('Blocks.categories', 'itemtype', $ptid);
    xarVarSetCached('Blocks.categories', 'cids', $cids);
    if (!empty($ptid) && !empty($pubtypes[$ptid]['description'])) {
        xarVarSetCached('Blocks.categories', 'title', $pubtypes[$ptid]['description']);
        // Note : this gets overriden by the categories navigation if necessary
        xarTplSetPageTitle(xarVarPrepForDisplay($pubtypes[$ptid]['description']));
    }
    // optional category count
    if ($data['settings']['show_catcount']) {
        if (!empty($ptid)) {
            $pubcatcount = xarModAPIFunc('publications', 'user', 'getpubcatcount', array('state' => $c_posted, 'ptid' => $ptid));
            if (isset($pubcatcount[$ptid])) {
                xarVarSetCached('Blocks.categories', 'catcount', $pubcatcount[$ptid]);
            }
            unset($pubcatcount);
        } else {
            $pubcatcount = xarModAPIFunc('publications', 'user', 'getpubcatcount', array('state' => $c_posted, 'reverse' => 1));
            if (isset($pubcatcount) && count($pubcatcount) > 0) {
                $catcount = array();
                foreach ($pubcatcount as $cat => $count) {
                    $catcount[$cat] = $count['total'];
                }
                xarVarSetCached('Blocks.categories', 'catcount', $catcount);
            }
            unset($pubcatcount);
        }
    } else {
        // xarVarSetCached('Blocks.categories','catcount',array());
    }
    // retrieve the number of comments for each article
    if (xarModIsAvailable('coments')) {
        if ($data['settings']['show_comments']) {
            $idlist = array();
            foreach ($publications as $article) {
                $idlist[] = $article['id'];
            }
            $numcomments = xarModAPIFunc('comments', 'user', 'get_countlist', array('modid' => $c_modid, 'objectids' => $idlist));
        }
    }
    // retrieve the keywords for each article
    if (xarModIsAvailable('coments')) {
        if ($data['settings']['show_keywords']) {
            $idlist = array();
            foreach ($publications as $article) {
                $idlist[] = $article['id'];
            }
            $keywords = xarModAPIFunc('keywords', 'user', 'getmultiplewords', array('modid' => $c_modid, 'objectids' => $idlist, 'itemtype' => $ptid));
        }
    }
    /* ------------------------------------------------------------
        // retrieve the categories for each article
        $catinfo = array();
        if ($show_categories) {
            $cidlist = array();
            foreach ($publications as $article) {
                if (!empty($article['cids']) && count($article['cids']) > 0) {
                     foreach ($article['cids'] as $cid) {
                         $cidlist[$cid] = 1;
                     }
                }
            }
            if (count($cidlist) > 0) {
                $catinfo = xarModAPIFunc('categories','user','getcatinfo', array('cids' => array_keys($cidlist)));
                // get root categories for this publication type
                // get base categories for all if needed
                $catroots = xarModAPIFunc('publications', 'user', 'getrootcats',
                    array('ptid' => $ptid, 'all' => true)
                );
            }
            foreach ($catinfo as $cid => $info) {
                $catinfo[$cid]['name'] = xarVarPrepForDisplay($info['name']);
                $catinfo[$cid]['link'] = xarModURL('publications', 'user', 'view',
                    array('ptid' => $ptid, 'catid' => (($catid && $andcids) ? $catid . '+' . $cid : $cid) )
                );
    
                // only needed when sorting by root category id
                $catinfo[$cid]['root'] = 0; // means not found under a root category
                // only needed when sorting by root category order
                $catinfo[$cid]['order'] = 0; // means not found under a root category
                $rootidx = 1;
                foreach ($catroots as $rootcat) {
                    // see if we're a child category of this rootcat (cfr. Celko model)
                    if ($info['left'] >= $rootcat['catleft'] && $info['left'] < $rootcat['catright']) {
                        // only needed when sorting by root category id
                        $catinfo[$cid]['root'] = $rootcat['catid'];
                        // only needed when sorting by root category order
                        $catinfo[$cid]['order'] = $rootidx;
                        break;
                    }
                    $rootidx++;
                }
            }
            // needed for sort function below
            $GLOBALS['artviewcatinfo'] = $catinfo;
        }
    
        $number = 0;
        foreach ($publications as $article)
        {
            // TODO: don't include ptid and catid if we don't use short URLs
            // link to article
            $article['link'] = xarModURL('publications', 'user', 'display',
                // don't include pubtype id if we're navigating by category
                array(
                    'ptid' => empty($ptid) ? null : $article['pubtype_id'],
                    'catid' => $catid,
                    'id' => $article['id']
                )
            );
    
            // N words/bytes more in article
            if (!empty($article['body'])) {
                // note : this is only an approximate number
                $wordcount = count(preg_split("/\s+/", strip_tags($article['body']), -1, PREG_SPLIT_NO_EMPTY));
                $article['words'] = $wordcount;
    
                // byte-count is less CPU-intensive -> make configurable ?
                $article['bytes'] = strlen($article['body']);
            } else {
                $article['words'] = 0;
                $article['bytes'] = 0;
            }
    
            // current publication type
            $curptid = $article['pubtype_id'];
    
            // TODO: make configurable?
            $article['redirect'] = xarModURL('publications', 'user', 'redirect',
                array('ptid' => $curptid, 'id' => $article['id'])
            );
    
    
            // multi-column display (default from left to right, then from top to bottom)
            $article['number'] = $number;
            if (!empty($settings['number_of_columns'])) {
                $col = $number % $settings['number_of_columns'];
            } else {
                $col = 0;
            }
    
            // RSS Processing
            $current_theme = xarVarGetCached('Themes.name', 'CurrentTheme');
            if (($current_theme == 'rss') or ($current_theme == 'atom')){
                $article['rsstitle'] = htmlspecialchars($article['title']);
                //$article['rssdate'] = strtotime($article['date']);
                $article['rsssummary'] = preg_replace('<br />', "\n", $article['summary']);
                $article['rsssummary'] = xarVarPrepForDisplay(strip_tags($article['rsssummary']));
                $article['rsscomment'] = xarModURL('comments', 'user', 'display', array('modid' => $c_modid, 'objectid' => $article['id']));
                // $article['rsscname'] = htmlspecialchars($item['cname']);
                // <category>#$rsscname#</category>
            }
    
            // TODO: clean up depending on field format
            if ($do_transform) {
                $article['itemtype'] = $article['pubtype_id'];
                // TODO: what about transforming DD fields?
                if ($title_transform) {
                    $article['transform'] = array('title', 'summary', 'body', 'notes');
                } else {
                    $article['transform'] = array('summary', 'body', 'notes');
                }
                $article = xarModCallHooks('item', 'transform', $article['id'], $article, 'publications');
            }
    
            $data['titles'][$article['id']] = $article['title'];
    
            // fill in the summary template for this article
            $summary_template = $pubtypes[$article['pubtype_id']]['name'];
            $number++;echo $number;
        }
    ------------------------------------------------------------ */
    unset($publications);
    // TODO: verify for other URLs as well
    if ($ishome) {
        if (!empty($numcols) && $numcols > 1) {
            // if we're currently showing more than 1 column
            $data['showcols'] = 1;
        } else {
            $defaultcols = $data['settings']['number_of_columns'];
            if ($defaultcols > 1) {
                // if the default number of columns is more than 1
                $data['showcols'] = $defaultcols;
            }
        }
    }
    // Specific layout within a template (optional)
    if (isset($layout)) {
        $data['layout'] = $layout;
    }
    // Get the publications we want to view
    $data['object'] = DataObjectMaster::getObject(array('name' => $data['pubtypeobject']->properties['name']->value));
    $data['objectname'] = $data['pubtypeobject']->properties['name']->value;
    $data['ptid'] = $ptid;
    //    $object = DataObjectMaster::getObjectList(array('name' => $data['pubtypeobject']->properties['name']->value));
    //    $data['items'] = $object->getItems();
    $data['object'] = DataObjectMaster::getObjectList(array('name' => $data['pubtypeobject']->properties['name']->value));
    // Get the items here
    //    $items = $data['object']->getItems();
    /* We're doing this in the template now
        // Only show top level documents, not translations
        sys::import('xaraya.structures.query');
        $q = new Query();
        $q->eq('parent_id',0);
        $q->eq('pubtype_id',$ptid);
        $q->eq('state',3);
    
        // Suppress deleted items
        // Remove this once listing property works with dataobject access
        $q->ne('state',0);
        $data['conditions'] = $q;
    */
    // Set the page template if needed
    if (!empty($data['settings']['page_template'])) {
        $pagename = $data['settings']['page_template'];
        $position = strpos($pagename, '.');
        if ($position === false) {
            $pagetemplate = $pagename;
        } else {
            $pagetemplate = substr($pagename, 0, $position);
        }
        xarTpl::setPageTemplateName($pagetemplate);
    }
    // Throw all the relevant settings we are using into the cache
    //    $data['settings']['pubtypeobject'] = $data['pubtypeobject']->properties['configuration']->getValue();
    //    xarCore::setCached('publications', 'context' . $ptid, $data['settings']);
    return xarTplModule('publications', 'user', 'view', $data, $data['template']);
}
Example #4
0
/**
 * show monthly archive (Archives-like)
 */
function publications_user_archive($args)
{
    // Get parameters from user
    if (!xarVarFetch('ptid', 'id', $ptid, xarModVars::get('publications', 'defaultpubtype'), XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('sort', 'enum:d:t:1:2', $sort, 'd', XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('month', 'str', $month, '', XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('cids', 'array', $cids, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('catid', 'str', $catid, '', XARVAR_NOT_REQUIRED)) {
        return;
    }
    // Override if needed from argument array
    extract($args);
    // Get publication types
    $pubtypes = xarModAPIFunc('publications', 'user', 'get_pubtypes');
    // Check that the publication type is valid
    if (empty($ptid) || !isset($pubtypes[$ptid])) {
        $ptid = null;
    }
    if (empty($ptid)) {
        if (!xarSecurityCheck('ViewPublications', 0, 'Publication', 'All:All:All:All')) {
            return xarML('You have no permission to view these items');
        }
    } elseif (!xarSecurityCheck('ViewPublications', 0, 'Publication', $ptid . ':All:All:All')) {
        return xarML('You have no permission to view these items');
    }
    $state = array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED);
    $seencid = array();
    $andcids = false;
    // turn $catid into $cids array and set $andcids flag
    if (!empty($catid)) {
        if (strpos($catid, ' ')) {
            $cids = explode(' ', $catid);
            $andcids = true;
        } elseif (strpos($catid, '+')) {
            $cids = explode('+', $catid);
            $andcids = true;
        } elseif (strpos($catid, '-')) {
            $cids = explode('-', $catid);
            $andcids = false;
        } else {
            $cids = array($catid);
            if (strstr($catid, '_')) {
                $andcids = false;
                // don't combine with current category
            } else {
                $andcids = true;
            }
        }
    }
    if (isset($cids) && is_array($cids)) {
        foreach ($cids as $cid) {
            if (!empty($cid) && preg_match('/^_?[0-9]+$/', $cid)) {
                $seencid[$cid] = 1;
            }
        }
        $cids = array_keys($seencid);
        sort($cids, SORT_NUMERIC);
        if (empty($catid) && count($cids) > 1) {
            $andcids = true;
        }
    } else {
        $cids = null;
    }
    // QUESTION: work with user-dependent time settings or not someday ?
    // Set the start and end date for that month
    if (!empty($month) && preg_match('/^(\\d{4})-(\\d+)$/', $month, $matches)) {
        $startdate = gmmktime(0, 0, 0, $matches[2], 1, $matches[1]);
        // PHP allows month > 12 :-)
        $enddate = gmmktime(0, 0, 0, $matches[2] + 1, 1, $matches[1]);
        if ($enddate > time()) {
            $enddate = time();
        }
    } else {
        $startdate = '';
        $enddate = time();
        if (!empty($month) && $month != 'all') {
            $month = '';
        }
    }
    // Load API
    if (!xarModAPILoad('publications', 'user')) {
        return;
    }
    if (!empty($ptid) && !empty($pubtypes[$ptid]['config']['pubdate']['label'])) {
        $showdate = 1;
    } else {
        $showdate = 0;
        foreach (array_keys($pubtypes) as $pubid) {
            if (!empty($pubtypes[$pubid]['config']['pubdate']['label'])) {
                $showdate = 1;
                break;
            }
        }
    }
    // Get monthly statistics
    $monthcount = xarModAPIFunc('publications', 'user', 'getmonthcount', array('ptid' => $ptid, 'state' => $state, 'enddate' => time()));
    if (empty($monthcount)) {
        $monthcount = array();
    }
    krsort($monthcount);
    reset($monthcount);
    $months = array();
    $total = 0;
    foreach ($monthcount as $thismonth => $count) {
        if ($thismonth == $month) {
            $mlink = '';
        } else {
            $mlink = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid, 'month' => $thismonth));
        }
        $months[] = array('month' => $thismonth, 'mcount' => $count, 'mlink' => $mlink);
        $total += $count;
    }
    if (empty($ptid)) {
        $thismonth = xarML('All Publications');
    } else {
        $thismonth = xarML('All') . ' ' . $pubtypes[$ptid]['description'];
    }
    if ($month == 'all') {
        $mlink = '';
    } else {
        $mlink = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid, 'month' => 'all'));
    }
    $months[] = array('month' => $thismonth, 'mcount' => $total, 'mlink' => $mlink);
    // Load API
    if (!xarModAPILoad('categories', 'user')) {
        return;
    }
    // Get the list of root categories for this publication type
    if (!empty($ptid)) {
        $rootcats = xarModAPIFunc('categories', 'user', 'getallcatbases', array('module' => 'publications', 'itemtype' => $ptid));
    } else {
        $rootcats = xarModAPIFunc('categories', 'user', 'getallcatbases', array('module' => 'publications', 'itemtype' => 0));
    }
    $catlist = array();
    $catinfo = array();
    $catsel = array();
    if (!empty($rootcats)) {
        // TODO: do this in categories API ?
        $count = 1;
        foreach ($rootcats as $cid) {
            if (empty($cid)) {
                continue;
            }
            // save the name and root category for each child
            $cats = xarModAPIFunc('categories', 'user', 'getcat', array('cid' => $cid['category_id'], 'return_itself' => true, 'getchildren' => true));
            foreach ($cats as $info) {
                $item = array();
                $item['name'] = $info['name'];
                $item['root'] = $cid['category_id'];
                $catinfo[$info['cid']] = $item;
            }
            // don't allow sorting by category when viewing all publications
            //if ($sort == $count || $month == 'all') {
            if ($sort == $count) {
                $link = '';
            } else {
                $link = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid, 'month' => $month, 'sort' => $count));
            }
            // catch more faulty categories assignments
            if (isset($catinfo[$cid['category_id']])) {
                $catlist[] = array('cid' => $cid['category_id'], 'name' => $catinfo[$cid['category_id']]['name'], 'link' => $link);
                $catsel[] = xarModAPIFunc('categories', 'visual', 'makeselect', array('cid' => $cid['category_id'], 'return_itself' => true, 'select_itself' => true, 'values' => &$seencid, 'multiple' => 0));
                $count++;
            }
        }
    }
    // Get publications
    if ($month == 'all' || $startdate && $enddate) {
        $publications = xarModAPIFunc('publications', 'user', 'getall', array('ptid' => isset($ptid) ? $ptid : null, 'startdate' => $startdate, 'enddate' => $enddate, 'state' => $state, 'cids' => $cids, 'andcids' => $andcids, 'fields' => array('id', 'title', 'start_date', 'pubtype_id', 'cids')));
        if (!is_array($publications)) {
            $msg = xarML('Failed to retrieve publications in #(3)_#(1)_#(2).php', 'user', 'getall', 'publications');
            throw new DataNotFoundException(null, $msg);
        }
    } else {
        $publications = array();
    }
    // TODO: add print / recommend_us link for each article ?
    // TODO: add view count to table/query/template someday ?
    foreach ($publications as $key => $article) {
        $publications[$key]['link'] = xarModURL('publications', 'user', 'display', array('ptid' => isset($ptid) ? $publications[$key]['pubtype_id'] : null, 'id' => $publications[$key]['id']));
        if (empty($publications[$key]['title'])) {
            $publications[$key]['title'] = xarML('(none)');
        }
        /* TODO: move date formatting to template, delete this code after testing
                if ($showdate && !empty($publications[$key]['pubdate'])) {
                    $publications[$key]['date'] = xarLocaleFormatDate("%Y-%m-%d %H:%M:%S",
                                                       $publications[$key]['pubdate']);
                } else {
                    $publications[$key]['date'] = '';
                }
        */
        // TODO: find some better way to do this...
        $list = array();
        // get all the categories for that article and put them under the
        // right root category
        if (!isset($publications[$key]['cids'])) {
            $publications[$key]['cids'] = array();
        }
        foreach ($publications[$key]['cids'] as $cid) {
            // skip unknown categories (e.g. when not under root categories)
            if (!isset($catinfo[$cid])) {
                continue;
            }
            if (!isset($list[$catinfo[$cid]['root']])) {
                $list[$catinfo[$cid]['root']] = array();
            }
            array_push($list[$catinfo[$cid]['root']], $cid);
        }
        // fill in the column corresponding to each root category
        $publications[$key]['cats'] = array();
        foreach ($catlist as $cat) {
            if (isset($list[$cat['cid']])) {
                $descr = '';
                // TODO: add links to category someday ?
                foreach ($list[$cat['cid']] as $cid) {
                    if (!empty($descr)) {
                        $descr .= '<br />';
                    }
                    $descr .= $catinfo[$cid]['name'];
                }
                $publications[$key]['cats'][] = array('list' => $descr);
            } else {
                $publications[$key]['cats'][] = array('list' => '-');
            }
        }
    }
    // sort publications as requested
    if ($sort == 2 && count($catlist) > 1) {
        usort($publications, 'publications_archive_sortbycat10');
    } elseif ($sort == 1) {
        if (count($catlist) > 1) {
            usort($publications, 'publications_archive_sortbycat01');
        } elseif (count($catlist) > 0) {
            usort($publications, 'publications_archive_sortbycat0');
        }
    } elseif ($sort == 't') {
        usort($publications, 'publications_archive_sortbytitle');
    } else {
        $sort = 'd';
        // default sort by date is already done in getall() function
    }
    // add title header
    if ($sort == 't') {
        $link = '';
    } else {
        $link = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid, 'month' => $month, 'sort' => 't'));
    }
    $catlist[] = array('cid' => 0, 'name' => xarML('Title'), 'link' => $link);
    $catsel[] = '<input type="submit" value="' . xarML('Filter') . '" />';
    if ($showdate) {
        // add date header
        if ($sort == 'd') {
            $link = '';
        } else {
            $link = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid, 'month' => $month));
        }
        $catlist[] = array('cid' => 0, 'name' => xarML('Date'), 'link' => $link);
        $catsel[] = '&#160;';
    }
    // Save some variables to (temporary) cache for use in blocks etc.
    xarVarSetCached('Blocks.publications', 'ptid', $ptid);
    if (!empty($cids)) {
        xarVarSetCached('Blocks.publications', 'cids', $cids);
    }
    //if ($shownavigation) {
    xarVarSetCached('Blocks.categories', 'module', 'publications');
    xarVarSetCached('Blocks.categories', 'itemtype', $ptid);
    if (!empty($ptid) && !empty($pubtypes[$ptid]['description'])) {
        xarVarSetCached('Blocks.categories', 'title', $pubtypes[$ptid]['description']);
        xarTplSetPageTitle(xarML('Archive'), $pubtypes[$ptid]['description']);
    } else {
        xarTplSetPageTitle(xarML('Archive'));
    }
    //}
    if (!empty($ptid)) {
        $settings = unserialize(xarModVars::get('publications', 'settings.' . $ptid));
    } else {
        $string = xarModVars::get('publications', 'settings');
        if (!empty($string)) {
            $settings = unserialize($string);
        }
    }
    if (!isset($show_publinks)) {
        if (!empty($settings['show_publinks'])) {
            $show_publinks = 1;
        } else {
            $show_publinks = 0;
        }
    }
    // show the number of publications for each publication type
    if (!isset($show_pubcount)) {
        if (!isset($settings['show_pubcount']) || !empty($settings['show_pubcount'])) {
            $show_pubcount = 1;
            // default yes
        } else {
            $show_pubcount = 0;
        }
    }
    //    $show_catcount = 0; // unused here
    // return template out
    $data = array('months' => $months, 'publications' => $publications, 'catlist' => $catlist, 'catsel' => $catsel, 'ptid' => $ptid, 'month' => $month, 'curlink' => xarModURL('publications', 'user', 'archive', array('ptid' => $ptid, 'month' => $month, 'sort' => $sort)), 'showdate' => $showdate, 'show_publinks' => $show_publinks, 'publabel' => xarML('Publication'), 'publinks' => xarModAPIFunc('publications', 'user', 'getpublinks', array('ptid' => $ptid, 'state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'count' => $show_pubcount, 'func' => 'archive')), 'maplabel' => xarML('View Publication Map'), 'maplink' => xarModURL('publications', 'user', 'viewmap', array('ptid' => $ptid)), 'viewlabel' => empty($ptid) ? xarML('Back to Publications') : xarML('Back to') . ' ' . $pubtypes[$ptid]['description'], 'viewlink' => xarModURL('publications', 'user', 'view', array('ptid' => $ptid)));
    if (!empty($ptid)) {
        $template = $pubtypes[$ptid]['name'];
    } else {
        // TODO: allow templates per category ?
        $template = null;
    }
    return xarTplModule('publications', 'user', 'archive', $data, $template);
}
Example #5
0
 public function display()
 {
     $vars = $this->getContent();
     if (!empty($vars) && is_array($vars)) {
         extract($vars);
     }
     // Get requested layout
     if (empty($layout)) {
         $layout = 1;
         // default tree here
     }
     if (!empty($startmodule)) {
         // static behaviour
         list($module, $itemtype, $rootcid) = explode('.', $startmodule);
         if (empty($rootcid)) {
             $rootcids = null;
         } elseif (strpos($rootcid, ' ')) {
             $rootcids = explode(' ', $rootcid);
         } elseif (strpos($rootcid, '+')) {
             $rootcids = explode('+', $rootcid);
         } else {
             $rootcids = explode('-', $rootcid);
         }
     }
     // TODO: for multi-module pages, we'll need some other reference point(s)
     //       (e.g. cross-module categories defined in categories admin ?)
     // Get current module
     if (empty($module)) {
         if (xarVarIsCached('Blocks.categories', 'module')) {
             $modname = xarVarGetCached('Blocks.categories', 'module');
         }
         if (empty($modname)) {
             $modname = xarModGetName();
         }
     } else {
         $modname = $module;
     }
     $modid = xarModGetIDFromName($modname);
     if (empty($modid)) {
         return;
     }
     // Get current item type (if any)
     if (!isset($itemtype)) {
         if (xarVarIsCached('Blocks.categories', 'itemtype')) {
             $itemtype = xarVarGetCached('Blocks.categories', 'itemtype');
         } else {
             // try to get itemtype from input
             xarVarFetch('itemtype', 'isset', $itemtype, NULL, XARVAR_DONT_SET);
             if (empty($itemtype)) {
                 xarVarFetch('ptid', 'isset', $itemtype, NULL, XARVAR_DONT_SET);
             }
             // if
         }
     }
     if (empty($itemtype)) {
         $itemtype = null;
     }
     // Get current item id (if any)
     if (!isset($itemid)) {
         if (xarVarIsCached('Blocks.categories', 'itemid')) {
             $itemid = xarVarGetCached('Blocks.categories', 'itemid');
         } else {
             // try to get itemid from input
             xarVarFetch('itemid', 'isset', $itemid, NULL, XARVAR_DONT_SET);
             if (empty($itemid)) {
                 xarVarFetch('id', 'isset', $itemid, NULL, XARVAR_DONT_SET);
             }
             // if
         }
     }
     if (empty($itemid)) {
         $itemid = null;
     }
     if (isset($rootcids)) {
         $mastercids = $rootcids;
     } else {
         // Get number of categories for this module + item type
         $numcats = xarModAPIfunc('categories', 'user', 'countcatbases', array('module' => $modname, 'itemtype' => empty($itemtype) ? NULL : $itemtype));
         if (empty($numcats)) {
             // no categories to show here -> return empty output
             return;
         }
         // Get master cids for this module + item type
         $mastercids = xarModAPIfunc('categories', 'user', 'getallcatbases', array('module' => $modname, 'format' => 'cids', 'order' => 'cid', 'itemtype' => empty($itemtype) ? NULL : $itemtype));
         if (empty($mastercids)) {
             // no categories to show here -> return empty output
             return;
         }
         $mastercids = array_unique($mastercids);
         if (!empty($startmodule)) {
             $rootcids = $mastercids;
         }
     }
     // See if we need to show a count per category
     if (!isset($show_catcount)) {
         $show_catcount = 0;
     }
     // See if we need to show the children of current categories
     if (!isset($showchildren)) {
         $showchildren = 1;
     }
     // Get current category counts (optional array of cid => count)
     if (empty($show_catcount)) {
         $catcount = array();
     }
     if (empty($showempty) || !empty($show_catcount)) {
         // A 'deep count' sums the totals at each node with the totals of all descendants.
         if (xarVarIsCached('Blocks.categories', 'deepcount')) {
             $deepcount = xarVarGetCached('Blocks.categories', 'deepcount');
         } else {
             $deepcount = xarModAPIFunc('categories', 'user', 'deepcount', array('modid' => $modid, 'itemtype' => $itemtype));
             xarVarSetCached('Blocks.categories', 'deepcount', $deepcount);
         }
     }
     if (!empty($show_catcount)) {
         if (xarVarIsCached('Blocks.categories', 'catcount')) {
             $catcount = xarVarGetCached('Blocks.categories', 'catcount');
         } else {
             // Get number of items per category (for this module).
             // If show_catcount == 2 then add in all descendants too.
             if ($show_catcount == 1) {
                 // We want to display only children category counts.
                 $catcount = xarModAPIFunc('categories', 'user', 'groupcount', array('modid' => $modid, 'itemtype' => $itemtype));
             } else {
                 // We want to display the deep counts.
                 $catcount =& $deepcount;
             }
             xarVarSetCached('Blocks.categories', 'catcount', $catcount);
         }
     }
     // Specify type=... & func = ... arguments for xarModURL()
     if (empty($type)) {
         if (xarVarIsCached('Blocks.categories', 'type')) {
             $type = xarVarGetCached('Blocks.categories', 'type');
         }
         if (empty($type)) {
             $type = 'user';
         }
     }
     if (empty($func)) {
         if (xarVarIsCached('Blocks.categories', 'func')) {
             $func = xarVarGetCached('Blocks.categories', 'func');
         }
         if (empty($func)) {
             $func = 'view';
         }
     }
     // Get current categories
     if (xarVarIsCached('Blocks.categories', 'catid')) {
         $catid = xarVarGetCached('Blocks.categories', 'catid');
     }
     if (empty($catid)) {
         // try to get catid from input
         xarVarFetch('catid', 'isset', $catid, NULL, XARVAR_DONT_SET);
     }
     // turn $catid into $cids array (and set $andcids flag)
     $istree = 0;
     if (!empty($catid)) {
         // if we're viewing all items below a certain category, i.e. catid = _NN
         if (strstr($catid, '_')) {
             $catid = preg_replace('/_/', '', $catid);
             $istree = 1;
         }
         if (strpos($catid, ' ')) {
             $cids = explode(' ', $catid);
             $andcids = true;
         } elseif (strpos($catid, '+')) {
             $cids = explode('+', $catid);
             $andcids = true;
         } else {
             $cids = explode('-', $catid);
             $andcids = false;
         }
     } elseif (empty($cids)) {
         if (xarVarIsCached('Blocks.categories', 'cids')) {
             $cids = xarVarGetCached('Blocks.categories', 'cids');
         }
         if (xarVarIsCached('Blocks.categories', 'andcids')) {
             $andcids = xarVarGetCached('Blocks.categories', 'andcids');
         }
         if (empty($cids)) {
             // try to get cids from input
             xarVarFetch('cids', 'isset', $cids, NULL, XARVAR_DONT_SET);
             xarVarFetch('andcids', 'isset', $andcids, false, XARVAR_NOT_REQUIRED);
             if (empty($cids)) {
                 $cids = array();
                 if ((empty($module) || $module == $modname) && !empty($itemid)) {
                     $links = xarModAPIFunc('categories', 'user', 'getlinks', array('modid' => $modid, 'itemtype' => $itemtype, 'iids' => array($itemid)));
                     if (!empty($links) && count($links) > 0) {
                         $cids = array_keys($links);
                     }
                 }
             }
         }
     }
     if (count($cids) > 0) {
         $seencid = array();
         foreach ($cids as $cid) {
             if (empty($cid) || !is_numeric($cid)) {
                 continue;
             }
             $seencid[$cid] = 1;
         }
         $cids = array_keys($seencid);
     }
     $data = array();
     $data['cids'] = $cids;
     // pass information about current module, item type and item id (if any) to template
     $data['module'] = $modname;
     $data['itemtype'] = $itemtype;
     $data['itemid'] = $itemid;
     // pass information about current function to template
     $data['type'] = $type;
     $data['func'] = $func;
     $blockinfo['content'] = '';
     // Generate output
     switch ($layout) {
         case 3:
             // menu category
             $template = 'menu';
             break;
         case 2:
             // crumbtrails
             $template = 'trails';
             $data['cattrees'] = array();
             if (empty($cids) || sizeof($cids) <= 0) {
                 return;
             }
             // if
             $cid = current($cids);
             $data['cid'] = $cid;
             # Get category parents
             $parents = xarModAPIFunc('categories', 'user', 'getparents', array('cid' => $cid));
             if (empty($parents)) {
                 return;
             }
             // if
             $root = '';
             $parentid = 0;
             foreach ($parents as $id => $info) {
                 $publications = xarModAPIFunc('publications', 'user', 'getall', array('cid' => $info['cid'], 'ptid' => $itemtype, 'fields' => array('id', 'title')));
                 foreach ($publications as $k => $article) {
                     $publications[$article['title']] = $article['id'];
                     unset($publications[$k]);
                 }
                 // foreach
                 $label = xarVarPrepForDisplay($info['name']);
                 if (isset($publications[$label])) {
                     $link = xarModURL($modname, $type, 'display', array('ptid' => $itemtype, 'catid' => $info['cid'], 'id' => $publications[$label]));
                 } else {
                     $link = xarModURL($modname, $type, $func, array('itemtype' => $itemtype, 'catid' => $info['cid']));
                 }
                 // if
                 if (empty($root)) {
                     $link = xarModURL('', '', '');
                     $root = $label;
                 }
                 // if
                 if (!empty($catcount[$info['cid']])) {
                     $count = $catcount[$info['cid']];
                 } else {
                     $count = 0;
                 }
                 // if
                 $catparents[] = array('catlabel' => $label, 'catid' => $info['cid'], 'catlink' => $link, 'catcount' => $count);
             }
             // foreach
             $data['cattrees'][] = array('catparents' => $catparents);
             $data['crumbSeparator'] = '&#160;>&#160;';
             break;
         case 1:
             // tree
         // tree
         default:
             $template = 'tree';
             $data['cattrees'] = array();
             if (empty($cids) || sizeof($cids) <= 0) {
                 return;
             }
             // if
             $cid = current($cids);
             $cat = xarModAPIFunc('categories', 'user', 'getcatinfo', array('cid' => $cid));
             $blockinfo['title'] = xarVarPrepForDisplay($cat['name']);
             if (isset($cat['blockimage'])) {
                 $data['catimage'] = $cat['blockimage'];
             }
             // if
             # Get child categories
             $childrenCategories = xarModAPIFunc('categories', 'user', 'getchildren', array('cid' => $cid));
             # get all the pubtypes so we can digest the ids
             $pubtypes = xarModAPIFunc('publications', 'user', 'get_pubtypes', array());
             # get immediate items in current category
             $items = xarModAPIFunc('publications', 'user', 'getall', array('cids' => array($cid), 'fields' => array('id', 'pubtype_id', 'title')));
             $tmpPublications = array();
             foreach ($items as $k => $item) {
                 if (strtolower($item['title']) == strtolower($cat['name'])) {
                     unset($items[$k]);
                 } else {
                     $label = xarVarPrepForDisplay($item['title']);
                     $class = $item['id'] == $itemid ? 'xar-menu-item-current' : 'xar-menu-item';
                     $link = xarModURL($modname, $type, 'display', array('id' => $item['id'], 'itemtype' => $item['pubtype_id'], 'catid' => $cid));
                     $count = 0;
                     $items[$k] = array('label' => $label, 'id' => $item['id'], 'class' => $class, 'link' => $link);
                     $tmpPublications[$pubtypes[$item['pubtype_id']]['description']][] = $items[$k];
                 }
                 // if
             }
             // foreach
             $items = $tmpPublications;
             unset($tmpPublications);
             if (empty($itemid) && empty($andcids)) {
                 $link = '';
             }
             $catitems = array();
             if (!empty($childrenCategories) && count($childrenCategories) > 0) {
                 foreach ($childrenCategories as $child) {
                     $publications = xarModAPIFunc('publications', 'user', 'getall', array('cid' => $child['cid'], 'ptid' => $itemtype, 'fields' => array('id', 'title')));
                     foreach ($publications as $k => $article) {
                         $publications[$article['title']] = $article['id'];
                         unset($publications[$k]);
                     }
                     // foreach
                     $clabel = xarVarPrepForDisplay($child['name']);
                     if (isset($publications[$clabel])) {
                         $clink = xarModURL($modname, $type, 'display', array('ptid' => $itemtype, 'catid' => $child['cid'], 'id' => $publications[$clabel]));
                     } else {
                         $clink = xarModURL($modname, $type, $func, array('itemtype' => $itemtype, 'catid' => $child['cid']));
                     }
                     // if
                     if (!empty($catcount[$child['cid']])) {
                         $ccount = $catcount[$child['cid']];
                     } else {
                         $ccount = 0;
                     }
                     $catitems[] = array('catlabel' => $clabel, 'catid' => $child['cid'], 'catlink' => $clink, 'catcount' => $ccount, 'catchildren' => array());
                 }
                 // foreach
             }
             // if
             if (sizeof($catitems) > 0 || sizeof($items) > 0) {
                 $data['cattrees'][] = array('catitems' => $catitems, 'items' => $items);
             } else {
                 return;
             }
             // if
             break;
     }
     $data['blockid'] = $this->block_id;
     // The template base is set by this block if not already provided.
     // The base is 'nav-tree', 'nav-trails' or 'nav-prevnext', but allow
     // the admin to override this completely.
     $this->setTemplateBase('nav-' . $template);
     return $data;
 }
Example #6
0
/**
 * update item from publications_admin_modify
 */
function publications_admin_updatestate()
{
    // Get parameters
    if (!xarVarFetch('ids', 'isset', $ids, NULL, XARVAR_DONT_SET)) {
        return;
    }
    if (!xarVarFetch('state', 'isset', $state, NULL, XARVAR_DONT_SET)) {
        return;
    }
    if (!xarVarFetch('catid', 'isset', $catid, NULL, XARVAR_DONT_SET)) {
        return;
    }
    if (!xarVarFetch('ptid', 'isset', $ptid, NULL, XARVAR_DONT_SET)) {
        return;
    }
    // Confirm authorisation code
    if (!xarSecConfirmAuthKey()) {
        return;
    }
    if (!isset($ids) || count($ids) == 0) {
        $msg = xarML('No publications selected');
        throw new DataNotFoundException(null, $msg);
    }
    $states = xarModAPIFunc('publications', 'user', 'getstates');
    if (!isset($state) || !is_numeric($state) || $state < -1 || $state != -1 && !isset($states[$state])) {
        $msg = xarML('Invalid state');
        throw new BadParameterException(null, $msg);
    }
    $pubtypes = xarModAPIFunc('publications', 'user', 'get_pubtypes');
    if (!empty($ptid)) {
        $descr = $pubtypes[$ptid]['description'];
    } else {
        $descr = xarML('Publications');
        $ptid = null;
    }
    // We need to tell some hooks that we are coming from the update state screen
    // and not the update the actual article screen.  Right now, the keywords vanish
    // into thin air.  Bug 1960 and 3161
    xarVarSetCached('Hooks.all', 'noupdate', 1);
    foreach ($ids as $id => $val) {
        if ($val != 1) {
            continue;
        }
        // Get original article information
        $article = xarModAPIFunc('publications', 'user', 'get', array('id' => $id, 'withcids' => 1));
        if (!isset($article) || !is_array($article)) {
            $msg = xarML('Unable to find #(1) item #(2)', $descr, xarVarPrepForDisplay($id));
            throw new BadParameterException(null, $msg);
        }
        $article['ptid'] = $article['pubtype_id'];
        // Security check
        $input = array();
        $input['article'] = $article;
        if ($state < 0) {
            $input['mask'] = 'ManagePublications';
        } else {
            $input['mask'] = 'EditPublications';
        }
        if (!xarModAPIFunc('publications', 'user', 'checksecurity', $input)) {
            $msg = xarML('You have no permission to modify #(1) item #(2)', $descr, xarVarPrepForDisplay($id));
            throw new ForbiddenOperationException(null, $msg);
        }
        if ($state < 0) {
            // Pass to API
            if (!xarModAPIFunc('publications', 'admin', 'delete', $article)) {
                return;
                // throw back
            }
        } else {
            // Update the state now
            $article['state'] = $state;
            // Pass to API
            if (!xarModAPIFunc('publications', 'admin', 'update', $article)) {
                return;
                // throw back
            }
        }
    }
    unset($article);
    // Return to the original admin view
    $lastview = xarSession::getVar('Publications.LastView');
    if (isset($lastview)) {
        $lastviewarray = unserialize($lastview);
        if (!empty($lastviewarray['ptid']) && $lastviewarray['ptid'] == $ptid) {
            extract($lastviewarray);
            xarController::redirect(xarModURL('publications', 'admin', 'view', array('ptid' => $ptid, 'catid' => $catid, 'state' => $state, 'startnum' => $startnum)));
            return true;
        }
    }
    if (empty($catid)) {
        $catid = null;
    }
    xarController::redirect(xarModURL('publications', 'admin', 'view', array('ptid' => $ptid, 'catid' => $catid)));
    return true;
}
Example #7
0
 /**
  * Display func.
  * @param $blockinfo array
  * @returns $blockinfo array
  * @todo Option to display the menu even when not on a relevant page
  */
 function display(array $data = array())
 {
     // TODO:
     // We want a few facilities:
     // 1. Set a root higher than the real tree root. Pages will only
     //    be displayed once that root is reached. Effectively set one
     //    or more trees, at any depth, that this menu will cover. [DONE]
     // 2. Set a 'max depth' value, so only a preset max number of levels
     //    are rendered in a tree. [DONE]
     // [1 and 2 are a kind of "view window" for levels]
     // 3. Set behaviour when no current page in the Publications module is
     //    displayed, e.g. hide menu, show default tree or page etc. [DONE]
     // 4. Allow the page tree to be pruned at arbitrary specified
     //    pages. That would allow sections of the tree to be pruned
     //    from one menu and added to another (i.e. split menus).
     //    This will also move the current page, if it happens to be in the
     //    pruned section, down to the pruning page. [done]
     $data = $this->getContent();
     // Pointer to simplify referencing.
     $vars =& $data;
     if (!empty($data['root_ids']) && is_array($data['root_ids'])) {
         $root_ids = $data['root_ids'];
     } else {
         $root_ids = array();
     }
     if (!empty($data['prune_ids']) && is_array($data['prune_ids'])) {
         $prune_ids = $data['prune_ids'];
     } else {
         $prune_ids = array();
     }
     // To start with, we need to know the current page.
     // It could be set (fixed) for the block, passed in
     // via the page cache, or simply not present.
     $id = 0;
     if (empty($data['current_source']) || $data['current_source'] == 'AUTO' || $data['current_source'] == 'AUTODEFAULT') {
         // Automatic: that means look at the page cache.
         if (xarVarIsCached('Blocks.publications', 'current_id')) {
             $cached_id = xarVarGetCached('Blocks.publications', 'current_id');
             // Make sure it is numeric.
             if (isset($cached_id) && is_numeric($cached_id)) {
                 $id = $cached_id;
             }
         }
     }
     // Now we may or may not have a page ID.
     // If the page is not set, then check for a default.
     if (empty($id) && !empty($data['default_id'])) {
         // Set the current page to be the default.
         $id = $data['default_id'];
     }
     // The page details *may* have been cached, if
     // we are in the Publications module, or have several
     // blocks on the same page showing the same tree.
     if (xarVarIsCached('Blocks.publications', 'pagedata')) {
         // Pages are cached?
         // The 'serialize' hack ensures we have a proper copy of the
         // paga data, which is a self-referencing array. If we don't
         // do this, then any changes we make will affect the stored version.
         $pagedata = unserialize(serialize(xarVarGetCached('Blocks.publications', 'pagedata')));
         //$pagedata = unserialize(serialize($pagedata));
         // If the cached tree does not contain the current page,
         // then we cannot use it.
         if (!isset($pagedata['pages'][$id])) {
             $pagedata = array();
         }
     }
     // If there is no id, then we have no page or tree to display.
     if (empty($id)) {
         return;
     }
     // If necessary, check whether the current page is under one of the
     // of the allowed root ids.
     if (!empty($root_ids)) {
         if (!xarMod::apiFunc('publications', 'user', 'pageintrees', array('id' => $id, 'tree_roots' => $root_ids))) {
             // Not under a root.
             // If the mode is AUTO then leave the menu blank.
             if ($data['current_source'] == 'AUTO' || $data['current_source'] == 'DEFAULT' || empty($data['default_id'])) {
                 return;
             } else {
                 // Use the default page instead.
                 $id = $data['default_id'];
                 $pagedata = array();
             }
         }
     }
     // If we don't have any page data, then fetch it now.
     if (empty($pagedata)) {
         // Get the page data here now.
         $pagedata = xarMod::apiFunc('publications', 'user', 'getpagestree', array('tree_contains_id' => $id, 'dd_flag' => true, 'key' => 'id', 'status' => 'ACTIVE,EMPTY'));
         // If $pagedata is empty, then we have an invalid ID or
         // no permissions. Return NULL if so, suppressing the block.
         if (empty($pagedata['pages'])) {
             return;
         }
         // Cache the data now we have gone to the trouble of fetching the tree.
         // Only cache it if the cache is empty to start with. We only cache a complete
         // tree here, so if any other blocks need it, it contains all possible
         // pages we could need in that tree.
         if (!xarVarIsCached('Blocks.publications', 'pagedata')) {
             xarVarSetCached('Blocks.publications', 'pagedata', $pagedata);
         }
     }
     // If the user has set a 'start level' then make sure the page sits at that level or above.
     // TODO: take into account the options that allow default pages to be displayed when
     // the current page does not fit into the specified range.
     // If the start level is greater than 0, then work back through ancestors to find
     // the implied root page.
     if (!empty($data['start_level'])) {
         // FIXME: '+1' only needed if the root page is being hidden. Maybe.
         if ($pagedata['pages'][$id]['depth'] + (!empty($data['multi_homed']) ? 1 : 0) < $data['start_level']) {
             // We are outside the start level.
             // Hide the block if there is no default page to set.
             return;
         } else {
             // We are within a start level.
             // Scan through ancestors, and find the one with the specified level,
             // and add it to the root ids list.
             $scan_id = $id;
             while (true) {
                 if (empty($pagedata['pages'][$scan_id]['parent_id'])) {
                     break;
                 }
                 if ($pagedata['pages'][$scan_id]['depth'] < $data['start_level']) {
                     $root_ids[] = $scan_id;
                     break;
                 }
                 $scan_id = $pagedata['pages'][$scan_id]['parent_id'];
             }
             // If the root id has no children, we should hide the block.
             if (!empty($data['multi_homed']) && empty($pagedata['pages'][$scan_id]['child_keys'])) {
                 return;
             }
         }
     }
     // TODO: handle privileges for pages somewhere. The user/display
     // function handles it for the current page, but there is no
     // point the block providing links to pages that cannot be
     // accessed.
     // Optionally prune branches from the tree.
     // TODO: Make sure we only prune above the root nodes. Trust the user for now to do that.
     //$prune_ids = array(15);
     if (!empty($prune_ids)) {
         foreach ($prune_ids as $prune_id) {
             if (isset($pagedata['pages'][$prune_id])) {
                 // The page exists.
                 // Move the current page if necessary.
                 if ($pagedata['pages'][$id]['left'] > $pagedata['pages'][$prune_id]['left'] && $pagedata['pages'][$id]['left'] < $pagedata['pages'][$prune_id]['right']) {
                     // Move the current page down from within the pruned section, to
                     // the current pruning point.
                     $id = $prune_id;
                 }
                 // Reset any of the pruning point's children.
                 $pagedata['pages'][$prune_id]['child_keys'] = array();
                 $pagedata['pages'][$prune_id]['has_children'] = false;
                 //var_dump($pagedata);
             }
         }
     }
     // transform to the format we need for displaying the menu
     $temp = array();
     foreach ($pagedata['pages'] as $k => $v) {
         $temp[$v['id']] = $v;
     }
     $pagedata['pages'] = $temp;
     // Here we add the various flags to the pagedata, based on
     // the current page.
     $pagedata = xarMod::apiFunc('publications', 'user', 'addcurrentpageflags', array('pagedata' => $pagedata, 'id' => $id, 'root_ids' => $root_ids));
     // If not multi-homed, then create a 'root root' page - a virtual page
     // one step back from the displayed root page. This makes the template
     // much easier to implement. The templates need never display the
     // root page passed into them, and always start with the children of
     // that root page.
     if (empty($data['multi_homed'])) {
         $pagedata['pages'][0] = array('child_keys' => array($pagedata['root_page']['key']), 'has_children' => true, 'is_ancestor' => true);
         unset($pagedata['root_page']);
         $pagedata['root_page'] =& $pagedata['pages'][0];
     }
     // Pass the page data into the block.
     // Merge it in with the existing block details.
     // TODO: It may be quicker to do the merge the other way around?
     $data = array_merge($data, $pagedata);
     return $data;
 }
Example #8
0
function publications_admin_display($args)
{
    // Get parameters from user
    // this is used to determine whether we come from a pubtype-based view or a
    // categories-based navigation
    // Note we support both id and itemid
    if (!xarVarFetch('name', 'str', $name, '', XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('ptid', 'id', $ptid, NULL, XARVAR_DONT_SET)) {
        return;
    }
    if (!xarVarFetch('itemid', 'id', $itemid, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('id', 'id', $id, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('page', 'int:1', $page, NULL, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('translate', 'int:1', $translate, 1, XARVAR_NOT_REQUIRED)) {
        return;
    }
    if (!xarVarFetch('layout', 'str:1', $layout, 'detail', XARVAR_NOT_REQUIRED)) {
        return;
    }
    // Override xarVarFetch
    extract($args);
    //The itemid var takes precedence if it exiata
    if (isset($itemid)) {
        $id = $itemid;
    }
    # --------------------------------------------------------
    #
    # If no ID supplied, try getting the id of the default page.
    #
    if (empty($id)) {
        $id = xarModVars::get('publications', 'defaultpage');
    }
    # --------------------------------------------------------
    #
    # Get the ID of the translation if required
    #
    // First save the "untranslated" id
    xarVarSetCached('Blocks.publications', 'current_base_id', $id);
    if ($translate) {
        $id = xarMod::apiFunc('publications', 'user', 'gettranslationid', array('id' => $id));
    }
    # --------------------------------------------------------
    #
    # If still no ID, check if we are trying to display a pubtype
    #
    if (empty($name) && empty($ptid) && empty($id)) {
        // Nothing to be done
        $id = xarModVars::get('publications', 'notfoundpage');
    } elseif (empty($id)) {
        // We're missing an id but can get a pubtype: jump to the pubtype view
        xarController::redirect(xarModURL('publications', 'user', 'view'));
    }
    # --------------------------------------------------------
    #
    # If still no ID, we have come to the end of the line
    #
    if (empty($id)) {
        return xarResponse::NotFound();
    }
    # --------------------------------------------------------
    #
    # We have an ID, now first get the page
    #
    // Here we get the publication type first, and then from that the page
    // Perhaps more efficient to get the page directly?
    $ptid = xarMod::apiFunc('publications', 'user', 'getitempubtype', array('itemid' => $id));
    // An empty publication type means the page does not exist
    if (empty($ptid)) {
        return xarResponse::NotFound();
    }
    /*    if (empty($name) && empty($ptid)) return xarResponse::NotFound();
    
        if(empty($ptid)) {
            $publication_type = DataObjectMaster::getObjectList(array('name' => 'publications_types'));
            $where = 'name = ' . $name;
            $items = $publication_type->getItems(array('where' => $where));
            $item = current($items);
            $ptid = $item['id'];
        }
    */
    $pubtypeobject = DataObjectMaster::getObject(array('name' => 'publications_types'));
    $pubtypeobject->getItem(array('itemid' => $ptid));
    $data['object'] = DataObjectMaster::getObject(array('name' => $pubtypeobject->properties['name']->value));
    //    $id = xarMod::apiFunc('publications','user','gettranslationid',array('id' => $id));
    $itemid = $data['object']->getItem(array('itemid' => $id));
    # --------------------------------------------------------
    #
    # Are we allowed to see this page?
    #
    $accessconstraints = unserialize($data['object']->properties['access']->value);
    $access = DataPropertyMaster::getProperty(array('name' => 'access'));
    $allow = $access->check($accessconstraints['display']);
    $nopublish = time() < $data['object']->properties['start_date']->value || time() > $data['object']->properties['end_date']->value && !$data['object']->properties['no_end']->value;
    // If no access, then bail showing a forbidden or an empty page
    if (!$allow || $nopublish) {
        if ($accessconstraints['display']['failure']) {
            return xarResponse::Forbidden();
        } else {
            return xarTplModule('publications', 'user', 'empty');
        }
    }
    # --------------------------------------------------------
    #
    # If this is a redirect page, then send it on its way now
    #
    $redirect_type = $data['object']->properties['redirect_flag']->value;
    if ($redirect_type == 1) {
        // This is a simple redirect to another page
        try {
            $url = $data['object']->properties['redirect_url']->value;
            // Check if this is a Xaraya function
            $pos = strpos($url, 'xar');
            if ($pos === 0) {
                eval('$url = ' . $url . ';');
            }
            xarController::redirect($url, 301);
        } catch (Exception $e) {
            return xarResponse::NotFound();
        }
    } elseif ($redirect_type == 2) {
        // This displays a page of a different module
        // If this is from a link of a redirect child page, use the child param as new URL
        if (!xarVarFetch('child', 'str', $child, NULL, XARVAR_NOT_REQUIRED)) {
            return;
        }
        if (!empty($child)) {
            // Turn entities into amps
            $url = urldecode($child);
        } else {
            $url = $data['object']->properties['proxy_url']->value;
        }
        // Bail if the URL is bad
        try {
            // Check if this is a Xaraya function
            $pos = strpos($url, 'xar');
            if ($pos === 0) {
                eval('$url = ' . $url . ';');
            }
            $params = parse_url($url);
            $params['query'] = preg_replace('/&amp;/', '&', $params['query']);
        } catch (Exception $e) {
            return xarResponse::NotFound();
        }
        // If this is an external link, show it without further processing
        if (!empty($params['host']) && $params['host'] != xarServer::getHost() && $params['host'] . ":" . $params['port'] != xarServer::getHost()) {
            xarController::redirect($url, 301);
        } else {
            parse_str($params['query'], $info);
            $other_params = $info;
            unset($other_params['module']);
            unset($other_params['type']);
            unset($other_params['func']);
            unset($other_params['child']);
            try {
                $page = xarMod::guiFunc($info['module'], 'user', $info['func'], $other_params);
            } catch (Exception $e) {
                return xarResponse::NotFound();
            }
            // Debug
            // echo xarModURL($info['module'],'user',$info['func'],$other_params);
            # --------------------------------------------------------
            #
            # For proxy pages: the transform of the subordinate function's template
            #
            // Find the URLs in submits
            $pattern = '/(action)="([^"\\r\\n]*)"/';
            preg_match_all($pattern, $page, $matches);
            $pattern = array();
            $replace = array();
            foreach ($matches[2] as $match) {
                $pattern[] = '%</form%';
                $replace[] = '<input type="hidden" name="return_url" id="return_url" value="' . urlencode(xarServer::getCurrentURL()) . '"/><input type="hidden" name="child" value="' . urlencode($match) . '"/></form';
            }
            $page = preg_replace($pattern, $replace, $page);
            $pattern = '/(action)="([^"\\r\\n]*)"/';
            $page = preg_replace_callback($pattern, create_function('$matches', 'return $matches[1]."=\\"".xarServer::getCurrentURL()."\\"";'), $page);
            // Find the URLs in links
            $pattern = '/(href)="([^"\\r\\n]*)"/';
            $page = preg_replace_callback($pattern, create_function('$matches', 'return $matches[1]."=\\"".xarServer::getCurrentURL(array("child" => urlencode($matches[2])))."\\"";'), $page);
            return $page;
        }
    }
    # --------------------------------------------------------
    #
    # If this is a bloccklayout page, then process it
    #
    if ($data['object']->properties['pagetype']->value == 2) {
        // Get a copy of the compiler
        sys::import('xaraya.templating.compiler');
        $blCompiler = XarayaCompiler::instance();
        // Get the data fields
        $fields = array();
        $sourcefields = array('title', 'description', 'summary', 'body1', 'body2', 'body3', 'body4', 'body5', 'notes');
        $prefix = strlen('publications.') - 1;
        foreach ($data['object']->properties as $prop) {
            if (in_array(substr($prop->source, $prefix), $sourcefields)) {
                $fields[] = $prop->name;
            }
        }
        // Run each template field through the compiler
        foreach ($fields as $field) {
            try {
                $tplString = '<xar:template xmlns:xar="http://xaraya.com/2004/blocklayout">';
                $tplString .= xarMod::apiFunc('publications', 'user', 'prepareforbl', array('string' => $data['object']->properties[$field]->value));
                $tplString .= '</xar:template>';
                $tplString = $blCompiler->compilestring($tplString);
                // We don't allow passing $data to the template for now
                $tpldata = array();
                $tplString = xarTplString($tplString, $tpldata);
            } catch (Exception $e) {
                var_dump($tplString);
            }
            $data['object']->properties[$field]->value = $tplString;
        }
    }
    # --------------------------------------------------------
    #
    # Get the complete tree for this section of pages. We need this for blocks etc.
    #
    $tree = xarMod::apiFunc('publications', 'user', 'getpagestree', array('tree_contains_pid' => $id, 'key' => 'id', 'status' => 'ACTIVE,FRONTPAGE,PLACEHOLDER'));
    // If this page is of type PLACEHOLDER, then look in its descendents
    if ($data['object']->properties['state']->value == 5) {
        // Scan for a descendent that is ACTIVE or FRONTPAGE
        if (!empty($tree['pages'][$id]['child_keys'])) {
            foreach ($tree['pages'][$id]['child_keys'] as $scan_key) {
                // If the page is displayable, then treat it as the new page.
                if ($tree['pages'][$scan_key]['status'] == 3 || $tree['pages'][$scan_key]['status'] == 4) {
                    $id = $tree['pages'][$scan_key]['id'];
                    $id = xarMod::apiFunc('publications', 'user', 'gettranslationid', array('id' => $id));
                    $itemid = $data['object']->getItem(array('itemid' => $id));
                    break;
                }
            }
        }
    }
    # --------------------------------------------------------
    #
    # Additional data
    #
    // Pass the layout to the template
    $data['layout'] = $layout;
    // Get the settings for this publication type;
    $data['settings'] = xarModAPIFunc('publications', 'user', 'getsettings', array('ptid' => $ptid));
    // The name of this object
    $data['objectname'] = $data['object']->name;
    # --------------------------------------------------------
    #
    # Set the theme if needed
    #
    if (!empty($data['object']->properties['theme']->value)) {
        xarTplSetThemeName($data['object']->properties['theme']->value);
    }
    # --------------------------------------------------------
    #
    # Set the page template from the pubtype if needed
    #
    if (!empty($data['settings']['page_template'])) {
        $pagename = $data['settings']['page_template'];
        $position = strpos($pagename, '.');
        if ($position === false) {
            $pagetemplate = $pagename;
        } else {
            $pagetemplate = substr($pagename, 0, $position);
        }
        xarTpl::setPageTemplateName($pagetemplate);
    }
    // It can be overridden by the page itself
    if (!empty($data['object']->properties['page_template']->value)) {
        $pagename = $data['object']->properties['page_template']->value;
        $position = strpos($pagename, '.');
        if ($position === false) {
            $pagetemplate = $pagename;
        } else {
            $pagetemplate = substr($pagename, 0, $position);
        }
        xarTpl::setPageTemplateName($pagetemplate);
    }
    # --------------------------------------------------------
    #
    # Cache data for blocks
    #
    // Now we can cache all this data away for the blocks.
    // The blocks should have access to most of the same data as the page.
    xarVarSetCached('Blocks.publications', 'pagedata', $tree);
    // The 'serialize' hack ensures we have a proper copy of the
    // paga data, which is a self-referencing array. If we don't
    // do this, then any changes we make will affect the stored version.
    $data = unserialize(serialize($data));
    // Save some values. These are used by blocks in 'automatic' mode.
    xarVarSetCached('Blocks.publications', 'current_id', $id);
    xarVarSetCached('Blocks.publications', 'ptid', $ptid);
    xarVarSetCached('Blocks.publications', 'author', $data['object']->properties['author']->value);
    # --------------------------------------------------------
    #
    # Make the properties available to the template
    #
    $data['properties'] =& $data['object']->properties;
    return $data;
    /*
        // TEST - highlight search terms
        if(!xarVarFetch('q',     'str',  $q,     NULL, XARVAR_NOT_REQUIRED)) {return;}
    */
    // Override if needed from argument array (e.g. preview)
    extract($args);
    // Defaults
    if (!isset($page)) {
        $page = 1;
    }
    // via arguments only
    if (!isset($preview)) {
        $preview = 0;
    }
    /*
        if ($preview) {
            if (!isset($publication)) {
                return xarML('Invalid publication');
            }
            $id = $publication->properties['id']->value;
        } elseif (!isset($id) || !is_numeric($id) || $id < 1) {
            return xarML('Invalid publication ID');
        }
    */
    /*    // Get publication
        if (!$preview) {
            $publication = xarModAPIFunc('publications',
                                    'user',
                                    'get',
                                    array('id' => $id,
                                          'withcids' => true));
        }
    
        if (!is_array($publication)) {
            $msg = xarML('Failed to retrieve publication in #(3)_#(1)_#(2).php', 'userapi', 'get', 'publications');
            throw new DataNotFoundException(null, $msg);
        }
        // Get publication types
        $pubtypes = xarModAPIFunc('publications','user','get_pubtypes');
    
        // Check that the publication type is valid, otherwise use the publication's pubtype
        if (!empty($ptid) && !isset($pubtypes[$ptid])) {
            $ptid = $publication['pubtype_id'];
        }
    
    */
    // keep original ptid (if any)
    //    $ptid = $publication['pubtype_id'];
    //    $pubtype_id = $publication->properties['itemtype']->value;
    //    $owner = $publication->properties['author']->value;
    /*    if (!isset($publication['cids'])) {
            $publication['cids'] = array();
        }
        $cids = $publication['cids'];
    */
    // Get the publication settings for this publication type
    if (empty($ptid)) {
        $settings = unserialize(xarModVars::get('publications', 'settings'));
    } else {
        $settings = unserialize(xarModVars::get('publications', 'settings.' . $ptid));
    }
    // show the number of publications for each publication type
    if (!isset($show_pubcount)) {
        if (!isset($settings['show_pubcount']) || !empty($settings['show_pubcount'])) {
            $show_pubcount = 1;
            // default yes
        } else {
            $show_pubcount = 0;
        }
    }
    // show the number of publications for each category
    if (!isset($show_catcount)) {
        if (empty($settings['show_catcount'])) {
            $show_catcount = 0;
            // default no
        } else {
            $show_catcount = 1;
        }
    }
    // Initialize the data array
    $data = $publication->getFieldValues();
    $data['ptid'] = $ptid;
    // navigation pubtype
    $data['pubtype_id'] = $pubtype_id;
    // publication pubtype
    // TODO: improve the case where we have several icons :)
    $data['topic_icons'] = '';
    $data['topic_images'] = array();
    $data['topic_urls'] = array();
    $data['topic_names'] = array();
    /*
        if (count($cids) > 0) {
            if (!xarModAPILoad('categories', 'user')) return;
            $catlist = xarModAPIFunc('categories',
                                    'user',
                                    'getcatinfo',
                                    array('cids' => $cids));
            foreach ($catlist as $cat) {
                $link = xarModURL('publications','user','view',
                                 array(//'state' => array(PUBLICATIONS_STATE_FRONTPAGE,PUBLICATIONS_STATE_APPROVED).
                                       'ptid' => $ptid,
                                       'catid' => $cat['cid']));
                $name = xarVarPrepForDisplay($cat['name']);
    
                $data['topic_urls'][] = $link;
                $data['topic_names'][] = $name;
    
                if (!empty($cat['image'])) {
                    $image = xarTplGetImage($cat['image'],'categories');
                    $data['topic_icons'] .= '<a href="'. $link .'">'.
                                            '<img src="'. $image .
                                            '" alt="'. $name .'" />'.
                                            '</a>';
                    $data['topic_images'][] = $image;
    
                    break;
                }
            }
        }
    */
    // multi-page output for 'body' field (mostly for sections at the moment)
    $themeName = xarVarGetCached('Themes.name', 'CurrentTheme');
    if ($themeName != 'print') {
        if (strstr($publication->properties['body']->value, '<!--pagebreak-->')) {
            if ($preview) {
                $publication['body'] = preg_replace('/<!--pagebreak-->/', '<hr/><div style="text-align: center;">' . xarML('Page Break') . '</div><hr/>', $publication->properties['body']->value);
                $data['previous'] = '';
                $data['next'] = '';
            } else {
                $pages = explode('<!--pagebreak-->', $publication->properties['body']->value);
                // For documents with many pages, the pages can be
                // arranged in blocks.
                $pageBlockSize = 10;
                // Get pager information: one item per page.
                $pagerinfo = xarTplPagerInfo(empty($page) ? 1 : $page, count($pages), 1, $pageBlockSize);
                // Retrieve current page and total pages from the pager info.
                // These will have been normalised to ensure they are in range.
                $page = $pagerinfo['currentpage'];
                $numpages = $pagerinfo['totalpages'];
                // Discard everything but the current page.
                $publication['body'] = $pages[$page - 1];
                unset($pages);
                if ($page > 1) {
                    // Don't count page hits after the first page.
                    xarVarSetCached('Hooks.hitcount', 'nocount', 1);
                }
                // Pass in the pager info so a complete custom pager
                // can be created in the template if required.
                $data['pagerinfo'] = $pagerinfo;
                // Get the rendered pager.
                // The pager template (last parameter) could be an
                // option for the publication type.
                $urlmask = xarModURL('publications', 'user', 'display', array('ptid' => $ptid, 'id' => $id, 'page' => '%%'));
                $data['pager'] = xarTplGetPager($page, $numpages, $urlmask, 1, $pageBlockSize, 'multipage');
                // Next two assignments for legacy templates.
                // TODO: deprecate them?
                $data['next'] = xarTplGetPager($page, $numpages, $urlmask, 1, $pageBlockSize, 'multipagenext');
                $data['previous'] = xarTplGetPager($page, $numpages, $urlmask, 1, $pageBlockSize, 'multipageprev');
            }
        } else {
            $data['previous'] = '';
            $data['next'] = '';
        }
    } else {
        $publication['body'] = preg_replace('/<!--pagebreak-->/', '', $publication['body']);
    }
    // TEST
    if (isset($prevnextart)) {
        $settings['prevnextart'] = $prevnextart;
    }
    if (!empty($settings['prevnextart']) && $preview == 0) {
        if (!array_key_exists('defaultsort', $settings)) {
            $settings['defaultsort'] = 'id';
        }
        $prevart = xarModAPIFunc('publications', 'user', 'getprevious', array('id' => $id, 'ptid' => $ptid, 'sort' => $settings['defaultsort'], 'state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'enddate' => time()));
        if (!empty($prevart['id'])) {
            //Make all previous publication info available to template
            $data['prevartinfo'] = $prevart;
            $data['prevart'] = xarModURL('publications', 'user', 'display', array('ptid' => $prevart['pubtype_id'], 'id' => $prevart['id']));
        } else {
            $data['prevart'] = '';
        }
        $nextart = xarModAPIFunc('publications', 'user', 'getnext', array('id' => $id, 'ptid' => $ptid, 'sort' => $settings['defaultsort'], 'state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'enddate' => time()));
        if (!empty($nextart['id'])) {
            //Make all next art info available to template
            $data['nextartinfo'] = $nextart;
            $data['nextart'] = xarModURL('publications', 'user', 'display', array('ptid' => $nextart['pubtype_id'], 'id' => $nextart['id']));
        } else {
            $data['nextart'] = '';
        }
    } else {
        $data['prevart'] = '';
        $data['nextart'] = '';
    }
    // Display publication
    unset($publication);
    // temp. fix to include dynamic data fields without changing templates
    if (xarModIsHooked('dynamicdata', 'publications', $pubtype_id)) {
        list($properties) = xarModAPIFunc('dynamicdata', 'user', 'getitemfordisplay', array('module' => 'publications', 'itemtype' => $pubtype_id, 'itemid' => $id, 'preview' => $preview));
        if (!empty($properties) && count($properties) > 0) {
            foreach (array_keys($properties) as $field) {
                $data[$field] = $properties[$field]->getValue();
                // POOR mans flagging for transform hooks
                try {
                    $configuration = $properties[$field]->configuration;
                    if (substr($configuration, 0, 10) == 'transform:') {
                        $data['transform'][] = $field;
                    }
                } catch (Exception $e) {
                }
                // TODO: clean up this temporary fix
                $data[$field . '_output'] = $properties[$field]->showOutput();
            }
        }
    }
    // Let any transformation hooks know that we want to transform some text.
    // You'll need to specify the item id, and an array containing all the
    // pieces of text that you want to transform (e.g. for autolinks, wiki,
    // smilies, bbcode, ...).
    $data['itemtype'] = $pubtype_id;
    // TODO: what about transforming DDfields ?
    // <mrb> see above for a hack, needs to be a lot better.
    // Summary is always included, is that handled somewhere else? (publication config says i can ex/include it)
    // <mikespub> publications config allows you to call transforms for the publications summaries in the view function
    if (!isset($title_transform)) {
        if (empty($settings['title_transform'])) {
            $data['transform'][] = 'summary';
            $data['transform'][] = 'body';
            $data['transform'][] = 'notes';
        } else {
            $data['transform'][] = 'title';
            $data['transform'][] = 'summary';
            $data['transform'][] = 'body';
            $data['transform'][] = 'notes';
        }
    }
    $data = xarModCallHooks('item', 'transform', $id, $data, 'publications');
    return xarTplModule('publications', 'user', 'display', $data);
    if (!empty($data['title'])) {
        // CHECKME: <rabbit> Strip tags out of the title - the <title> tag shouldn't have any other tags in it.
        $title = strip_tags($data['title']);
        xarTplSetPageTitle(xarVarPrepForDisplay($title), xarVarPrepForDisplay($pubtypes[$data['itemtype']]['description']));
        // Save some variables to (temporary) cache for use in blocks etc.
        xarVarSetCached('Comments.title', 'title', $data['title']);
    }
    /*
        if (!empty($q)) {
        // TODO: split $q into search terms + add style (cfr. handlesearch in search module)
            foreach ($data['transform'] as $field) {
                $data[$field] = preg_replace("/$q/","<span class=\"xar-search-match\">$q</span>",$data[$field]);
            }
        }
    */
    // Navigation links
    $data['publabel'] = xarML('Publication');
    $data['publinks'] = array();
    //xarModAPIFunc('publications','user','getpublinks',
    //    array('state' => array(PUBLICATIONS_STATE_FRONTPAGE,PUBLICATIONS_STATE_APPROVED),
    //          'count' => $show_pubcount));
    if (isset($show_map)) {
        $settings['show_map'] = $show_map;
    }
    if (!empty($settings['show_map'])) {
        $data['maplabel'] = xarML('View Publication Map');
        $data['maplink'] = xarModURL('publications', 'user', 'viewmap', array('ptid' => $ptid));
    }
    if (isset($show_archives)) {
        $settings['show_archives'] = $show_archives;
    }
    if (!empty($settings['show_archives'])) {
        $data['archivelabel'] = xarML('View Archives');
        $data['archivelink'] = xarModURL('publications', 'user', 'archive', array('ptid' => $ptid));
    }
    if (isset($show_publinks)) {
        $settings['show_publinks'] = $show_publinks;
    }
    if (!empty($settings['show_publinks'])) {
        $data['show_publinks'] = 1;
    } else {
        $data['show_publinks'] = 0;
    }
    $data['show_catcount'] = $show_catcount;
    // Tell the hitcount hook not to display the hitcount, but to save it
    // in the variable cache.
    if (xarModIsHooked('hitcount', 'publications', $pubtype_id)) {
        xarVarSetCached('Hooks.hitcount', 'save', 1);
        $data['dohitcount'] = 1;
    } else {
        $data['dohitcount'] = 0;
    }
    // Tell the ratings hook to save the rating in the variable cache.
    if (xarModIsHooked('ratings', 'publications', $pubtype_id)) {
        xarVarSetCached('Hooks.ratings', 'save', 1);
        $data['doratings'] = 1;
    } else {
        $data['doratings'] = 0;
    }
    // Retrieve the current hitcount from the variable cache
    if ($data['dohitcount'] && xarVarIsCached('Hooks.hitcount', 'value')) {
        $data['counter'] = xarVarGetCached('Hooks.hitcount', 'value');
    } else {
        $data['counter'] = '';
    }
    // Retrieve the current rating from the variable cache
    if ($data['doratings'] && xarVarIsCached('Hooks.ratings', 'value')) {
        $data['rating'] = intval(xarVarGetCached('Hooks.ratings', 'value'));
    } else {
        $data['rating'] = '';
    }
    // Save some variables to (temporary) cache for use in blocks etc.
    xarVarSetCached('Blocks.publications', 'title', $data['title']);
    // Generating keywords from the API now instead of setting the entire
    // body into the cache.
    $keywords = xarModAPIFunc('publications', 'user', 'generatekeywords', array('incomingkey' => $data['body']));
    xarVarSetCached('Blocks.publications', 'body', $keywords);
    xarVarSetCached('Blocks.publications', 'summary', $data['summary']);
    xarVarSetCached('Blocks.publications', 'id', $id);
    xarVarSetCached('Blocks.publications', 'ptid', $ptid);
    xarVarSetCached('Blocks.publications', 'cids', $cids);
    xarVarSetCached('Blocks.publications', 'owner', $owner);
    if (isset($data['author'])) {
        xarVarSetCached('Blocks.publications', 'author', $data['author']);
    }
    // TODO: add this to publications configuration ?
    //if ($shownavigation) {
    $data['id'] = $id;
    $data['cids'] = $cids;
    xarVarSetCached('Blocks.categories', 'module', 'publications');
    xarVarSetCached('Blocks.categories', 'itemtype', $ptid);
    xarVarSetCached('Blocks.categories', 'itemid', $id);
    xarVarSetCached('Blocks.categories', 'cids', $cids);
    if (!empty($ptid) && !empty($pubtypes[$ptid]['description'])) {
        xarVarSetCached('Blocks.categories', 'title', $pubtypes[$ptid]['description']);
    }
    // optional category count
    if ($show_catcount && !empty($ptid)) {
        $pubcatcount = xarModAPIFunc('publications', 'user', 'getpubcatcount', array('state' => array(PUBLICATIONS_STATE_FRONTPAGE, PUBLICATIONS_STATE_APPROVED), 'ptid' => $ptid));
        if (!empty($pubcatcount[$ptid])) {
            xarVarSetCached('Blocks.categories', 'catcount', $pubcatcount[$ptid]);
        }
    } else {
        //    xarVarSetCached('Blocks.categories','catcount',array());
    }
    //}
    // Module template depending on publication type
    $template = $pubtypes[$pubtype_id]['name'];
    // Page template depending on publication type (optional)
    // Note : this cannot be overridden in templates
    if (empty($preview) && !empty($settings['page_template'])) {
        xarTplSetPageTemplateName($settings['page_template']);
    }
    // Specific layout within a template (optional)
    if (isset($layout)) {
        $data['layout'] = $layout;
    }
    $pubtypeobject = DataObjectMaster::getObject(array('name' => 'publications_types'));
    $pubtypeobject->getItem(array('itemid' => $ptid));
    $data['object'] = DataObjectMaster::getObject(array('name' => $pubtypeobject->properties['name']->value));
    $id = xarMod::apiFunc('publications', 'user', 'getranslationid', array('id' => $id));
    $data['object']->getItem(array('itemid' => $id));
    return xarTplModule('publications', 'user', 'display', $data, $template);
}
Example #9
0
 public function display()
 {
     $data = $this->getContent();
     // defaults
     $featuredid = $data['featuredid'];
     $fields = array('id', 'title', 'cids');
     $fields[] = 'dynamicdata';
     // Initialize arrays
     $data['feature'] = array();
     $data['items'] = array();
     // Setup featured item
     if ($featuredid > 0) {
         if (xarModIsHooked('uploads', 'publications', $data['pubtype_id'])) {
             xarVarSetCached('Hooks.uploads', 'ishooked', 1);
         }
         if ($featart = xarModAPIFunc('publications', 'user', 'getall', array('ids' => array($featuredid), 'extra' => array('cids', 'dynamicdata')))) {
             foreach ($featart as $featuredart) {
                 $fieldlist = array('id', 'title', 'summary', 'owner', 'pubdate', 'pubtype_id', 'notes', 'state', 'body', 'cids');
                 $featuredlink = xarModURL('publications', 'user', 'display', array('id' => $featuredart['id'], 'itemtype' => !empty($data['linkpubtype']) ? $featuredart['pubtype_id'] : NULL, 'catid' => !empty($data['linkcat']) && !empty($data['catfilter']) ? $data['catfilter'] : NULL));
                 if (empty($data['showfeaturedbod'])) {
                     $data['showfeaturedbod'] = false;
                 }
                 if (!isset($featuredart['cids'])) {
                     $featuredart['cids'] = "";
                 }
                 $feature = array('featuredname' => $featuredart['name'], 'featuredlabel' => $featuredart['title'], 'featuredlink' => $featuredlink, 'alttitle' => $data['alttitle'], 'altsummary' => $data['altsummary'], 'showfeaturedsum' => $data['showfeaturedsum'], 'showfeaturedbod' => $data['showfeaturedbod'], 'featureddesc' => $featuredart['summary'], 'featuredcids' => $featuredart['cids'], 'pubtype_id' => $featuredart['pubtype_id'], 'featuredid' => $featuredart['id'], 'featureddate' => $featuredart['start_date']);
                 // Get rid of the default fields so all we have left are the DD ones
                 foreach ($fieldlist as $field) {
                     if (isset($featuredart[$field])) {
                         unset($featuredart[$field]);
                     }
                 }
                 // now add the DD fields to the featuredart
                 $feature = array_merge($featuredart, $feature);
                 $data['feature'][] = $feature;
             }
         }
         // Setup additional items
         $fields = array('id', 'title', 'pubtype_id', 'cids');
         // Added the 'summary' field to the field list.
         if (!empty($data['showsummary'])) {
             $fields[] = 'summary';
         }
         if ($data['toptype'] == 'rating') {
             $fields[] = 'rating';
             $sort = 'rating';
         } elseif ($data['toptype'] == 'hits') {
             $fields[] = 'counter';
             $sort = 'hits';
         } elseif ($data['toptype'] == 'date') {
             $fields[] = 'pubdate';
             $sort = 'date';
         } else {
             $sort = $data['toptype'];
         }
         if (!empty($data['moreitems'])) {
             $publications = xarModAPIFunc('publications', 'user', 'getall', array('ids' => $data['moreitems'], 'enddate' => time(), 'fields' => $fields, 'sort' => $sort));
             // See if we're currently displaying an article
             if (xarVarIsCached('Blocks.publications', 'id')) {
                 $curid = xarVarGetCached('Blocks.publications', 'id');
             } else {
                 $curid = -1;
             }
             foreach ($publications as $article) {
                 if ($article['id'] != $curid) {
                     $link = xarModURL('publications', 'user', 'display', array('id' => $article['id'], 'itemtype' => !empty($vars['linkpubtype']) ? $article['pubtype_id'] : NULL, 'catid' => !empty($data['linkcat']) && !empty($data['catfilter']) ? $data['catfilter'] : NULL));
                 } else {
                     $link = '';
                 }
                 $count = '';
                 // TODO: find a nice clean way to show all sort types
                 if ($data['showvalue']) {
                     if ($data['toptype'] == 'rating') {
                         $count = intval($article['rating']);
                     } elseif ($data['toptype'] == 'hits') {
                         $count = $article['counter'];
                     } elseif ($data['toptype'] == 'date') {
                         // TODO: make user-dependent
                         if (!empty($article['pubdate'])) {
                             $count = strftime("%Y-%m-%d", $article['pubdate']);
                         } else {
                             $count = 0;
                         }
                     } else {
                         $count = 0;
                     }
                 } else {
                     $count = 0;
                 }
                 if (isset($article['cids'])) {
                     $cids = $article['cids'];
                 } else {
                     $cids = '';
                 }
                 if (isset($article['pubdate'])) {
                     $pubdate = $article['pubdate'];
                 } else {
                     $pubdate = '';
                 }
                 // Pass $desc to items[] array so that the block template can render it
                 $data['items'][] = array('label' => $article['title'], 'link' => $link, 'count' => $count, 'cids' => $cids, 'pubdate' => $pubdate, 'desc' => !empty($data['showsummary']) && !empty($article['summary']) ? $article['summary'] : '', 'id' => $article['id']);
             }
         }
     }
     if (empty($data['feature']) && empty($data['items'])) {
         // Nothing to display.
         return;
     }
     return $data;
 }