Exemple #1
0
    /**
     * Search plugin main function
     **/
    public function search($args)
    {
        if (!SecurityUtil::checkPermission('News::', '::', ACCESS_READ)) {
            return true;
        }

        ModUtil::dbInfoLoad('Search');
        $tables = DBUtil::getTables();
        $newsColumn = $tables['news_column'];

        $where = Search_Api_User::construct_where($args,
                array($newsColumn['title'],
                $newsColumn['hometext'],
                $newsColumn['bodytext']),
                $newsColumn['language']);
        // Only search in published articles that are currently visible
        $where .= " AND ({$newsColumn['published_status']} = '0')";
        $date = DateUtil::getDatetime();
        $where .= " AND ('$date' >= {$newsColumn['from']} AND ({$newsColumn['to']} IS NULL OR '$date' <= {$newsColumn['to']}))";

        $sessionId = session_id();

        ModUtil::loadApi('News', 'user');

        $permChecker = new News_ResultChecker($this->getVar('enablecategorization'), $this->getVar('enablecategorybasedpermissions'));
        $articles = DBUtil::selectObjectArrayFilter('news', $where, null, null, null, '', $permChecker, null);

        foreach ($articles as $article)
        {
            $item = array(
                'title' => $article['title'],
                'text'  => $article['hometext'],
                'extra' => $article['sid'],
                'created' => $article['from'],
                'module'  => 'News',
                'session' => $sessionId
            );
            $insertResult = DBUtil::insertObject($item, 'search_result');
            if (!$insertResult) {
                return LogUtil::registerError($this->__('Error! Could not load any articles.'));
            }
        }

        return true;
    }
Exemple #2
0
    /**
     * Perform the search.
     *
     * @param string $args['g']           query string to search
     * @param bool   $args['firstPage']   is this first search attempt? is so - basic search is performed
     * @param string $args['searchtype']  (optional) search type (default='AND')
     * @param string $args['searchorder'] (optional) search order (default='newest')
     * @param int    $args['numlimit']    (optional) number of items to return (default value based on Search settings, -1 for no limit)
     * @param int    $args['page']        (optional) page number (default=1)
     * @param array  $args['active']      (optional) array of search plugins to search (if empty all plugins are used)
     * @param array  $args['modvar']      (optional) array with extrainfo for search plugins
     *
     * @return array array of items array and result count, or false on failure
     */
    public function search($args)
    {
        // query string and firstPage params are required
        if (!isset($args['q']) || empty($args['q']) || !isset($args['firstPage'])) {
            return LogUtil::registerArgsError();
        }
        $vars = array();
        $vars['q'] = $args['q'];
        $vars['searchtype'] = isset($args['searchtype']) && !empty($args['searchtype']) ? $args['searchtype'] : 'AND';
        $vars['searchorder'] = isset($args['searchorder']) && !empty($args['searchorder']) ? $args['searchorder'] : 'newest';
        $vars['numlimit'] = isset($args['numlimit']) && !empty($args['numlimit']) ? $args['numlimit'] : $this->getVar('itemsperpage', 25);
        $vars['page'] = isset($args['page']) && !empty($args['page']) ? (int)$args['page'] : 1;

        $firstPage = isset($args['firstPage']) ? $args['firstPage'] : false;

        $active = isset($args['active']) && is_array($args['active']) && !empty($args['active']) ? $args['active'] : array();
        $modvar = isset($args['modvar']) && is_array($args['modvar']) && !empty($args['modvar']) ? $args['modvar'] : array();

        // work out row index from page number
        $vars['startnum'] = $vars['numlimit'] > 0 ? (($vars['page'] - 1) * $vars['numlimit']) + 1 : 1;

        // Load database stuff
        ModUtil::dbInfoLoad('Search');
        $dbtable = DBUtil::getTables();
        $userId = (int)UserUtil::getVar('uid');
        $searchTable = $dbtable['search_result'];
        $searchColumn = $dbtable['search_result_column'];

        // Create restriction on result table (so user only sees own results)
        $userResultWhere = "$searchColumn[session] = '" . session_id() . "'";

        // Do all the heavy database stuff on the first page only
        if ($firstPage) {
            // Clear current search result for current user - before showing the first page
            // Clear also older searches from other users.
            $dbDriverName = strtolower(Doctrine_Manager::getInstance()->getCurrentConnection()->getDriverName());
            $where = $userResultWhere;
            if ($dbDriverName == 'pgsql') {
                $where .= " OR $searchColumn[found] + INTERVAL '8 HOUR' < NOW()";
            } else {
                $where .= " OR DATE_ADD($searchColumn[found], INTERVAL 8 HOUR) < NOW()";
            }

            DBUtil::deleteWhere('search_result', $where);

            // get all the search plugins
            $search_modules = ModUtil::apiFunc('Search', 'user', 'getallplugins');

            // Ask active modules to find their items and put them into $searchTable for the current user
            // At the same time convert modules list from numeric index to modname index

            $searchModulesByName = array();
            foreach ($search_modules as $mod) {
                // check we've a valid search plugin
                if (isset($mod['functions']) && (empty($active) || isset($active[$mod['title']]))) {
                    foreach ($mod['functions'] as $contenttype => $function) {
                        if (isset($modvar[$mod['title']])) {
                            $param = array_merge($vars, $modvar[$mod['title']]);
                        } else {
                            $param = $vars;
                        }
                        $searchModulesByName[$mod['name']] = $mod;
                        $ok = ModUtil::apiFunc($mod['title'], 'search', $function, $param);
                        if (!$ok) {
                            LogUtil::registerError($this->__f('Error! \'%1$s\' module returned false in search function \'%2$s\'.', array($mod['title'], $function)));

                            return System::redirect(ModUtil::url('Search', 'user', 'main'));
                        }
                    }
                }
            }

            // Count number of found results
            $resultCount = DBUtil::selectObjectCount('search_result', $userResultWhere);
            SessionUtil::setVar('searchResultCount', $resultCount);
            SessionUtil::setVar('searchModulesByName', $searchModulesByName);
        } else {
            $resultCount = SessionUtil::getVar('searchResultCount');
            $searchModulesByName = SessionUtil::getVar('searchModulesByName');
        }

        // Fetch search result - do sorting and paging in database
        // Figure out what to sort by
        switch ($args['searchorder']) {
            case 'alphabetical':
                $sort = 'title';
                break;
            case 'oldest':
                $sort = 'created';
                break;
            case 'newest':
                $sort = 'created DESC';
                break;
            default:
                $sort = 'title';
                break;
        }

        // Get next N results from the current user's result set
        // The "checker" object is used to:
        // 1) do secondary access control (deprecated more or less)
        // 2) let the modules add "url" to the found (and viewed) items
        $checker = new search_result_checker($searchModulesByName);
        $sqlResult = DBUtil::selectObjectArrayFilter('search_result', $userResultWhere, $sort,
                        $vars['startnum'] - 1, $vars['numlimit'], '',
                        $checker, null);
        // add displayname of modules found
        $cnt = count($sqlResult);
        for ($i = 0; $i < $cnt; $i++) {
            $modinfo = ModUtil::getInfoFromName($sqlResult[$i]['module']);
            $sqlResult[$i]['displayname'] = $modinfo['displayname'];
        }

        $result = array(
                'resultCount' => $resultCount,
                'sqlResult' => $sqlResult
        );

        return $result;
    }
