/**
  * For initializing members of the class.
  *
  * @param array $argarray misc. arguments
  *
  * @return boolean true
  */
 function prepare($argarray)
 {
     parent::prepare($argarray);
     $convId = $this->trimmed('id');
     if (empty($convId)) {
         // TRANS: Client exception thrown when no conversation ID is given.
         throw new ClientException(_('No conversation ID.'));
     }
     $this->conversation = Conversation::staticGet('id', $convId);
     if (empty($this->conversation)) {
         // TRANS: Client exception thrown when referring to a non-existing conversation ID (%d).
         $this->clientError(_('No conversation ID found'), 404);
         return false;
     }
     $profile = Profile::current();
     $stream = new ConversationNoticeStream($convId, $profile);
     $notice = $stream->getNotices(($this->page - 1) * $this->count, $this->count, $this->since_id, $this->max_id);
     $this->notices = $notice->fetchAll();
     $originalConversation = new Notice();
     $originalConversation->whereAdd('conversation=' . $convId);
     $originalConversation->limit(1);
     $originalConversation->orderBy('created');
     $originalConversation->find();
     if ($originalConversation->fetch()) {
         $this->originalNotice = $originalConversation;
     }
     return true;
 }
Esempio n. 2
0
 function showNoticePlus($item)
 {
     $replies = new Notice();
     $replies->reply_to = $item->notice->id;
     // We take responsibility for doing the li
     $this->out->elementStart('li', array('class' => 'h-entry notice', 'id' => 'notice-' . $item->notice->id));
     $item->show();
     if ($replies->find()) {
         $this->out->elementStart('ol', array('class' => 'notices'));
         $replieslist = array();
         while ($replies->fetch()) {
             $replieslist[] = $this->newListItem(clone $replies);
         }
         //Sorting based on url argument
         if ($_GET['sort'] == 'faves') {
             usort($replieslist, array($this, '_cmpFav'));
         } else {
             usort($replieslist, array($this, '_cmpDate'));
         }
         foreach ($replieslist as $reply) {
             $this->showNoticePlus($reply);
         }
         $this->out->elementEnd('ol');
     }
     $this->out->elementEnd('li');
 }
 static function getStreamByIds($ids)
 {
     $cache = Cache::instance();
     if (!empty($cache)) {
         $notices = array();
         foreach ($ids as $id) {
             $n = Notice::staticGet('id', $id);
             if (!empty($n)) {
                 $notices[] = $n;
             }
         }
         return new ArrayWrapper($notices);
     } else {
         $notice = new Notice();
         if (empty($ids)) {
             //if no IDs requested, just return the notice object
             return $notice;
         }
         $notice->whereAdd('id in (' . implode(', ', $ids) . ')');
         $notice->find();
         $temp = array();
         while ($notice->fetch()) {
             $temp[$notice->id] = clone $notice;
         }
         $wrapped = array();
         foreach ($ids as $id) {
             if (array_key_exists($id, $temp)) {
                 $wrapped[] = $temp[$id];
             }
         }
         return new ArrayWrapper($wrapped);
     }
 }
 /**
  * Fetch the next self::DELETION_WINDOW messages for this user.
  * @return Notice
  */
 protected function getNextBatch(User $user)
 {
     $notice = new Notice();
     $notice->profile_id = $user->id;
     $notice->limit(self::DELETION_WINDOW);
     $notice->find();
     return $notice;
 }
Esempio n. 5
0
 public function postDelete()
 {
     $query = Notice::find(Input::get("id"));
     NoticeUserAssociate::where("notice_id", $query->notice_id)->delete();
     if ($query->delete()) {
         return Redirect::back()->with("event", "<p class='alert alert-success'><span class='glyphicon glyphicon-ok'></span> Notice deleted.</p>");
     }
     return Redirect::back()->with("event", "<p class='alert alert-danger'><span class='glyphicon glyphicon-remove'></span> Error occured. Please try after sometime.</p>");
 }
 function getNotices()
 {
     $notice = new Notice();
     $notice->joinAdd(array('id', 'file_to_post:post_id'));
     $notice->whereAdd(sprintf('file_to_post.file_id = %d', $this->out->attachment->id));
     $notice->orderBy('created desc');
     $notice->selectAdd('post_id as id');
     $notice->find();
     return $notice;
 }
