X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Faction.php;h=5627b73b6cd7da6484ecdc0fe5dd67f784f0756c;hb=6f76c8b59d04255b49e1c11b1d44478301c8437c;hp=4d917dc69e1fe7d2581b1a604e9a1a10799cb1c8;hpb=1776c90cb98d5ca738db143703fb998612ada31e;p=quix0rs-gnu-social.git diff --git a/lib/action.php b/lib/action.php index 4d917dc69e..5627b73b6c 100644 --- a/lib/action.php +++ b/lib/action.php @@ -58,7 +58,8 @@ class Action extends HTMLOutputter // lawsuit protected $ajax = false; protected $menus = true; protected $needLogin = false; - protected $needPost = false; + protected $needPost = false; // implies canPost if true + protected $canPost = false; // can this action handle POST method? // The currently scoped profile (normally Profile::current; from $this->auth_user for API) protected $scoped = null; @@ -117,16 +118,18 @@ class Action extends HTMLOutputter // lawsuit common_config_set('db', 'database', $mirror); } - $status = $this->prepare($args); - if ($status) { - $this->handle($args); - } else { - common_debug('Prepare failed for Action.'); + if (Event::handle('StartActionExecute', array($this, &$args))) { + $prepared = $this->prepare($args); + if ($prepared) { + $this->handle($args); + } else { + common_debug('Prepare failed for Action.'); + } } $this->flush(); - Event::handle('EndActionExecute', array($status, $this)); + Event::handle('EndActionExecute', array($this)); } /** @@ -143,13 +146,20 @@ class Action extends HTMLOutputter // lawsuit $this->clientError(_('This method requires a POST.'), 405); } + // needPost, of course, overrides canPost if true + if (!$this->canPost) { + $this->canPost = $this->needPost; + } + $this->args = common_copy_args($args); - $this->action = $this->trimmed('action'); + // This could be set with get_called_action and then + // chop off 'Action' from the class name. In lower case. + $this->action = strtolower($this->trimmed('action')); if ($this->ajax || $this->boolean('ajax')) { - // check with StatusNet::isAjax() - StatusNet::setAjax(true); + // check with GNUsocial::isAjax() + GNUsocial::setAjax(true); } if ($this->needLogin) { @@ -161,16 +171,36 @@ class Action extends HTMLOutputter // lawsuit return true; } - function updateScopedProfile() { + public function updateScopedProfile() + { $this->scoped = Profile::current(); return $this->scoped; } + public function getScoped() + { + return ($this->scoped instanceof Profile) ? $this->scoped : null; + } + + // Must be run _after_ prepare public function getActionName() { return $this->action; } + public function isAction(array $names) + { + foreach ($names as $class) { + // PHP is case insensitive, and we have stuff like ApiUpperCaseAction, + // but we at least make a point out of wanting to do stuff case-sensitive. + $class = ucfirst($class) . 'Action'; + if ($this instanceof $class) { + return true; + } + } + return false; + } + /** * Show page, a template method. * @@ -178,6 +208,10 @@ class Action extends HTMLOutputter // lawsuit */ function showPage() { + if (GNUsocial::isAjax()) { + self::showAjax(); + return; + } if (Event::handle('StartShowHTML', array($this))) { $this->startHTML(); $this->flush(); @@ -198,6 +232,23 @@ class Action extends HTMLOutputter // lawsuit } } + public function showAjax() + { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + // TRANS: Title for conversation page. + $this->element('title', null, $this->title()); + $this->elementEnd('head'); + $this->elementStart('body'); + if ($this->getError()) { + $this->element('p', array('id'=>'error'), $this->getError()); + } else { + $this->showContent(); + } + $this->elementEnd('body'); + $this->endHTML(); + } + function endHTML() { global $_startTime; @@ -277,7 +328,7 @@ class Action extends HTMLOutputter // lawsuit } else { // favicon.ico should be HTTPS if the rest of the page is $this->element('link', array('rel' => 'shortcut icon', - 'href' => common_path('favicon.ico', StatusNet::isHTTPS()))); + 'href' => common_path('favicon.ico', GNUsocial::isHTTPS()))); } if (common_config('site', 'mobile')) { @@ -310,19 +361,6 @@ class Action extends HTMLOutputter // lawsuit $this->cssLink('js/extlib/jquery-ui/css/smoothness/jquery-ui.css'); if (Event::handle('StartShowUAStyles', array($this))) { - $this->comment('[if IE]>comment('[if lte IE '.$ver.']>comment('[if IE]>script('extlib/jquery.form.js'); $this->script('extlib/jquery-ui/jquery-ui.js'); $this->script('extlib/jquery.cookie.js'); - $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/extlib/json2.js', StatusNet::isHTTPS()).'"); }'); - $this->script('extlib/jquery.infieldlabel.js'); + $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/extlib/json2.js', GNUsocial::isHTTPS()).'"); }'); Event::handle('EndShowJQueryScripts', array($this)); } @@ -394,6 +431,7 @@ class Action extends HTMLOutputter // lawsuit $this->inlineScript('var _peopletagAC = "' . common_local_url('peopletagautocomplete') . '";'); $this->showScriptMessages(); + $this->showScriptVariables(); // Anti-framing code to avoid clickjacking attacks in older browsers. // This will show a blank page if the page is being framed, which is // consistent with the behavior of the 'X-Frame-Options: SAMEORIGIN' @@ -424,12 +462,6 @@ class Action extends HTMLOutputter // lawsuit // TRANS: Localized tooltip for '...' expansion button on overlong remote messages. $messages['showmore_tooltip'] = _m('TOOLTIP', 'Show more'); - // TRANS: Inline reply form submit button: submits a reply comment. - $messages['reply_submit'] = _m('BUTTON', 'Reply'); - - // TRANS: Placeholder text for inline reply form. Clicking in this box will turn it into a mini notice form. - $messages['reply_placeholder'] = _m('Write a reply...'); - $messages = array_merge($messages, $this->getScriptMessages()); Event::handle('EndScriptMessages', array($this, &$messages)); @@ -442,6 +474,19 @@ class Action extends HTMLOutputter // lawsuit return $messages; } + protected function showScriptVariables() + { + $vars = array(); + + if (Event::handle('StartScriptVariables', array($this, &$vars))) { + $vars['urlNewNotice'] = common_local_url('newnotice'); + } + if (!empty($vars)) { + $this->inlineScript('SN.V = ' . json_encode($vars)); + } + return $vars; + } + /** * If the action will need localizable text strings, export them here like so: * @@ -535,9 +580,11 @@ class Action extends HTMLOutputter // lawsuit */ function showBody() { - $this->elementStart('body', (common_current_user()) ? array('id' => strtolower($this->trimmed('action')), - 'class' => 'user_in') - : array('id' => strtolower($this->trimmed('action')))); + $params = array('id' => $this->getActionName()); + if ($this->scoped instanceof Profile) { + $params['class'] = 'user_in'; + } + $this->elementStart('body', $params); $this->elementStart('div', array('id' => 'wrap')); if (Event::handle('StartShowHeader', array($this))) { $this->showHeader(); @@ -584,8 +631,7 @@ class Action extends HTMLOutputter // lawsuit */ function showLogo() { - $this->elementStart('address', array('id' => 'site_contact', - 'class' => 'vcard')); + $this->elementStart('address', array('id' => 'site_contact', 'class' => 'h-card')); if (Event::handle('StartAddressData', array($this))) { if (common_config('singleuser', 'enabled')) { $user = User::singleUser(); @@ -598,10 +644,10 @@ class Action extends HTMLOutputter // lawsuit $url = common_local_url('public'); } - $this->elementStart('a', array('class' => 'url home bookmark', + $this->elementStart('a', array('class' => 'home bookmark', 'href' => $url)); - if (StatusNet::isHTTPS()) { + if (GNUsocial::isHTTPS()) { $logoUrl = common_config('site', 'ssllogo'); if (empty($logoUrl)) { // if logo is an uploaded file, try to fall back to HTTPS file URL @@ -624,13 +670,11 @@ class Action extends HTMLOutputter // lawsuit } if (!empty($logoUrl)) { - $this->element('img', array('class' => 'logo photo', + $this->element('img', array('class' => 'logo u-photo p-name', 'src' => $logoUrl, 'alt' => common_config('site', 'name'))); } - $this->text(' '); - $this->element('span', array('class' => 'fn org'), common_config('site', 'name')); $this->elementEnd('a'); Event::handle('EndAddressData', array($this)); @@ -691,6 +735,8 @@ class Action extends HTMLOutputter // lawsuit $this->elementStart('div', 'input_forms'); + $this->element('label', array('for'=>'input_form_nav'), _m('TAB', 'Share your:')); + if (Event::handle('StartShowEntryForms', array(&$tabs))) { $this->elementStart('ul', array('class' => 'nav', 'id' => 'input_form_nav')); @@ -701,9 +747,6 @@ class Action extends HTMLOutputter // lawsuit 'class' => 'input_form_nav_tab'); if ($tag == 'status') { - // We're actually showing the placeholder form, - // but we special-case the 'Status' tab as if - // it were a small version of it. $attrs['class'] .= ' current'; } $this->elementStart('li', $attrs); @@ -717,16 +760,12 @@ class Action extends HTMLOutputter // lawsuit $this->elementEnd('ul'); - $attrs = array('class' => 'input_form current', - 'id' => 'input_form_placeholder'); - $this->elementStart('div', $attrs); - $form = new NoticePlaceholderForm($this); - $form->show(); - $this->elementEnd('div'); - foreach ($tabs as $tag => $data) { $attrs = array('class' => 'input_form', 'id' => 'input_form_'.$tag); + if ($tag == 'status') { + $attrs['class'] .= ' current'; + } $this->elementStart('div', $attrs); @@ -960,7 +999,7 @@ class Action extends HTMLOutputter // lawsuit * * @return nothing */ - function showContent() + protected function showContent() { } @@ -1114,7 +1153,7 @@ class Action extends HTMLOutputter // lawsuit $image = common_config('license', 'image'); $sslimage = common_config('license', 'sslimage'); - if (StatusNet::isHTTPS()) { + if (GNUsocial::isHTTPS()) { if (!empty($sslimage)) { $url = $sslimage; } else if (preg_match('#^http://i.creativecommons.org/#', $image)) { @@ -1137,12 +1176,10 @@ class Action extends HTMLOutputter // lawsuit // TRANS: license message in footer. // TRANS: %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. $notice = _('All %1$s content and data are available under the %2$s license.'); - $link = "" . - htmlspecialchars(common_config('license', 'title')) . - ""; - $this->raw(sprintf(htmlspecialchars($notice), + $link = sprintf('%2$s', + htmlspecialchars(common_config('license', 'url')), + htmlspecialchars(common_config('license', 'title'))); + $this->raw(@sprintf(htmlspecialchars($notice), htmlspecialchars(common_config('site', 'name')), $link)); $this->elementEnd('p'); @@ -1326,6 +1363,19 @@ class Action extends HTMLOutputter // lawsuit } } + /** + * This is a cheap hack to avoid a bug in DB_DataObject + * where '' is non-type-aware compared to 0, which means it + * will always be true for values like false and 0 too... + * + * Upstream bug is:: + * https://pear.php.net/bugs/bug.php?id=20291 + */ + function booleanintstring($key, $def) + { + return $this->boolean($key, $def) ? '1' : '0'; + } + /** * Integer value of an argument * @@ -1498,7 +1548,7 @@ class Action extends HTMLOutputter // lawsuit */ function returnToArgs() { - $action = $this->trimmed('action'); + $action = $this->getActionName(); $args = $this->args; unset($args['action']); if (common_config('site', 'fancy')) {