Exemple #3
0
    /**
     * get all news items
     * @author Mark West
     * @return mixed array of items, or false on failure
     */
    public function getall($args)
    {
        // Optional arguments.
        if (!isset($args['status']) || (empty($args['status']) && $args['status'] !== 0)) {
            $args['status'] = null;
        }
        if (!isset($args['startnum']) || empty($args['startnum'])) {
            $args['startnum'] = 1;
        }
        if (!isset($args['numitems']) || empty($args['numitems'])) {
            $args['numitems'] = -1;
        }
        if (!isset($args['ignoreml']) || !is_bool($args['ignoreml'])) {
            $args['ignoreml'] = false;
        }
        if (!isset($args['language'])) {
            $args['language'] = '';
        }
        if (!isset($args['filterbydate'])) {
            $args['filterbydate'] = true;
        }

        if ((!empty($args['status']) && !is_numeric($args['status'])) ||
                !is_numeric($args['startnum']) ||
                !is_numeric($args['numitems'])) {
            return LogUtil::registerArgsError();
        }

        // create a empty result set
        $items = array();

        // Security check
        if (!SecurityUtil::checkPermission('News::', '::', ACCESS_OVERVIEW)) {
            return $items;
        }

        $where = $this->generateWhere($args);

        $tables = DBUtil::getTables();
        $news_column = $tables['news_column'];
        $orderby = '';
        // Handle the sort order, if nothing requested use admin setting
        if (!isset($args['order'])) {
            $args['order'] = $this->getVar('storyorder');
            switch ($args['order'])
            {
                case 0:
                    $order = 'sid';
                    break;
                case 2:
                    $order = 'weight';
                    break;
                case 1:
                default:
                    $order = 'from';
            }
        } elseif (isset($news_column[$args['order']])) {
            $order = $args['order'];
        }

        // if ordering is used also set the order direction, ascending/descending
        if (!empty($order)) {
            if (isset($args['orderdir']) && in_array(strtoupper($args['orderdir']), array('ASC', 'DESC'))) {
                $orderby = $news_column[$order].' '.strtoupper($args['orderdir']);
            } else {
                $orderby = $news_column[$order].' DESC';
            }
        } elseif ($args['order'] == 'random') {
            $orderby = 'RAND()';
        }

        // if sorted by weight add second ordering "from", since weight is not unique
        if ($order == 'weight') {
            $orderby .= ', ' . $news_column['from'] . ' DESC';
        }

        $permChecker = new News_ResultChecker($this->getVar('enablecategorization'), $this->getVar('enablecategorybasedpermissions'));
        $objArray = DBUtil::selectObjectArrayFilter('news', $where, $orderby, $args['startnum'] - 1, $args['numitems'], '', $permChecker, $this->getCatFilter($args));

        // Check for an error with the database code, and if so set an appropriate
        // error message and return
        if ($objArray === false) {
            return LogUtil::registerError($this->__('Error! Could not load any articles.'));
        }

        // need to do this here as the category expansion code can't know the
        // root category which we need to build the relative path component
        if ($this->getVar('enablecategorization') && $objArray && isset($args['catregistry']) && $args['catregistry']) {
            ObjectUtil::postProcessExpandedObjectArrayCategories($objArray, $args['catregistry']);
        }

        // Return the items
        return $objArray;
    }