Esempio n. 7
0
 function getNotices()
 {
     $notice = new Notice();
     $f2p = new File_to_post();
     $f2p->file_id = $this->out->attachment->id;
     $notice->joinAdd($f2p);
     $notice->orderBy('created desc');
     $notice->selectAdd('post_id as id');
     $notice->find();
     return $notice;
 }
 function handle($args)
 {
     parent::handle($args);
     $notice = new Notice();
     $notice->source = 'activity';
     $notice->find();
     while ($notice->fetch()) {
         $data = Notice::staticGet('id', $notice->id);
         $orign = clone $data;
         $data->content_type = NOTICE::CONTENT_TYPE_ACTIVITY;
         if (!$data->update($orign)) {
             echo 'profile update error' . $data->id;
             echo '<br>';
         }
     }
 }
 function getNoticeIds($offset, $limit, $since_id, $max_id)
 {
     $notice = new Notice();
     $search_engine = $notice->getSearchEngine('notice');
     $search_engine->set_sort_mode('chron');
     $search_engine->limit($offset, $limit);
     $ids = array();
     // wtf?
     $search_engine->query($this->q);
     if ($notice->find()) {
         while ($notice->fetch()) {
             $ids[] = $notice->id;
         }
     }
     return $ids;
 }
Esempio n. 10
0
 function getNotices($limit = 0)
 {
     $q = $this->trimmed('q');
     $notices = array();
     $notice = new Notice();
     $search_engine = $notice->getSearchEngine('identica_notices');
     $search_engine->set_sort_mode('chron');
     if (!$limit) {
         $limit = 20;
     }
     $search_engine->limit(0, $limit, true);
     $search_engine->query($q);
     $notice->find();
     while ($notice->fetch()) {
         $notices[] = clone $notice;
     }
     return $notices;
 }
Esempio n. 11
0
 protected function getNotices()
 {
     $q = $this->trimmed('q');
     $notices = array();
     $notice = new Notice();
     $search_engine = $notice->getSearchEngine('notice');
     $search_engine->set_sort_mode('chron');
     $search_engine->limit(0, $this->limit, true);
     if (false === $search_engine->query($q)) {
         $cnt = 0;
     } else {
         $cnt = $notice->find();
     }
     if ($cnt > 0) {
         while ($notice->fetch()) {
             $notices[] = clone $notice;
         }
     }
     return $notices;
 }
Esempio n. 12
0
 public function detail()
 {
     $notice_id = Input::get('notice_id');
     $notice = Notice::find(Input::get('notice_id'));
     if (!isset($notice)) {
         return View::make('errors.missing');
     }
     // 用户登陆,标记为已读
     if (Sentry::check()) {
         $user_id = Sentry::getUser()->user_id;
         // 先查询是否已标记为已读
         if (UserReadNotice::where('user_id', $user_id)->where('notice_id', $notice_id)->count() == 0) {
             $user_read_notice = new UserReadNotice();
             $user_read_notice->user_id = $user_id;
             $user_read_notice->notice_id = $notice_id;
             // 保存。不成功,下次读取依旧判断
             // 需改进 ???
             $user_read_notice->save();
         }
     }
     return View::make('pages.message-center.message.detail', ['notice' => $notice]);
 }
Esempio n. 13
0
 public function getRead($NoticeId)
 {
     $notice = Notice::find($NoticeId);
     $notice->read = '1';
     $notice->save();
     // 转跳到不同地址
     //
     switch ($notice->type) {
         case '1':
             break;
         case '2':
             break;
         case '3':
             break;
         case '4':
             break;
         case '5':
             $data = json_decode($notice->data);
             return Redirect::to('picking/view/' . $data->delivery_id)->with('warning', $notice->content);
             break;
     }
     return Redirect::to('notice');
 }
