]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/action.php
change Action::init() to Action::prepare() to avoid conflict with RSS10Action::init()
[quix0rs-gnu-social.git] / lib / action.php
index c346c751313482206230f1d016a7379bfdc62005..7a2461bb5cf60640d2bc80d2e940f1eba1e44ff5 100644 (file)
@@ -26,24 +26,117 @@ class Action { // lawsuit
        function Action() {
        }
 
-       function arg($key) {
+       # For initializing members of the class
+
+       function prepare($argarray) {
+               $this->args =& common_copy_args($argarray);
+               return true;
+       }
+
+       # For comparison with If-Last-Modified
+       # If not applicable, return NULL
+
+       function last_modified() {
+               return NULL;
+       }
+
+       function etag() {
+               return NULL;
+       }
+
+       function is_readonly() {
+               return false;
+       }
+
+       function arg($key, $def=NULL) {
                if (array_key_exists($key, $this->args)) {
                        return $this->args[$key];
                } else {
-                       return NULL;
+                       return $def;
                }
        }
 
-       function trimmed($key) {
-               $arg = $this->arg($key);
+       function trimmed($key, $def=NULL) {
+               $arg = $this->arg($key, $def);
                return (is_string($arg)) ? trim($arg) : $arg;
        }
-       
-       function handle($argarray) {
-               $strip = get_magic_quotes_gpc();
-               $this->args = array();
-               foreach ($argarray as $k => $v) {
-                       $this->args[$k] = ($strip) ? stripslashes($v) : $v;
+
+       # Note: argarray ignored, since it's now passed in in prepare()
+
+       function handle($argarray=NULL) {
+
+               $lm = $this->last_modified();
+               $etag = $this->etag();
+
+               if ($etag) {
+                       header('ETag: ' . $etag);
+               }
+
+               if ($lm) {
+                       header('Last-Modified: ' . date(DATE_RFC1123, $lm));
+                       $if_modified_since = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
+                       if ($if_modified_since) {
+                               $ims = strtotime($if_modified_since);
+                               if ($lm <= $ims) {
+                                       if (!$etag || $this->_has_etag($etag, $_SERVER['HTTP_IF_NONE_MATCH'])) {
+                                               header('HTTP/1.1 304 Not Modified');
+                                               # Better way to do this?
+                                               exit(0);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       function _has_etag($etag, $if_none_match) {
+               return ($if_none_match) && in_array($etag, explode(',', $if_none_match));
+       }
+
+       function boolean($key, $def=false) {
+               $arg = strtolower($this->trimmed($key));
+
+               if (is_null($arg)) {
+                       return $def;
+               } else if (in_array($arg, array('true', 'yes', '1'))) {
+                       return true;
+               } else if (in_array($arg, array('false', 'no', '0'))) {
+                       return false;
+               } else {
+                       return $def;
+               }
+       }
+
+       function server_error($msg, $code=500) {
+               $action = $this->trimmed('action');
+               common_debug("Server error '$code' on '$action': $msg", __FILE__);
+               common_server_error($msg, $code);
+       }
+
+       function client_error($msg, $code=400) {
+               $action = $this->trimmed('action');
+               common_debug("User error '$code' on '$action': $msg", __FILE__);
+               common_user_error($msg, $code);
+       }
+
+       function self_url() {
+               $action = $this->trimmed('action');
+               $args = $this->args;
+               unset($args['action']);
+               foreach (array_keys($_COOKIE) as $cookie) {
+                       unset($args[$cookie]);
                }
+               return common_local_url($action, $args);
+       }
+
+       function nav_menu($menu) {
+        $action = $this->trimmed('action');
+        common_element_start('ul', array('id' => 'nav_views'));
+        foreach ($menu as $menuaction => $menudesc) {
+            common_menu_item(common_local_url($menuaction, isset($menudesc[2]) ? $menudesc[2] : NULL),
+                                                        $menudesc[0],
+                                                        $menudesc[1],
+                                                        $action == $menuaction);
+        }
+        common_element_end('ul');
        }
 }