3 * StatusNet, the distributed open-source microblogging tool
5 * widget for displaying a list of notices
9 * LICENCE: This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Affero General Public License for more details.
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 * @author Zach Copley <zach@status.net>
25 * @copyright 2009 StatusNet, Inc.
26 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
27 * @link http://status.net/
30 if (!defined('STATUSNET') && !defined('LACONICA')) {
35 * widget-like class for showing JSON search results
39 * @author Zach Copley <zach@status.net>
40 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
41 * @link http://status.net/
45 class JSONSearchResultsList
47 protected $notice; // protected attrs invisible to json_encode()
50 // The below attributes are carefully named so the JSON output from
51 // this obj matches the output from search.twitter.com
57 var $results_per_page;
65 * @param Notice $notice stream of notices from DB_DataObject
66 * @param string $query the original search query
67 * @param int $rpp the number of results to display per page
68 * @param int $page a page offset
69 * @param int $since_id only display notices newer than this
72 function __construct($notice, $query, $rpp, $page, $since_id = 0)
74 $this->notice = $notice;
75 $this->query = urlencode($query);
76 $this->results_per_page = $rpp;
79 $this->since_id = $since_id;
80 $this->results = array();
84 * show the list of search results
86 * @return int $count of the search results listed.
94 $time_start = microtime(true);
96 while ($this->notice->fetch() && $cnt <= $this->rpp) {
99 // XXX: Hmmm. this depends on desc sort order
100 if (!$this->max_id) {
101 $this->max_id = (int)$this->notice->id;
104 if ($cnt > $this->rpp) {
108 $item = new ResultItem($this->notice);
109 array_push($this->results, $item);
112 $time_end = microtime(true);
113 $this->completed_in = $time_end - $time_start;
117 $this->refresh_url = '?since_id=' . $this->max_id .
118 '&q=' . $this->query;
122 if ($cnt > $this->rpp) {
123 $this->next_page = '?page=' . ($this->page + 1) .
124 '&max_id=' . $this->max_id;
125 if ($this->rpp != 15) {
126 $this->next_page .= '&rpp=' . $this->rpp;
128 $this->next_page .= '&q=' . $this->query;
131 if ($this->page > 1) {
132 $this->previous_page = '?page=' . ($this->page - 1) .
133 '&max_id=' . $this->max_id;
134 if ($this->rpp != 15) {
135 $this->previous_page .= '&rpp=' . $this->rpp;
137 $this->previous_page .= '&q=' . $this->query;
140 print json_encode($this);
147 * widget for displaying a single JSON search result
151 * @author Zach Copley <zach@status.net>
152 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
153 * @link http://status.net/
154 * @see JSONSearchResultsList
159 /** The notice this item is based on. */
161 protected $notice; // protected attrs invisible to json_encode()
163 /** The profile associated with the notice. */
167 // The below attributes are carefully named so the JSON output from
168 // this obj matches the output from search.twitter.com
176 var $iso_language_code;
178 var $profile_image_url;
184 * Also initializes the profile attribute.
186 * @param Notice $notice The notice we'll display
189 function __construct($notice)
191 $this->notice = $notice;
192 $this->profile = $notice->getProfile();
193 $this->buildResult();
197 * Build a search result object
199 * This populates the the result in preparation for JSON encoding.
204 function buildResult()
206 $this->text = $this->notice->content;
207 $replier_profile = null;
209 if ($this->notice->reply_to) {
210 $reply = Notice::staticGet(intval($this->notice->reply_to));
212 $replier_profile = $reply->getProfile();
216 $this->to_user_id = ($replier_profile) ?
217 intval($replier_profile->id) : null;
218 $this->to_user = ($replier_profile) ?
219 $replier_profile->nickname : null;
221 $this->from_user = $this->profile->nickname;
222 $this->id = $this->notice->id;
223 $this->from_user_id = $this->profile->id;
225 $user = User::staticGet('id', $this->profile->id);
227 $this->iso_language_code = $user->language;
229 $this->source = $this->getSourceLink($this->notice->source);
231 $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
233 $this->profile_image_url = ($avatar) ?
234 $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
236 $this->created_at = common_date_rfc2822($this->notice->created);
240 * Show the source of the notice
242 * Either the name (and link) of the API client that posted the notice,
243 * or one of other other channels.
245 * @param string $source the source of the Notice
247 * @return string a fully rendered source of the Notice
250 function getSourceLink($source)
252 $source_name = _($source);
261 $ns = Notice_source::staticGet($source);
263 $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';