Allow displaying several confirmations on one page.
authorGunnar Wrobel <wrobel@temple.(none)>
Tue, 9 Mar 2010 16:13:29 +0000 (17:13 +0100)
committerGunnar Wrobel <wrobel@temple.(none)>
Tue, 9 Mar 2010 16:13:29 +0000 (17:13 +0100)
framework/LoginTasks/lib/Horde/LoginTasks/Task.php
framework/LoginTasks/lib/Horde/LoginTasks/Tasklist.php
framework/LoginTasks/test/Horde/LoginTasks/LoginTasksTest.php

index b33cc15..95c8417 100644 (file)
@@ -85,4 +85,32 @@ abstract class Horde_LoginTasks_Task
         return '';
     }
 
+    /**
+     * Indicates if the display of the current task should be joined with the
+     * given previous task.
+     *
+     * @param Horde_Login_Task $previous The previous task to display.
+     *
+     * @return boolean True in case both tasks should be displayed together.
+     */
+    public function joinDisplayWith(Horde_LoginTasks_Task $previous)
+    {
+        if ($this->display == $previous->display) {
+            return true;
+        }
+        if ($this->_isConfirmTask($this) && $this->_isConfirmTask($previous)) {
+            return true;
+        }
+        return false;
+    }
+
+    private function _isConfirmTask($task)
+    {
+        return in_array(
+            $task->display,
+            array(Horde_LoginTasks::DISPLAY_CONFIRM_YES,
+                  Horde_LoginTasks::DISPLAY_CONFIRM_NO)
+        );
+    }
+
 }
index e1e2fd5..cdd922f 100644 (file)
@@ -124,16 +124,16 @@ class Horde_LoginTasks_Tasklist
     public function needDisplay($advance = false)
     {
         $tmp = array();
-        $display = null;
+        $previous = null;
 
         reset($this->_tasks);
         while (list($k, $v) = each($this->_tasks)) {
             if (!$v['display'] ||
-                (!is_null($display) && ($v['task']->display != $display))) {
+                (!is_null($previous) && !$v['task']->joinDisplayWith($previous))) {
                 break;
             }
             $tmp[] = $v['task'];
-            $display = $v['task']->display;
+            $previous = $v['task'];
         }
 
         if ($advance) {
index 4335c68..6da5448 100644 (file)
@@ -440,7 +440,7 @@ class Horde_LoginTasks_LoginTasksTest extends PHPUnit_Framework_TestCase
                 'Horde_LoginTasks_Stub_ConfirmTwo',
                 'Horde_LoginTasks_Stub_TaskTwo',
                 'Horde_LoginTasks_Stub_ConfirmThree',
-                'Horde_LoginTasks_Stub_Notice',
+                'Horde_LoginTasks_Stub_NoticeTwo',
             ),
             true
         );
@@ -461,24 +461,28 @@ class Horde_LoginTasks_LoginTasksTest extends PHPUnit_Framework_TestCase
         asort($classes);
         $this->assertEquals(
             array(
-                'Horde_LoginTasks_Stub_ConfirmNo'
+                'Horde_LoginTasks_Stub_ConfirmNo',
+                'Horde_LoginTasks_Stub_Confirm'
             ),
             $classes
         );
         $_POST['logintasks_confirm_0'] = true;
+        $_POST['logintasks_confirm_1'] = true;
         $this->assertEquals(
             'redirect',
-            $tasks->runTasks(true, null)
+            $tasks->runTasks(true)
         );
         $this->assertEquals(
             array(
                 'Horde_LoginTasks_Stub_ConfirmNo',
+                'Horde_LoginTasks_Stub_Confirm',
+                'Horde_LoginTasks_Stub_Task',
             ),
             Horde_LoginTasks_Stub_Task::$executed
         );
         $this->assertContains(
             'http:///services/logintasks.php?app=test',
-            (string) $tasks->runTasks(false, null)
+            (string) $tasks->runTasks(false)
         );
         $this->assertEquals(
             array(