Esempio n. 14
0
 function onEndUpgrade()
 {
     // Version 0.9.x of the plugin didn't stamp notices
     // with verb and object-type (for obvious reasons). Update
     // those notices here.
     $notice = new Notice();
     $notice->whereAdd('exists (select uri from bookmark where bookmark.uri = notice.uri)');
     $notice->whereAdd('((object_type is null) or (object_type = "' . ActivityObject::NOTE . '"))');
     $notice->find();
     while ($notice->fetch()) {
         $original = clone $notice;
         $notice->verb = ActivityVerb::POST;
         $notice->object_type = ActivityObject::BOOKMARK;
         $notice->update($original);
     }
 }
 /**
  * Get IDs in a range
  *
  * @param int $offset   Offset from start
  * @param int $limit    Limit of number to get
  * @param int $since_id Since this notice
  * @param int $max_id   Before this notice
  *
  * @return Array IDs found
  */
 function getNoticeIds($offset, $limit, $since_id, $max_id)
 {
     $notice = new Notice();
     $notice->selectAdd();
     $notice->selectAdd('id');
     $notice->whereAdd(sprintf('notice.created > "%s"', $notice->escape($this->target->created)));
     // Reply:: is a table of mentions
     // Subscription:: is a table of subscriptions (every user is subscribed to themselves)
     $notice->whereAdd(sprintf('(  notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d) ' . 'OR notice.id IN (SELECT notice_id FROM group_inbox WHERE group_id IN (SELECT group_id FROM group_member WHERE profile_id=%1$d))' . 'OR notice.id IN (SELECT notice_id FROM attention WHERE profile_id=%1$d) ) ' . 'AND (notice.reply_to IS NULL ' . 'OR notice.profile_id=%1$d ' . 'OR notice.reply_to IN (SELECT id FROM notice as noticereplies WHERE noticereplies.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d))) ' . 'OR (notice.id IN (SELECT notice_id FROM reply WHERE profile_id=%1$d) ' . 'AND notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%1$d))', $this->target->id));
     if (!empty($since_id)) {
         $notice->whereAdd(sprintf('notice.id > %d', $since_id));
     }
     if (!empty($max_id)) {
         $notice->whereAdd(sprintf('notice.id <= %d', $max_id));
     }
     if (!empty($this->selectVerbs)) {
         $notice->whereAddIn('verb', $this->selectVerbs, $notice->columnType('verb'));
     }
     $notice->limit($offset, $limit);
     // notice.id will give us even really old posts, which were
     // recently imported. For example if a remote instance had
     // problems and just managed to post here. Another solution
     // would be to have a 'notice.imported' field and order by it.
     $notice->orderBy('notice.id DESC');
     if (!$notice->find()) {
         return array();
     }
     $ids = $notice->fetchAll('id');
     return $ids;
 }
