From d9e9c1bb60342ce88be150cc05de21dabfe130b2 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Thu, 9 Aug 2012 23:28:11 +0200
Subject: [PATCH] extract method for Input class

makes it easier to access our do parameters
---
 _test/tests/inc/input.test.php | 19 ++++++++++++++++++-
 inc/Input.class.php            | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/_test/tests/inc/input.test.php b/_test/tests/inc/input.test.php
index 761b7ddbc..59b5ea4b9 100644
--- a/_test/tests/inc/input.test.php
+++ b/_test/tests/inc/input.test.php
@@ -12,7 +12,8 @@ class input_test extends DokuWikiTest {
         'zero'   => '0',
         'one'    => '1',
         'empty'  => '',
-        'emptya' => array()
+        'emptya' => array(),
+        'do'     => array('save' => 'Speichern'),
     );
 
     public function test_str() {
@@ -213,4 +214,20 @@ class input_test extends DokuWikiTest {
         $this->assertEquals('bla',$test);
     }
 
+    public function test_extract(){
+        $_REQUEST = $this->data;
+        $_POST    = $this->data;
+        $_GET     = $this->data;
+        $INPUT    = new Input();
+
+        $this->assertEquals('save', $INPUT->extract('do')->str('do'));
+        $this->assertEquals('', $INPUT->extract('emptya')->str('emptya'));
+        $this->assertEquals('foo', $INPUT->extract('string')->str('string'));
+        $this->assertEquals('foo', $INPUT->extract('array')->str('array'));
+
+        $this->assertEquals('save', $INPUT->post->extract('do')->str('do'));
+        $this->assertEquals('', $INPUT->post->extract('emptya')->str('emptya'));
+        $this->assertEquals('foo', $INPUT->post->extract('string')->str('string'));
+        $this->assertEquals('foo', $INPUT->post->extract('array')->str('array'));
+    }
 }
diff --git a/inc/Input.class.php b/inc/Input.class.php
index f4174404a..35aecdb45 100644
--- a/inc/Input.class.php
+++ b/inc/Input.class.php
@@ -175,6 +175,40 @@ class Input {
         return (array) $this->access[$name];
     }
 
+    /**
+     * Create a simple key from an array key
+     *
+     * This is useful to access keys where the information is given as an array key or as a single array value.
+     * For example when the information was submitted as the name of a submit button.
+     *
+     * This function directly changes the access array.
+     *
+     * Eg. $_REQUEST['do']['save']='Speichern' becomes $_REQUEST['do'] = 'save'
+     *
+     * This function returns the $INPUT object itself for easy chaining
+     *
+     * @param $name
+     * @return Input
+     */
+    public function extract($name){
+        if(!isset($this->access[$name])) return $this;
+        if(!is_array($this->access[$name])) return $this;
+        $keys = array_keys($this->access[$name]);
+        if(!$keys){
+            // this was an empty array
+            $this->remove($name);
+            return $this;
+        }
+        // get the first key
+        $value = array_shift($keys);
+        if($value === 0){
+            // we had a numeric array, assume the value is not in the key
+            $value = array_shift($this->access[$name]);
+        }
+
+        $this->set($name, $value);
+        return $this;
+    }
 }
 
 /**
-- 
GitLab