Exemple #4
0
    /**
     * Perform a search.
     *
     * Parameters passed in the $args array:
     * -------------------------------------
     * ? $args['q'] ?.
     * ? $args[?]   ?.
     *
     * @param array $args All parameters passed to this function.
     *
     * @return bool True on success or null result, false on error.
     */
    public function search($args)
    {
        ModUtil::dbInfoLoad('Search');
        $table = DBUtil::getTables();
        $pagestable = $table['pages'];
        $pagescolumn = $table['pages_column'];
        $searchTable = $table['search_result'];
        $searchColumn = $table['search_result_column'];

        $where = Search_Api_User::construct_where(
            $args,
            array(
                $pagescolumn['title'],
                $pagescolumn['content']
            ),
            null
        );

        $sessionId = session_id();

        /*
          // define the permission filter to apply
          $permFilter = array(array('realm'           => 0,
          'component_left'  => 'Pages',
          'component_right' => 'Page',
          'instance_left'   => 'title',
          'instance_right'  => 'pageid',
          'level'           => ACCESS_READ));
         */

        // get the objects from the db
        $permChecker = new pages_result_checker();
        $objArray = DBUtil::selectObjectArrayFilter('pages', $where, 'pageid', 1, -1, '', $permChecker);
        if ($objArray === false) {
            return LogUtil::registerError($this->__('Error! Could not load any page.'));
        }

        $addcategorytitletopermalink = ModUtil::getVar('Pages', 'addcategorytitletopermalink');

        $insertSql =
                "INSERT INTO $searchTable
                ($searchColumn[title],
                $searchColumn[text],
                $searchColumn[extra],
                $searchColumn[created],
                $searchColumn[module],
                $searchColumn[session])
                VALUES ";

        // Process the result set and insert into search result table
        foreach ($objArray as $obj) {
            if ($addcategorytitletopermalink) {
                $extra = serialize(array(
                    'pageid' => $obj['pageid'],
                    'cat' => isset($obj['__CATEGORIES__']['Main']['name']) ? $obj['__CATEGORIES__']['Main']['name'] : null));
            } else {
                $extra = serialize(array('pageid' => $obj['pageid']));
            }
            $sql = $insertSql . '('
                    . '\'' . DataUtil::formatForStore($obj['title']) . '\', '
                    . '\'' . DataUtil::formatForStore($obj['content']) . '\', '
                    . '\'' . DataUtil::formatForStore($extra) . '\', '
                    . '\'' . DataUtil::formatForStore($obj['cr_date']) . '\', '
                    . '\'' . 'Pages' . '\', '
                    . '\'' . DataUtil::formatForStore($sessionId) . '\')';
            $insertResult = DBUtil::executeSQL($sql);
            if (!$insertResult) {
                return LogUtil::registerError($this->__('Error! Could not load any page.'));
            }
        }

        return true;
    }