Esempio n. 16
0
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
// Abort if called from a web server
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
    print "This script must be run from the command line\n";
    exit;
}
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
define('STATUSNET', true);
define('LACONICA', true);
// compatibility
require_once INSTALLDIR . '/lib/common.php';
common_log(LOG_INFO, 'Starting to do old notices.');
$notice = new Notice();
$cnt = $notice->find();
while ($notice->fetch()) {
    common_log(LOG_INFO, 'Getting replies for notice #' . $notice->id);
    common_save_replies($notice);
}
Esempio n. 17
0
 /**
  * Show results
  *
  * @param string  $q    search query
  * @param integer $page page number
  *
  * @return void
  */
 function showResults($q, $page)
 {
     $notice = new Notice();
     $search_engine = $notice->getSearchEngine('notice');
     $search_engine->set_sort_mode('chron');
     // Ask for an extra to see if there's more.
     $search_engine->limit(($page - 1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
     if (false === $search_engine->query($q)) {
         $cnt = 0;
     } else {
         $cnt = $notice->find();
     }
     if ($cnt === 0) {
         $this->element('p', 'error', _('No results.'));
         $this->searchSuggestions($q);
         if (common_logged_in()) {
             $message = sprintf(_('Be the first to [post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!'), urlencode($q));
         } else {
             $message = sprintf(_('Why not [register an account](%%%%action.register%%%%) and be the first to [post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!'), urlencode($q));
         }
         $this->elementStart('div', 'guide');
         $this->raw(common_markup_to_html($message));
         $this->elementEnd('div');
         return;
     }
     $terms = preg_split('/[\\s,]+/', $q);
     $nl = new SearchNoticeList($notice, $this, $terms);
     $cnt = $nl->show();
     $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE, $page, 'noticesearch', array('q' => $q));
 }
Esempio n. 18
0
function initNoticeReshare()
{
    printfnq("Ensuring all reshares have the correct verb and object-type...");
    $notice = new Notice();
    $notice->whereAdd('repeat_of is not null');
    $notice->whereAdd('(verb != "' . ActivityVerb::SHARE . '" OR object_type != "' . ActivityObject::ACTIVITY . '")');
    if ($notice->find()) {
        while ($notice->fetch()) {
            try {
                $orig = Notice::staticGet('id', $notice->id);
                $notice->verb = ActivityVerb::SHARE;
                $notice->object_type = ActivityObject::ACTIVITY;
                $notice->update($orig);
            } catch (Exception $e) {
                printfv("Error updating verb and object_type for {$notice->id}:" . $e->getMessage());
            }
        }
    }
    printfnq("DONE.\n");
}
Esempio n. 19
0
 function getNotices($y, $m, $d, $i)
 {
     $n = Notice::cacheGet("sitemap:notice:{$y}:{$m}:{$d}:{$i}");
     if ($n === false) {
         $notice = new Notice();
         $begindt = sprintf('%04d-%02d-%02d 00:00:00', $y, $m, $d);
         // XXX: estimates 1d == 24h, which screws up days
         // with leap seconds (1d == 24h + 1s). Thankfully they're
         // few and far between.
         $theend = strtotime($begindt) + 24 * 60 * 60;
         $enddt = common_sql_date($theend);
         $notice->selectAdd();
         $notice->selectAdd('id, created');
         $notice->whereAdd("created >= '{$begindt}'");
         $notice->whereAdd("created <  '{$enddt}'");
         $notice->whereAdd('is_local = ' . Notice::LOCAL_PUBLIC);
         $notice->orderBy('created');
         $offset = ($i - 1) * SitemapPlugin::NOTICES_PER_MAP;
         $limit = SitemapPlugin::NOTICES_PER_MAP;
         $notice->limit($offset, $limit);
         $notice->find();
         $n = array();
         while ($notice->fetch()) {
             $n[] = array($notice->id, $notice->created);
         }
         $c = Cache::instance();
         if (!empty($c)) {
             $c->set(Cache::key("sitemap:notice:{$y}:{$m}:{$d}:{$i}"), $n, Cache::COMPRESSED, time() > $theend ? time() + 90 * 24 * 60 * 60 : time() + 5 * 60);
         }
     }
     return $n;
 }
 function getNoticeIds($offset, $limit, $since_id = null, $max_id = null)
 {
     $notice = new Notice();
     // SELECT
     $notice->selectAdd();
     $notice->selectAdd('id');
     // WHERE
     $notice->conversation = $this->id;
     if (!empty($since_id)) {
         $notice->whereAdd(sprintf('notice.id > %d', $since_id));
     }
     if (!empty($max_id)) {
         $notice->whereAdd(sprintf('notice.id <= %d', $max_id));
     }
     if (!is_null($offset)) {
         $notice->limit($offset, $limit);
     }
     if (!empty($this->selectVerbs)) {
         $notice->whereAddIn('verb', $this->selectVerbs, $notice->columnType('verb'));
     }
     // ORDER BY
     // currently imitates the previously used "_reverseChron" sorting
     $notice->orderBy('notice.created DESC');
     $notice->find();
     return $notice->fetchAll('id');
 }
Esempio n. 21
0
 function _repeatedByMeDirect($offset, $limit, $since_id, $max_id)
 {
     $notice = new Notice();
     $notice->selectAdd();
     // clears it
     $notice->selectAdd('id');
     $notice->profile_id = $this->id;
     $notice->whereAdd('repeat_of IS NOT NULL');
     $notice->orderBy('id DESC');
     if (!is_null($offset)) {
         $notice->limit($offset, $limit);
     }
     if ($since_id != 0) {
         $notice->whereAdd('id > ' . $since_id);
     }
     if ($max_id != 0) {
         $notice->whereAdd('id <= ' . $max_id);
     }
     $ids = array();
     if ($notice->find()) {
         while ($notice->fetch()) {
             $ids[] = $notice->id;
         }
     }
     $notice->free();
     $notice = NULL;
     return $ids;
 }
Esempio n. 22
0
 function clearRepeats()
 {
     $repeatNotice = new Notice();
     $repeatNotice->repeat_of = $this->id;
     //Null any notices that are repeats of this notice
     if ($repeatNotice->find()) {
         while ($repeatNotice->fetch()) {
             $orig = clone $repeatNotice;
             $repeatNotice->repeat_of = null;
             $repeatNotice->update($orig);
         }
     }
 }
Esempio n. 23
0
 /**
  * Check to see if this Twitter status has already been imported
  *
  * @param Profile $profile   Twitter user's local profile
  * @param string  $statusUri URI of the status on Twitter
  *
  * @return mixed value a matching Notice or null
  */
 function checkDupe($profile, $statusUri)
 {
     $notice = new Notice();
     $notice->uri = $statusUri;
     $notice->profile_id = $profile->id;
     $notice->limit(1);
     if ($notice->find()) {
         $notice->fetch();
         return $notice;
     }
     return null;
 }
 /**
  * Show the form for editing the specified notice.
  *
  * @param  int  $id
  * @return Response
  */
 public function edit($id)
 {
     $notice = Notice::find($id);
     return View::make('notices.edit', compact('notice'));
 }
 /**
  *
  * @param int $start unix timestamp for earliest
  * @param int $end unix timestamp for latest
  * @return array of Notice objects
  */
 function getNoticesBetween($start = 0, $end = 0)
 {
     $notices = array();
     $notice = new Notice();
     $notice->profile_id = $this->user->id;
     // Only stuff after $this->after
     if (!empty($this->after)) {
         if ($start) {
             $start = max($start, $this->after);
         }
         if ($end) {
             $end = max($end, $this->after);
         }
     }
     if ($start) {
         $tsstart = common_sql_date($start);
         $notice->whereAdd("created >= '{$tsstart}'");
     }
     if ($end) {
         $tsend = common_sql_date($end);
         $notice->whereAdd("created < '{$tsend}'");
     }
     $notice->orderBy('created DESC');
     if ($notice->find()) {
         while ($notice->fetch()) {
             $notices[] = clone $notice;
         }
     }
     return $notices;
 }
Esempio n. 26
0
 function _deleteNotices()
 {
     $notice = new Notice();
     $notice->profile_id = $this->id;
     if ($notice->find()) {
         while ($notice->fetch()) {
             $other = clone $notice;
             $other->delete();
         }
     }
 }
Esempio n. 27
0
 /**
  * Get the notices to output as results. This also sets some class
  * attrs so we can use them to calculate pagination, and output
  * since_id and max_id.
  *
  * @return array an array of Notice objects sorted in reverse chron
  */
 function getNotices()
 {
     // TODO: Support search operators like from: and to:, boolean, etc.
     $notices = array();
     $notice = new Notice();
     // lcase it for comparison
     $q = strtolower($this->query);
     $search_engine = $notice->getSearchEngine('notice');
     $search_engine->set_sort_mode('chron');
     $search_engine->limit(($this->page - 1) * $this->rpp, $this->rpp + 1, true);
     if (false === $search_engine->query($q)) {
         $this->cnt = 0;
     } else {
         $this->cnt = $notice->find();
     }
     $cnt = 0;
     $this->max_id = 0;
     if ($this->cnt > 0) {
         while ($notice->fetch()) {
             ++$cnt;
             if (!$this->max_id) {
                 $this->max_id = $notice->id;
             }
             if ($this->since_id && $notice->id <= $this->since_id) {
                 break;
             }
             if ($cnt > $this->rpp) {
                 break;
             }
             $notices[] = clone $notice;
         }
     }
     return $notices;
 }
Esempio n. 28
0
    $response = fgets(STDIN);
    if (strtolower(trim($response)) != 'y') {
        print "Aborting.\n";
        exit(0);
    }
}
// @fixme for a very prolific poster this could be too many.
$notice = new Notice();
$notice->profile_id = $profile->id;
if (have_option('--all')) {
    print "Finding all notices by {$profile->nickname}...";
} else {
    print "Finding notices by {$profile->nickname} with geolocation data...";
    $notice->whereAdd("lat != ''");
}
$notice->find();
if ($notice->N) {
    print " {$notice->N} found.\n";
    while ($notice->fetch()) {
        print "notice id {$notice->id} ";
        if (have_option('v') || have_option('--verbose')) {
            print "({$notice->lat},{$notice->lon}) ";
            if ($notice->location_ns) {
                print "ns {$notice->location_ns} id {$notice->location_id} ";
            }
        }
        if (have_option('--dry-run')) {
            // sucka
            echo "(skipped)";
        } else {
            // note: setting fields to null and calling update() doesn't save the nulled fields
 /**
  * Handle the request
  *
  * show a timeline of the user's repeated notices
  *
  * @param array $args $_REQUEST data (unused)
  *
  * @return void
  */
 function handle($args)
 {
     parent::handle($args);
     $offset = ($this->page - 1) * $this->cnt;
     $limit = $this->cnt;
     // TRANS: Title of list of repeated notices of the logged in user.
     // TRANS: %s is the nickname of the logged in user.
     $title = sprintf(_("Repeats of %s"), $this->auth_user->nickname);
     $sitename = common_config('site', 'name');
     $profile = $this->auth_user->getProfile();
     $subtitle = sprintf(_('%1$s notices that %2$s / %3$s has repeated.'), $sitename, $this->auth_user->nickname, $profile->getBestName());
     $taguribase = TagURI::base();
     $id = "tag:{$taguribase}:RepeatsOfMe:" . $this->auth_user->id;
     $link = common_local_url('all', array('nickname' => $this->auth_user->nickname));
     // This is a really bad query for some reason
     if (!common_config('performance', 'high')) {
         $strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id);
     } else {
         $strm = new Notice();
         $strm->whereAdd('0 = 1');
         $strm->find();
     }
     switch ($this->format) {
         case 'xml':
             $this->showXmlTimeline($strm);
             break;
         case 'json':
             $this->showJsonTimeline($strm);
             break;
         case 'atom':
             header('Content-Type: application/atom+xml; charset=utf-8');
             $atom = new AtomNoticeFeed($this->auth_user);
             $atom->setId($id);
             $atom->setTitle($title);
             $atom->setSubtitle($subtitle);
             $atom->setUpdated('now');
             $atom->addLink($link);
             $atom->setSelfLink($this->getSelfUri());
             $atom->addEntryFromNotices($strm);
             $this->raw($atom->getString());
             break;
         case 'as':
             header('Content-Type: ' . ActivityStreamJSONDocument::CONTENT_TYPE);
             $doc = new ActivityStreamJSONDocument($this->auth_user);
             $doc->setTitle($title);
             $doc->addLink($link, 'alternate', 'text/html');
             $doc->addItemsFromNotices($strm);
             $this->raw($doc->asString());
             break;
         default:
             // TRANS: Client error displayed when coming across a non-supported API method.
             $this->clientError(_('API method not found.'), 404);
             break;
     }
 }
Esempio n. 30
0
 /**
  * Show search results
  *
  * @return void
  */
 function showResults()
 {
     // TODO: Support search operators like from: and to:, boolean, etc.
     $notice = new Notice();
     // lcase it for comparison
     $q = strtolower($this->query);
     $search_engine = $notice->getSearchEngine('notice');
     $search_engine->set_sort_mode('chron');
     $search_engine->limit(($this->page - 1) * $this->rpp, $this->rpp + 1, true);
     if (false === $search_engine->query($q)) {
         $cnt = 0;
     } else {
         $cnt = $notice->find();
     }
     // TODO: since_id, lang, geocode
     $results = new JSONSearchResultsList($notice, $q, $this->rpp, $this->page);
     $this->initDocument('json');
     $results->show();
     $this->endDocument('json');
 }