summaryrefslogtreecommitdiff
path: root/app/Action/Base.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/Action/Base.php')
-rw-r--r--app/Action/Base.php116
1 files changed, 98 insertions, 18 deletions
diff --git a/app/Action/Base.php b/app/Action/Base.php
index 5b7b3502..339aeecc 100644
--- a/app/Action/Base.php
+++ b/app/Action/Base.php
@@ -3,12 +3,17 @@
namespace Action;
use Core\Listener;
+use Core\Registry;
+use Core\Tool;
/**
* Base class for automatic actions
*
* @package action
* @author Frederic Guillot
+ *
+ * @property \Model\Acl $acl
+ * @property \Model\Task $task
*/
abstract class Base implements Listener
{
@@ -29,6 +34,22 @@ abstract class Base implements Listener
private $params = array();
/**
+ * Attached event name
+ *
+ * @access protected
+ * @var string
+ */
+ protected $event_name = '';
+
+ /**
+ * Registry instance
+ *
+ * @access protected
+ * @var \Core\Registry
+ */
+ protected $registry;
+
+ /**
* Execute the action
*
* @abstract
@@ -57,14 +78,59 @@ abstract class Base implements Listener
abstract public function getEventRequiredParameters();
/**
+ * Get the compatible events
+ *
+ * @abstract
+ * @access public
+ * @return array
+ */
+ abstract public function getCompatibleEvents();
+
+ /**
+ * Check if the event data meet the action condition
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool
+ */
+ abstract public function hasRequiredCondition(array $data);
+
+ /**
* Constructor
*
* @access public
- * @param integer $project_id Project id
+ * @param \Core\Registry $registry Regsitry instance
+ * @param integer $project_id Project id
+ * @param string $event_name Attached event name
*/
- public function __construct($project_id)
+ public function __construct(Registry $registry, $project_id, $event_name)
{
+ $this->registry = $registry;
$this->project_id = $project_id;
+ $this->event_name = $event_name;
+ }
+
+ /**
+ * Return class information
+ *
+ * @access public
+ * @return string
+ */
+ public function __toString()
+ {
+ return get_called_class();
+ }
+
+ /**
+ * Load automatically models
+ *
+ * @access public
+ * @param string $name Model name
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ return Tool::loadModel($this->registry, $name);
}
/**
@@ -101,11 +167,34 @@ abstract class Base implements Listener
*/
public function isExecutable(array $data)
{
- if (isset($data['project_id']) && $data['project_id'] == $this->project_id && $this->hasRequiredParameters($data)) {
- return true;
- }
+ return $this->hasCompatibleEvent() &&
+ $this->hasRequiredProject($data) &&
+ $this->hasRequiredParameters($data) &&
+ $this->hasRequiredCondition($data);
+ }
- return false;
+ /**
+ * Check if the event is compatible with the action
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool
+ */
+ public function hasCompatibleEvent()
+ {
+ return in_array($this->event_name, $this->getCompatibleEvents());
+ }
+
+ /**
+ * Check if the event data has the required project
+ *
+ * @access public
+ * @param array $data Event data dictionary
+ * @return bool
+ */
+ public function hasRequiredProject(array $data)
+ {
+ return isset($data['project_id']) && $data['project_id'] == $this->project_id;
}
/**
@@ -118,7 +207,9 @@ abstract class Base implements Listener
public function hasRequiredParameters(array $data)
{
foreach ($this->getEventRequiredParameters() as $parameter) {
- if (! isset($data[$parameter])) return false;
+ if (! isset($data[$parameter])) {
+ return false;
+ }
}
return true;
@@ -139,15 +230,4 @@ abstract class Base implements Listener
return false;
}
-
- /**
- * Return class information
- *
- * @access public
- * @return string
- */
- public function __toString()
- {
- return get_called_class();
- }
}