From a296ba5b18487d312acca2513d461a210a460fae Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sun, 3 Jan 2016 16:43:13 -0500 Subject: Improve Automatic Actions plugin api --- app/Core/Action/ActionManager.php | 141 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 app/Core/Action/ActionManager.php (limited to 'app/Core/Action') diff --git a/app/Core/Action/ActionManager.php b/app/Core/Action/ActionManager.php new file mode 100644 index 00000000..921a8b98 --- /dev/null +++ b/app/Core/Action/ActionManager.php @@ -0,0 +1,141 @@ +actions[$action->getName()] = $action; + return $this; + } + + /** + * Get automatic action instance + * + * @access public + * @param string $name Absolute class name with namespace + * @return ActionBase + */ + public function getAction($name) + { + if (isset($this->actions[$name])) { + return $this->actions[$name]; + } + + throw new RuntimeException('Automatic Action Not Found: '.$name); + } + + /** + * Get available automatic actions + * + * @access public + * @return array + */ + public function getAvailableActions() + { + $actions = array(); + + foreach ($this->actions as $action) { + if (count($action->getEvents()) > 0) { + $actions[$action->getName()] = $action->getDescription(); + } + } + + asort($actions); + + return $actions; + } + + /** + * Get all available action parameters + * + * @access public + * @param array $actions + * @return array + */ + public function getAvailableParameters(array $actions) + { + $params = array(); + + foreach ($actions as $action) { + $currentAction = $this->getAction($action['action_name']); + $params[$currentAction->getName()] = $currentAction->getActionRequiredParameters(); + } + + return $params; + } + + /** + * Get list of compatible events for a given action + * + * @access public + * @param string $name + * @return array + */ + public function getCompatibleEvents($name) + { + $events = array(); + $actionEvents = $this->getAction($name)->getEvents(); + + foreach ($this->eventManager->getAll() as $event => $description) { + if (in_array($event, $actionEvents)) { + $events[$event] = $description; + } + } + + return $events; + } + + /** + * Bind automatic actions to events + * + * @access public + * @return ActionManager + */ + public function attachEvents() + { + if ($this->userSession->isLogged()) { + $actions = $this->action->getAllByUser($this->userSession->getId()); + } else { + $actions = $this->action->getAll(); + } + + foreach ($actions as $action) { + $listener = $this->getAction($action['action_name'])->setProjectId($action['project_id']); + + foreach ($action['params'] as $param_name => $param_value) { + $listener->setParam($param_name, $param_value); + } + + $this->dispatcher->addListener($action['event_name'], array($listener, 'execute')); + } + + return $this; + } +} -- cgit v1.2.3 From ff1de5c06d536be7fe2875820d4d0b2849512cb5 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sun, 10 Jan 2016 14:00:34 -0500 Subject: Fix bug: Automatic action listeners were using the same instance --- ChangeLog | 4 +++ app/Core/Action/ActionManager.php | 3 ++- tests/units/Core/Action/ActionManagerTest.php | 39 +++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) (limited to 'app/Core/Action') diff --git a/ChangeLog b/ChangeLog index c3b1b019..5ad4c140 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,10 @@ New features: * Forgot Password +Bug fixes: + +* Automatic action listeners were using the same instance + Version 1.0.23 -------------- diff --git a/app/Core/Action/ActionManager.php b/app/Core/Action/ActionManager.php index 921a8b98..f1ea8abe 100644 --- a/app/Core/Action/ActionManager.php +++ b/app/Core/Action/ActionManager.php @@ -127,7 +127,8 @@ class ActionManager extends Base } foreach ($actions as $action) { - $listener = $this->getAction($action['action_name'])->setProjectId($action['project_id']); + $listener = clone $this->getAction($action['action_name']); + $listener->setProjectId($action['project_id']); foreach ($action['params'] as $param_name => $param_value) { $listener->setParam($param_name, $param_value); diff --git a/tests/units/Core/Action/ActionManagerTest.php b/tests/units/Core/Action/ActionManagerTest.php index 492b9e03..aae5bd2d 100644 --- a/tests/units/Core/Action/ActionManagerTest.php +++ b/tests/units/Core/Action/ActionManagerTest.php @@ -154,4 +154,43 @@ class ActionManagerTest extends Base $this->assertEquals(2, $listeners[0][0]->getProjectId()); } + + public function testThatEachListenerAreDifferentInstance() + { + $projectModel = new Project($this->container); + $projectUserRoleModel = new ProjectUserRole($this->container); + $actionModel = new Action($this->container); + $actionTaskAssignColorColumn = new TaskAssignColorColumn($this->container); + $actionManager = new ActionManager($this->container); + $actionManager->register($actionTaskAssignColorColumn); + + $this->assertEquals(1, $projectModel->create(array('name' =>'test1'))); + $actions = $actionManager->getAvailableActions(); + + $this->assertEquals(1, $actionModel->create(array( + 'project_id' => 1, + 'event_name' => Task::EVENT_MOVE_COLUMN, + 'action_name' => key($actions), + 'params' => array('column_id' => 2, 'color_id' => 'green'), + ))); + + $this->assertEquals(2, $actionModel->create(array( + 'project_id' => 1, + 'event_name' => Task::EVENT_MOVE_COLUMN, + 'action_name' => key($actions), + 'params' => array('column_id' => 1, 'color_id' => 'red'), + ))); + + $actionManager->attachEvents(); + + $listeners = $this->container['dispatcher']->getListeners(Task::EVENT_MOVE_COLUMN); + $this->assertCount(2, $listeners); + $this->assertFalse($listeners[0][0] === $listeners[1][0]); + + $this->assertEquals(2, $listeners[0][0]->getParam('column_id')); + $this->assertEquals('green', $listeners[0][0]->getParam('color_id')); + + $this->assertEquals(1, $listeners[1][0]->getParam('column_id')); + $this->assertEquals('red', $listeners[1][0]->getParam('color_id')); + } } -- cgit v1.2.3