From: Mikael Nordfeldth <mmn@hethane.se>
Date: Thu, 29 Aug 2013 21:30:04 +0000 (+0200)
Subject: Preparing more object-oriented Action handling
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=b18e24723f3f572b031b142fcbd079b400ad2d67;p=quix0rs-gnu-social.git

Preparing more object-oriented Action handling

Action classes can now be run by calling the static function 'run'.
Eventually actions will be migrated so most functionality gets put
into parent classes, and the children don't have to have as much
duplicate code as they have now.
---

diff --git a/index.php b/index.php
index 1566399fa2..dbb7fff6f8 100644
--- a/index.php
+++ b/index.php
@@ -201,26 +201,6 @@ function setupRW()
     return;
 }
 
-function checkMirror($action_obj, $args)
-{
-    global $config;
-
-    if (common_config('db', 'mirror') && $action_obj->isReadOnly($args)) {
-        if (is_array(common_config('db', 'mirror'))) {
-            // "load balancing", ha ha
-            $arr = common_config('db', 'mirror');
-            $k = array_rand($arr);
-            $mirror = $arr[$k];
-        } else {
-            $mirror = common_config('db', 'mirror');
-        }
-
-        // everyone else uses the mirror
-
-        $config['db']['database'] = $mirror;
-    }
-}
-
 function isLoginAction($action)
 {
     static $loginActions =  array('login', 'recoverpassword', 'api', 'doc', 'register', 'publicxrds', 'otp', 'opensearch', 'rsd', 'hostmeta');
@@ -315,7 +295,7 @@ function main()
 
     Event::handle('ArgsInitialize', array(&$args));
 
-    $action = $args['action'];
+    $action = basename($args['action']);
 
     if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) {
         common_redirect(common_local_url('public'));
@@ -356,14 +336,8 @@ function main()
         $cac = new ClientErrorAction(_('Unknown action'), 404);
         $cac->showPage();
     } else {
-        $action_obj = new $action_class();
-
-        checkMirror($action_obj, $args);
-
         try {
-            if ($action_obj->prepare($args)) {
-                $action_obj->handle($args);
-            }
+            call_user_func("$action_class::run", $args);
         } catch (ClientException $cex) {
             $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode());
             $cac->showPage();
diff --git a/lib/action.php b/lib/action.php
index 8e0f7be94a..3b87b3f5ec 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -55,7 +55,20 @@ require_once INSTALLDIR.'/lib/htmloutputter.php';
  */
 class Action extends HTMLOutputter // lawsuit
 {
-    var $args;
+    // This should be protected/private in the future
+    public $args = array();
+
+    // Action properties, set per-class
+    protected $action = false;
+    protected $ajax   = false;
+    protected $menus  = true;
+
+    // The currently scoped profile
+    protected $scoped = null;
+
+    // Messages to the front-end user
+    protected $error = null;
+    protected $msg   = null;
 
     /**
      * Constructor
@@ -73,6 +86,44 @@ class Action extends HTMLOutputter // lawsuit
         parent::__construct($output, $indent);
     }
 
+    function getError()
+    {
+        return $this->error;
+    }
+
+    function getInfo()
+    {
+        return $this->msg;
+    }
+
+    static public function run(array $args=array(), $output='php://output', $indent=null) {
+        $class = get_called_class();
+        $action = new $class($output, $indent);
+        $action->execute($args);
+        return $action;
+    }
+
+    public function execute(array $args=array()) {
+        // checkMirror stuff
+        if (common_config('db', 'mirror') && $this->isReadOnly($args)) {
+            if (is_array(common_config('db', 'mirror'))) {
+                // "load balancing", ha ha
+                $arr = common_config('db', 'mirror');
+                $k = array_rand($arr);
+                $mirror = $arr[$k];
+            } else {
+                $mirror = common_config('db', 'mirror');
+            }
+
+            // everyone else uses the mirror
+            common_config_set('db', 'database', $mirror);
+        }
+
+        if ($this->prepare($args)) {
+            $this->handle($args);
+        }
+    }
+
     /**
      * For initializing members of the class.
      *
@@ -80,14 +131,19 @@ class Action extends HTMLOutputter // lawsuit
      *
      * @return boolean true
      */
-    function prepare($argarray)
+    function prepare(array $args=array())
     {
-        $this->args =& common_copy_args($argarray);
+        $this->args = common_copy_args($args);
 
-        if ($this->boolean('ajax')) {
+        $this->action = $this->trimmed('action');
+
+        if ($this->ajax || $this->boolean('ajax')) {
+            // check with StatusNet::isAjax()
             StatusNet::setAjax(true);
         }
 
+        $this->scoped = Profile::current();
+
         return true;
     }