X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Faction.php;h=7c57cbc432a9e8ba7f911bca38652ddbf3b39e6b;hb=0590f2975e6c5b26bbe6121da5c49890e035721e;hp=d89a8b07ac9fda44bdf413ff4e79a79b2a68b553;hpb=29d0871e5a5b2561387bcad40ef4644ee1c2be08;p=quix0rs-gnu-social.git diff --git a/lib/action.php b/lib/action.php index d89a8b07ac..7c57cbc432 100644 --- a/lib/action.php +++ b/lib/action.php @@ -30,9 +30,6 @@ if (!defined('GNUSOCIAL')) { exit(1); } -require_once INSTALLDIR.'/lib/noticeform.php'; -require_once INSTALLDIR.'/lib/htmloutputter.php'; - /** * Base class for all actions * @@ -61,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; @@ -120,9 +118,16 @@ class Action extends HTMLOutputter // lawsuit common_config_set('db', 'database', $mirror); } - if ($this->prepare($args)) { + $status = $this->prepare($args); + if ($status) { $this->handle($args); + } else { + common_debug('Prepare failed for Action.'); } + + $this->flush(); + + Event::handle('EndActionExecute', array($status, $this)); } /** @@ -139,9 +144,16 @@ 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() @@ -152,11 +164,41 @@ class Action extends HTMLOutputter // lawsuit $this->checkLogin(); // if not logged in, this redirs/excepts } - $this->scoped = Profile::current(); + $this->updateScopedProfile(); return true; } + 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. * @@ -164,6 +206,10 @@ class Action extends HTMLOutputter // lawsuit */ function showPage() { + if (StatusNet::isAjax()) { + self::showAjax(); + return; + } if (Event::handle('StartShowHTML', array($this))) { $this->startHTML(); $this->flush(); @@ -184,6 +230,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; @@ -296,19 +359,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.min.js'); - $this->script('extlib/jquery.form.min.js'); - $this->script('extlib/jquery-ui/jquery-ui.min.js'); - $this->script('extlib/jquery.cookie.min.js'); - $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/extlib/json2.min.js', StatusNet::isHTTPS()).'"); }'); - $this->script('extlib/jquery.infieldlabel.min.js'); - } else { - $this->script('extlib/jquery.js'); - $this->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->script('extlib/jquery.js'); + $this->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'); Event::handle('EndShowJQueryScripts', array($this)); } - if (Event::handle('StartShowStatusNetScripts', array($this)) && - Event::handle('StartShowLaconicaScripts', array($this))) { - if (common_config('site', 'minify')) { - $this->script('util.min.js'); - } else { - $this->script('util.js'); - $this->script('xbImportNode.js'); - $this->script('geometa.js'); - } + if (Event::handle('StartShowStatusNetScripts', array($this))) { + $this->script('util.js'); + $this->script('xbImportNode.js'); + $this->script('geometa.js'); + // This route isn't available in single-user mode. // Not sure why, but it causes errors here. $this->inlineScript('var _peopletagAC = "' . @@ -401,7 +438,6 @@ class Action extends HTMLOutputter // lawsuit $this->inlineScript('if (window.top !== window.self) { document.write = ""; window.top.location = window.self.location; setTimeout(function () { document.body.innerHTML = ""; }, 1); window.self.onload = function () { document.body.innerHTML = ""; }; }'); } Event::handle('EndShowStatusNetScripts', array($this)); - Event::handle('EndShowLaconicaScripts', array($this)); } Event::handle('EndShowScripts', array($this)); } @@ -535,9 +571,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 +622,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,7 +635,7 @@ 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()) { @@ -624,13 +661,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)); @@ -686,44 +721,42 @@ class Action extends HTMLOutputter // lawsuit function showNoticeForm() { // TRANS: Tab on the notice form. - $tabs = array('status' => _m('TAB','Status')); + $tabs = array('status' => array('title' => _m('TAB','Status'), + 'href' => common_local_url('newnotice'))); $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')); - foreach ($tabs as $tag => $title) { + foreach ($tabs as $tag => $data) { + $tag = htmlspecialchars($tag); $attrs = array('id' => 'input_form_nav_'.$tag, '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); $this->element('a', - array('href' => 'javascript:SN.U.switchInputFormTab("'.$tag.'")'), - $title); + array('onclick' => 'return SN.U.switchInputFormTab("'.$tag.'");', + 'href' => $data['href']), + $data['title']); $this->elementEnd('li'); } $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 => $title) { + foreach ($tabs as $tag => $data) { $attrs = array('class' => 'input_form', 'id' => 'input_form_'.$tag); + if ($tag == 'status') { + $attrs['class'] .= ' current'; + } $this->elementStart('div', $attrs); @@ -957,7 +990,7 @@ class Action extends HTMLOutputter // lawsuit * * @return nothing */ - function showContent() + protected function showContent() { } @@ -1046,33 +1079,33 @@ class Action extends HTMLOutputter // lawsuit */ function showLicenses() { - $this->showStatusNetLicense(); + $this->showGNUsocialLicense(); $this->showContentLicense(); } /** - * Show StatusNet license. + * Show GNU social license. * * @return nothing */ - function showStatusNetLicense() + function showGNUsocialLicense() { if (common_config('site', 'broughtby')) { - // TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. + // TRANS: First sentence of the GNU social site license. Used if 'broughtby' is set. // TRANS: Text between [] is a link description, text between () is the link itself. // TRANS: Make sure there is no whitespace between "]" and "(". // TRANS: "%%site.broughtby%%" is the value of the variable site.broughtby $instr = _('**%%site.name%%** is a social network, courtesy of [%%site.broughtby%%](%%site.broughtbyurl%%).'); } else { - // TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. + // TRANS: First sentence of the GNU social site license. Used if 'broughtby' is not set. $instr = _('**%%site.name%%** is a social network.'); } $instr .= ' '; - // TRANS: Second sentence of the StatusNet site license. Mentions the StatusNet source code license. + // TRANS: Second sentence of the GNU social site license. Mentions the GNU social source code license. // TRANS: Make sure there is no whitespace between "]" and "(". - // TRANS: Text between [] is a link description, text between () is the link itself. - // TRANS: %s is the version of StatusNet that is being used. - $instr .= sprintf(_('It runs on [GNU social](http://www.gnu.org/software/social/), version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), STATUSNET_VERSION); + // TRANS: [%1$s](%2$s) is a link description followed by the link itself + // TRANS: %3$s is the version of GNU social that is being used. + $instr .= sprintf(_('It runs on [%1$s](%2$s), version %3$s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), GNUSOCIAL_ENGINE, GNUSOCIAL_ENGINE_URL, GNUSOCIAL_VERSION); $output = common_markup_to_html($instr); $this->raw($output); // do it @@ -1134,12 +1167,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'); @@ -1335,9 +1366,9 @@ class Action extends HTMLOutputter // lawsuit */ function int($key, $defValue=null, $maxValue=null, $minValue=null) { - $arg = strtolower($this->trimmed($key)); + $arg = intval($this->arg($key)); - if (is_null($arg) || !is_integer($arg)) { + if (!is_numeric($this->arg($key)) || $arg != $this->arg($key)) { return $defValue; } @@ -1495,7 +1526,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')) {