Exemple #5
0
 /**
  * Search plugin main function
  **/
 public function search($args)
 {
     // Permission check
     $this->throwForbiddenUnless(SecurityUtil::checkPermission('AddressBook::', '::', ACCESS_READ), LogUtil::getErrorMsgPermission());
     ModUtil::dbInfoLoad('Search');
     $ztable = DBUtil::getTables();
     $addresstable = $ztable['addressbook_address'];
     $addresscolumn = $ztable['addressbook_address_column'];
     $searchTable = $ztable['search_result'];
     $searchColumn = $ztable['search_result_column'];
     $searchcols = array($addresscolumn['lname'], $addresscolumn['fname'], $addresscolumn['company'], $addresscolumn['city'], $addresscolumn['zip'], $addresscolumn['address1'], $addresscolumn['address2'], $addresscolumn['state'], $addresscolumn['country'], $addresscolumn['contact_1'], $addresscolumn['contact_2'], $addresscolumn['contact_3'], $addresscolumn['contact_4'], $addresscolumn['contact_5']);
     $cusfields = DBUtil::selectFieldArray('addressbook_customfields', 'id');
     // Get user id
     if (UserUtil::isLoggedIn()) {
         $user_id = UserUtil::getVar('uid');
     } else {
         $user_id = 0;
     }
     for ($i = 0; $i < count($cusfields); $i++) {
         $colname = 'custom_' . $cusfields[$i];
         array_push($searchcols, $addresscolumn[$colname]);
     }
     $where = search_construct_where($args, $searchcols);
     // admin always sees all records but favorites
     if (SecurityUtil::checkPermission('AddressBook::', '::', ACCESS_ADMIN)) {
         $where .= " AND ({$addresscolumn['user_id']} IS NOT NULL)";
     } else {
         // global protect - users see only their own records (admin sees all)
         if (ModUtil::getVar('AddressBook', 'globalprotect') == 1 && !SecurityUtil::checkPermission('AddressBook::', '::', ACCESS_ADMIN)) {
             $where .= " AND ({$addresscolumn['user_id']}={$user_id})";
         } else {
             // if private = 1, show only private records
             if ($private == 1) {
                 $where .= " AND ({$addresscolumn['user_id']}={$user_id} AND {$addresscolumn['private']} = 1)";
             } else {
                 // if private = 0, show all records
                 $where .= " AND (({$addresscolumn['private']} = 0) OR ({$addresscolumn['user_id']}={$user_id} AND {$addresscolumn['private']} = 1))";
             }
         }
     }
     $sessionId = session_id();
     $insertSql = "INSERT INTO {$searchTable}\n  ({$searchColumn['title']},\n  {$searchColumn['text']},\n  {$searchColumn['extra']},\n  {$searchColumn['module']},\n  {$searchColumn['created']},\n  {$searchColumn['session']})\n    VALUES ";
     ModUtil::loadApi('AddressBook', 'user');
     if (ModUtil::getVar('AddressBook', 'addressbooktype') == 1) {
         $sort = "sortname DESC,sortcompany DESC";
     } else {
         $sort = "sortcompany DESC,sortname DESC";
     }
     $permChecker = new addressbook_result_checker();
     //$addresses = DBUtil::selectObjectArray('addressbook_address', $where, null, null, '', $permChecker, null);
     $addresses = DBUtil::selectObjectArrayFilter('addressbook_address', $where, null, null, null, '', $permChecker, null);
     foreach ($addresses as $address) {
         $line_1 = $address['fname'] . " " . $address['lname'];
         if (empty($line_1)) {
             $line_1 = $address['company'];
         } else {
             if (!empty($address['company'])) {
                 $line_1 .= " [" . $address['company'] . "]";
             }
         }
         if (ModUtil::getVar('AddressBook', 'zipbeforecity') == 1) {
             $line_2 = $address['zip'] . " " . $address['city'];
         } else {
             $line_2 = $address['city'] . " " . $address['zip'];
         }
         $sql = $insertSql . '(' . '\'' . DataUtil::formatForStore($line_1) . '\', ' . '\'' . DataUtil::formatForStore($line_2) . '\', ' . '\'' . DataUtil::formatForStore($address['id']) . '\', ' . '\'' . 'AddressBook' . '\', ' . '\'' . DataUtil::formatForStore($address['cr_date']) . '\', ' . '\'' . DataUtil::formatForStore($sessionId) . '\')';
         $insertResult = DBUtil::executeSQL($sql);
         if (!$insertResult) {
             return LogUtil::registerError($this->__('Error! Could not load addresses.'));
         }
     }
     return true;
 }