* @link http://status.net/
*/
-if (!defined('GNUSOCIAL')) { exit(1); }
+if (!defined('GNUSOCIAL')) {
+ exit(1);
+}
require_once INSTALLDIR.'/lib/noticelist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-class ShownoticeAction extends Action
+class ShownoticeAction extends ManagedAction
{
+ protected $redirectAfterLogin = true;
+
/**
* Notice object to show
*/
- var $notice = null;
+ public $notice = null;
/**
* Profile of the notice object
*/
- var $profile = null;
+ public $profile = null;
/**
* Avatar of the profile of the notice object
*/
- var $avatar = null;
+ public $avatar = null;
/**
* Load attributes based on database arguments
*
* @return success flag
*/
- protected function prepare(array $args=array())
+ protected function prepare(array $args=[])
{
parent::prepare($args);
if ($this->boolean('ajax')) {
- StatusNet::setApi(true);
+ GNUsocial::setApi(true);
}
$this->notice = $this->getNotice();
+ $this->target = $this->notice;
if (!$this->notice->inScope($this->scoped)) {
// TRANS: Client exception thrown when trying a view a notice the user has no access to.
- throw new ClientException(_('Not available.'), 403);
+ throw new ClientException(_('Access restricted.'), 403);
}
$this->profile = $this->notice->getProfile();
{
$id = $this->arg('notice');
- $notice = Notice::getKV('id', $id);
-
- if (!$notice instanceof Notice) {
- // Did we used to have it, and it got deleted?
- $deleted = Deleted_notice::getKV($id);
- if ($deleted instanceof Deleted_notice) {
+ $notice = null;
+ try {
+ $notice = Notice::getByID($id);
+ // Alright, got it!
+ return $notice;
+ } catch (NoResultException $e) {
+ // Hm, not found.
+ $deleted = null;
+ Event::handle('IsNoticeDeleted', [$id, &$deleted]);
+ if ($deleted === true) {
// TRANS: Client error displayed trying to show a deleted notice.
- $this->clientError(_('Notice deleted.'), 410);
- } else {
- // TRANS: Client error displayed trying to show a non-existing notice.
- $this->clientError(_('No such notice.'), 404);
+ throw new ClientException(_('Notice deleted.'), 410);
}
- return false;
}
- return $notice;
+ // TRANS: Client error displayed trying to show a non-existing notice.
+ throw new ClientException(_('No such notice.'), 404);
}
/**
*
* @return boolean true
*/
- function isReadOnly($args)
+ public function isReadOnly($args)
{
return true;
}
*
* @return int last-modified date as unix timestamp
*/
- function lastModified()
+ public function lastModified()
{
return max(strtotime($this->notice->modified),
strtotime($this->profile->modified),
*
* @return string etag
*/
- function etag()
+ public function etag()
{
$avtime = ($this->avatar) ?
strtotime($this->avatar->modified) : 0;
- return 'W/"' . implode(':', array($this->arg('action'),
- common_user_cache_hash(),
- common_language(),
- $this->notice->id,
- strtotime($this->notice->created),
- strtotime($this->profile->modified),
- $avtime)) . '"';
+ return 'W/"' . implode(':', [$this->arg('action'),
+ common_user_cache_hash(),
+ common_language(),
+ $this->notice->id,
+ strtotime($this->notice->created),
+ strtotime($this->profile->modified),
+ $avtime]) . '"';
}
/**
*
* @return string title of the page
*/
- function title()
- {
- $base = $this->profile->getFancyName();
-
- // TRANS: Title of the page that shows a notice.
- // TRANS: %1$s is a user name, %2$s is the notice creation date/time.
- return sprintf(_('%1$s\'s status on %2$s'),
- $base,
- common_exact_date($this->notice->created));
- }
-
- /**
- * Handle input
- *
- * Only handles get, so just show the page.
- *
- * @param array $args $_REQUEST data (unused)
- *
- * @return void
- */
- protected function handle()
+ public function title()
{
- parent::handle();
-
- if (StatusNet::isAjax()) {
- $this->showAjax();
- } else {
- $this->showPage();
- }
+ return $this->notice->getTitle();
}
/**
*
* @return void
*/
- function showContent()
- {
- $this->elementStart('ol', array('class' => 'notices xoxo'));
- $nli = new SingleNoticeItem($this->notice, $this);
- $nli->show();
- $this->elementEnd('ol');
- }
-
- function showAjax()
+ public function showContent()
{
- $this->startHTML('text/xml;charset=utf-8');
- $this->elementStart('head');
- // TRANS: Title for page that shows a notice.
- $this->element('title', null, _m('TITLE','Notice'));
- $this->elementEnd('head');
- $this->elementStart('body');
+ $this->elementStart('ol', ['class' => 'notices xoxo']);
$nli = new NoticeListItem($this->notice, $this);
$nli->show();
- $this->elementEnd('body');
- $this->endHTML();
+ $this->elementEnd('ol');
}
/**
*
* @return void
*/
- function showPageNoticeBlock()
+ public function showPageNoticeBlock()
{
}
- /**
- * Don't show aside
- *
- * @return void
- */
- function showAside() {
+ public function getFeeds()
+ {
+ return [
+ new Feed(Feed::JSON,
+ common_local_url('ApiStatusesShow',
+ ['id' => $this->target->getID(),
+ 'format' => 'json']),
+ // TRANS: Title for link to single notice representation.
+ // TRANS: %s is a user nickname.
+ sprintf(_('Single notice (JSON)'))
+ ),
+ new Feed(Feed::ATOM,
+ common_local_url('ApiStatusesShow',
+ ['id' => $this->target->getID(),
+ 'format' => 'atom']),
+ // TRANS: Title for link to notice feed.
+ // TRANS: %s is a user nickname.
+ sprintf(_('Single notice (Atom)'))
+ )
+ ];
}
/**
* Extra <head> content
*
- * We show the microid(s) for the author, if any.
+ * Facebook OpenGraph metadata.
*
* @return void
*/
- function extraHead()
+ public function extraHead()
{
- $user = User::getKV($this->profile->id);
-
- if (!$user) {
- return;
- }
-
- if ($user->emailmicroid && $user->email && $this->notice->uri) {
- $id = new Microid('mailto:'. $user->email,
- $this->notice->uri);
- $this->element('meta', array('name' => 'microid',
- 'content' => $id->toString()));
- }
-
// Extras to aid in sharing notices to Facebook
$avatarUrl = $this->profile->avatarUrl(AVATAR_PROFILE_SIZE);
- $this->element('meta', array('property' => 'og:image',
- 'content' => $avatarUrl));
- $this->element('meta', array('property' => 'og:description',
- 'content' => $this->notice->content));
- }
-}
-
-// @todo FIXME: Class documentation missing.
-class SingleNoticeItem extends DoFollowListItem
-{
- function avatarSize()
- {
- return AVATAR_STREAM_SIZE;
+ $this->element('meta', ['property' => 'og:image',
+ 'content' => $avatarUrl]);
+ $this->element('meta', ['property' => 'og:description',
+ 'content' => $this->notice->content]);
}
}