diff options
author | Dmitry <dmitry@dhtmlx.com> | 2012-05-08 14:58:11 +0200 |
---|---|---|
committer | Dmitry <dmitry@dhtmlx.com> | 2012-05-08 14:58:11 +0200 |
commit | 711583417091002845079cb20082a68152054640 (patch) | |
tree | 8e8debe51e30ee8f05832efdbf6e08ff09c27678 /codebase | |
parent | 78bc7500e7c9afb2be508c2ad1ee37f94bff70ef (diff) | |
download | connector-php-711583417091002845079cb20082a68152054640.zip connector-php-711583417091002845079cb20082a68152054640.tar.gz connector-php-711583417091002845079cb20082a68152054640.tar.bz2 |
implements RenderStrategy logic
Diffstat (limited to 'codebase')
-rw-r--r-- | codebase/base_connector.php | 21 | ||||
-rw-r--r-- | codebase/data_connector.php | 64 | ||||
-rw-r--r-- | codebase/grid_connector.php | 5 | ||||
-rw-r--r-- | codebase/scheduler_connector.php | 34 | ||||
-rw-r--r-- | codebase/strategy.php | 200 | ||||
-rw-r--r-- | codebase/tree_connector.php | 29 | ||||
-rw-r--r-- | codebase/treedatamultitable_connector.php | 64 | ||||
-rw-r--r-- | codebase/treegrid_connector.php | 33 | ||||
-rw-r--r-- | codebase/treegridgroup_connector.php | 44 | ||||
-rw-r--r-- | codebase/treegridmultitable_connector.php | 37 | ||||
-rw-r--r-- | codebase/treegroup_connector.php | 43 | ||||
-rw-r--r-- | codebase/treemultitable_connector.php | 44 |
12 files changed, 300 insertions, 318 deletions
diff --git a/codebase/base_connector.php b/codebase/base_connector.php index 451c61d..69f538e 100644 --- a/codebase/base_connector.php +++ b/codebase/base_connector.php @@ -6,6 +6,7 @@ require_once("tools.php"); require_once("db_common.php"); require_once("dataprocessor.php"); +require_once("strategy.php"); require_once("update.php"); //enable buffering to catch and ignore any custom output before XML generation @@ -290,18 +291,20 @@ class Connector { @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. */ - public function __construct($db,$type=false, $item_type=false, $data_type=false){ + public function __construct($db,$type=false, $item_type=false, $data_type=false, $render_type = false){ $this->exec_time=microtime(true); if (!$type) $type="MySQL"; if (class_exists($type."DBDataWrapper",false)) $type.="DBDataWrapper"; if (!$item_type) $item_type="DataItem"; if (!$data_type) $data_type="DataProcessor"; + if (!$render_type) $render_type="RenderStrategy"; $this->names=array( "db_class"=>$type, "item_class"=>$item_type, "data_class"=>$data_type, + "render_class"=>$render_type ); $this->config = new DataConfig(); @@ -312,6 +315,7 @@ class Connector { if (!class_exists($this->names["db_class"],false)) throw new Exception("DB class not found: ".$this->names["db_class"]); $this->sql = new $this->names["db_class"]($db,$this->config); + $this->render = new $this->names["render_class"](); $this->db=$db;//saved for options connectors, if any @@ -332,7 +336,7 @@ class Connector { } public function get_request(){ - return new DataRequestConfig($this->config); + return new DataRequestConfig($this->request); } @@ -551,18 +555,7 @@ class Connector { process commands, output requested data as XML */ protected function render_set($res){ - $output=""; - $index=0; - $this->event->trigger("beforeRenderSet",$this,$res,$this->config); - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - if ($data->get_id()===false) - $data->set_id($this->uuid()); - $this->event->trigger("beforeRender",$data); - $output.=$data->to_xml().$this->data_separator; - $index++; - } - return $output; + return $this->render->render_set($res, $this, $this->names["item_class"], $this->dload, $this->data_separator); } /*! output fetched data as XML diff --git a/codebase/data_connector.php b/codebase/data_connector.php index 6f376a4..5b11cfa 100644 --- a/codebase/data_connector.php +++ b/codebase/data_connector.php @@ -87,10 +87,11 @@ class DataConnector extends Connector{ @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ if (!$item_type) $item_type="CommonDataItem"; if (!$data_type) $data_type="CommonDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="RenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } protected function parse_request_mode(){ @@ -299,10 +300,11 @@ class TreeCommonDataItem extends CommonDataItem{ class TreeDataConnector extends DataConnector{ protected $id_swap = array(); - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ if (!$item_type) $item_type="TreeCommonDataItem"; if (!$data_type) $data_type="CommonDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="TreeRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); @@ -341,73 +343,25 @@ class TreeDataConnector extends DataConnector{ $this->request->set_relation("0"); } - protected function render_set($res){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode just exec sub-render routine - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation($data->get_id()); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - } class JSONTreeDataConnector extends TreeDataConnector{ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type){ if (!$item_type) $item_type="JSONTreeCommonDataItem"; if (!$data_type) $data_type="CommonDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="JSONTreeRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); } - protected function render_set($res){ - $output=array(); - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode just exec sub-render routine - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $record = &$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation($data->get_id()); - $temp = &$this->render_set($this->sql->select($sub_request)); - if (sizeof($temp)) - $record["data"] = $temp; - } - $output[] = $record; - $index++; - } - return $output; - } - protected function output_as_xml($res){ $data = array(); $data["parent"] = $this->request->get_relation(); $data["data"] = $this->render_set($res); - $out = new OutputWriter(json_encode($data), ""); $out->set_type("json"); $this->event->trigger("beforeOutput", $this, $out); diff --git a/codebase/grid_connector.php b/codebase/grid_connector.php index 2fe043e..229e9ff 100644 --- a/codebase/grid_connector.php +++ b/codebase/grid_connector.php @@ -145,10 +145,11 @@ class GridConnector extends Connector{ @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ if (!$item_type) $item_type="GridDataItem"; if (!$data_type) $data_type="GridDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="RenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } diff --git a/codebase/scheduler_connector.php b/codebase/scheduler_connector.php index 4ee0bd1..f9921b1 100644 --- a/codebase/scheduler_connector.php +++ b/codebase/scheduler_connector.php @@ -86,11 +86,14 @@ class SchedulerConnector extends Connector{ name of class, which will be used for item rendering, optional, DataItem will be used by default @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. + * @param render_type + name of class which will be used for rendering. */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ if (!$item_type) $item_type="SchedulerDataItem"; if (!$data_type) $data_type="SchedulerDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="RenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } //parse GET scoope, all operations with incoming request must be done here @@ -159,32 +162,13 @@ class JSONSchedulerConnector extends SchedulerConnector { @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ if (!$item_type) $item_type="JSONSchedulerDataItem"; if (!$data_type) $data_type="SchedulerDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="JSONRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } - - /*! render from DB resultset - @param res - DB resultset - process commands, output requested data as XML - */ - protected function render_set($res){ - $output=array(); - $index=0; - $this->event->trigger("beforeRenderSet",$this,$res,$this->config); - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - if ($data->get_id()===false) - $data->set_id($this->uuid()); - $this->event->trigger("beforeRender",$data); - $output[]=$data->to_xml(); - $index++; - } - return json_encode($output); - } - + protected function xml_start() { return '{ "data":'; } diff --git a/codebase/strategy.php b/codebase/strategy.php new file mode 100644 index 0000000..506a5e6 --- /dev/null +++ b/codebase/strategy.php @@ -0,0 +1,200 @@ +<?php + +class RenderStrategy { + + /*! render from DB resultset + @param res + DB resultset + process commands, output requested data as XML + */ + public function render_set($res, $conn, $name, $dload, $sep){ + $output=""; + $index=0; + $conn->event->trigger("beforeRenderSet",$conn,$res,$conn->get_config()); + while ($data=$conn->sql->get_next($res)){ + $data = new $name($data,$conn->get_config(),$index); + if ($data->get_id()===false) + $data->set_id($conn->uuid()); + $conn->event->trigger("beforeRender",$data); + $output.=$data->to_xml().$sep; + $index++; + } + return $output; + } + +} + +class JSONRenderStrategy { + + /*! render from DB resultset + @param res + DB resultset + process commands, output requested data as json + */ + public function render_set($res, $conn, $name, $dload, $sep){ + $output=array(); + $index=0; + $conn->event->trigger("beforeRenderSet",$conn,$res,$conn->get_config()); + while ($data=$conn->sql->get_next($res)){ + $data = new $name($data,$conn->get_config(),$index); + if ($data->get_id()===false) + $data->set_id($conn->uuid()); + $conn->event->trigger("beforeRender",$data); + $output[]=$data->to_xml(); + $index++; + } + return json_encode($output); + } + +} + +class TreeRenderStrategy extends RenderStrategy { + + public function render_set($res, $conn, $name, $dload, $sep){ + $output=""; + $index=0; + while ($data=$conn->sql->get_next($res)){ + $data = new $name($data,$conn->get_config(),$index); + $conn->event->trigger("beforeRender",$data); + //there is no info about child elements, + //if we are using dyn. loading - assume that it has, + //in normal mode juse exec sub-render routine + if ($data->has_kids()===-1 && $dload) + $data->set_kids(true); + $output.=$data->to_xml_start(); + if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload)){ + $sub_request = new DataRequestConfig($conn->get_request()); + $sub_request->set_relation($data->get_id()); + $output.=$this->render_set($conn->sql->select($sub_request), $conn, $name, $dload, $sep); + } + $output.=$data->to_xml_end(); + $index++; + } + return $output; + } + +} + + + +class JSONTreeRenderStrategy extends RenderStrategy { + + public function render_set($res, $conn, $name, $dload, $sep){ + $output=array(); + $index=0; + while ($data=$conn->sql->get_next($res)){ + $data = new $name($data,$conn->get_config(),$index); + $conn->event->trigger("beforeRender",$data); + //there is no info about child elements, + //if we are using dyn. loading - assume that it has, + //in normal mode just exec sub-render routine + if ($data->has_kids()===-1 && $dload) + $data->set_kids(true); + $record = $data->to_xml_start(); + if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload)){ + $sub_request = new DataRequestConfig($conn->get_request()); + $sub_request->set_relation($data->get_id()); + $temp = $this->render_set($conn->sql->select($sub_request), $conn, $name, $dload, $sep); + if (sizeof($temp)) + $record["data"] = $temp; + } + $output[] = $record; + $index++; + } + return $output; + } + +} + + +class MultitableRenderStrategy extends RenderStrategy { + + public function render_set($res, $conn, $name, $dload, $sep){ + $output=""; + $index=0; + $config = $conn->get_config(); + while ($data=$conn->sql->get_next($res)){ + $data[$config->id['name']] = $conn->level_id($data[$config->id['name']]); + $data = new $name($data,$config,$index); + $conn->event->trigger("beforeRender",$data); + if (($conn->getMaxLevel() !== null)&&($conn->get_level() == $conn->getMaxLevel())) { + $data->set_kids(false); + } else { + if ($data->has_kids()===-1) + $data->set_kids(true); + } + $output.=$data->to_xml_start(); + $output.=$data->to_xml_end(); + $index++; + } + return $output; + } + +} + + +class JSONMultitableRenderStrategy extends MultitableRenderStrategy { + + public function render_set($res, $conn, $name, $dload, $sep){ + $output=array(); + $index=0; + $config = $conn->get_config(); + while ($data=$conn->sql->get_next($res)){ + $data[$config->id['name']] = $conn->level_id($data[$config->id['name']]); + $data = new $name($data,$config,$index); + $conn->event->trigger("beforeRender",$data); + + if ($conn->is_max_level()) { + $data->set_kids(false); + } else { + if ($data->has_kids()===-1) + $data->set_kids(true); + } + $record = $data->to_xml_start($output); + $output[] = $record; + $index++; + } + return $output; + } + +} + + +class GroupRenderStrategy extends RenderStrategy { + + public function render_set($res, $conn, $name, $dload, $sep){ + $output=""; + $index=0; + $config = $conn->get_config(); + while ($data=$conn->sql->get_next($res)){ + if (isset($data[$config->id['name']])) { + $has_kids = false; + } else { + $data[$config->id['name']] = $data['value'].$conn->get_id_postfix(); + $data[$config->text[0]['name']] = $data['value']; + $has_kids = true; + } + $data = new $name($data,$config,$index); + $conn->event->trigger("beforeRender",$data); + if ($has_kids === false) { + $data->set_kids(false); + } + + if ($data->has_kids()===-1 && $dload) + $data->set_kids(true); + $output.=$data->to_xml_start(); + if (($data->has_kids()===-1 || ( $data->has_kids()==true && !$dload))&&($has_kids == true)){ + $sub_request = new DataRequestConfig($conn->get_request()); + $sub_request->set_relation(str_replace($conn->get_id_postfix(), "", $data->get_id())); + $output.=$this->render_set($conn->sql->select($sub_request), $conn, $name, $dload, $sep); + } + $output.=$data->to_xml_end(); + $index++; + } + return $output; + } + +} + + +?>
\ No newline at end of file diff --git a/codebase/tree_connector.php b/codebase/tree_connector.php index dff0867..d002304 100644 --- a/codebase/tree_connector.php +++ b/codebase/tree_connector.php @@ -174,10 +174,11 @@ class TreeConnector extends Connector{ @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false, $render_type=false){ if (!$item_type) $item_type="TreeDataItem"; if (!$data_type) $data_type="TreeDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="TreeRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); @@ -213,31 +214,7 @@ class TreeConnector extends Connector{ $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode } - - - protected function render_set($res){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode juse exec sub-render routine - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation($data->get_id()); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } /*! renders self as xml, starting part */ public function xml_start(){ diff --git a/codebase/treedatamultitable_connector.php b/codebase/treedatamultitable_connector.php index f7bd43f..af00b88 100644 --- a/codebase/treedatamultitable_connector.php +++ b/codebase/treedatamultitable_connector.php @@ -10,9 +10,10 @@ class TreeDataMultitableConnector extends TreeDataConnector{ protected $level = 0; protected $max_level = null; - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - $data_type="TreeDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ + if (!$data_type) $data_type="TreeDataProcessor"; + if (!$render_type) $render_type="MultitableRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("beforeProcessing", Array($this, 'id_translate_before')); $this->event->attach("afterProcessing", Array($this, 'id_translate_after')); } @@ -64,27 +65,6 @@ class TreeDataMultitableConnector extends TreeDataConnector{ $this->end_run(); } - protected function render_set($res){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data[$this->config->id['name']] = $this->level_id($data[$this->config->id['name']]); - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - - if ($this->is_max_level()) { - $data->set_kids(false); - } else { - if ($data->has_kids()===-1) - $data->set_kids(true); - } - $output.=$data->to_xml_start(); - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - public function xml_start(){ if (isset($_GET['parent'])) { return "<data parent='".$_GET['parent']."'>"; @@ -131,13 +111,19 @@ class TreeDataMultitableConnector extends TreeDataConnector{ } - protected function is_max_level() { + /*! gets maximum level of tree data + */ + public function getMaxLevel() { + return $this->max_level; + } + + + public function is_max_level() { if (($this->max_level !== null) && ($this->level >= $this->max_level)) return true; return false; - } - + /*! remove level prefix from id, parent id and set new id before processing @param action @@ -178,28 +164,8 @@ class JSONTreeDataMultitableConnector extends TreeDataMultitableConnector{ public function __construct($res,$type=false,$item_type=false,$data_type=false){ if (!$item_type) $item_type="JSONTreeCommonDataItem"; if (!$data_type) $data_type="CommonDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); - } - - protected function render_set($res){ - $output=array(); - $index=0; - while ($data=$this->sql->get_next($res)){ - $data[$this->config->id['name']] = $this->level_id($data[$this->config->id['name']]); - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - - if ($this->is_max_level()) { - $data->set_kids(false); - } else { - if ($data->has_kids()===-1) - $data->set_kids(true); - } - $record = $data->to_xml_start($output); - $output[] = $record; - $index++; - } - return $output; + if (!$render_type) $render_type="JSONMultitableRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } protected function output_as_xml($res){ diff --git a/codebase/treegrid_connector.php b/codebase/treegrid_connector.php index 308fcf4..f1270bf 100644 --- a/codebase/treegrid_connector.php +++ b/codebase/treegrid_connector.php @@ -66,10 +66,11 @@ class TreeGridConnector extends GridConnector{ @param data_type name of class which will be used for dataprocessor calls handling, optional, DataProcessor class will be used by default. */ - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ if (!$item_type) $item_type="TreeGridDataItem"; if (!$data_type) $data_type="TreeGridDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="TreeRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); @@ -106,32 +107,8 @@ class TreeGridConnector extends GridConnector{ $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode } - - /*! process treegrid specific options in incoming request - */ - protected function render_set($res){ - $output=""; - $index=0; - while ($data=$this->sql->get_next($res)){ - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - //there is no info about child elements, - //if we are using dyn. loading - assume that it has, - //in normal mode juse exec sub-render routine - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if ($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation($data->get_id()); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - + + /*! renders self as xml, starting part */ protected function xml_start(){ diff --git a/codebase/treegridgroup_connector.php b/codebase/treegridgroup_connector.php index b8c725e..4140c2c 100644 --- a/codebase/treegridgroup_connector.php +++ b/codebase/treegridgroup_connector.php @@ -9,12 +9,18 @@ class TreeGridGroupConnector extends TreeGridConnector{ private $id_postfix = '__{group_param}'; - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - parent::__construct($res,$type,$item_type,$data_type); + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ + if (!$render_type) $render_type="GroupRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("beforeProcessing", Array($this, 'check_id')); } + public function get_id_postfix() { + return $this->id_postfix; + } + + public function render(){ if (isset($_GET['id'])) { $_GET['id'] = str_replace($this->id_postfix, "", $_GET['id']); @@ -55,40 +61,6 @@ class TreeGridGroupConnector extends TreeGridConnector{ $this->end_run(); } - - protected function render_set($res){ - $output=""; - $index=0; - $records = Array(); - while ($data=$this->sql->get_next($res)){ - if (isset($data[$this->config->id['name']])) { - $has_kids = false; - } else { - $data[$this->config->id['name']] = $data['value'].$this->id_postfix; - $data[$this->config->text[0]['name']] = $data['value']; - $has_kids = true; - } - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - if ($has_kids === false) { - $data->set_kids(false); - } - - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if (($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload))&&($has_kids == true)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation(str_replace($this->id_postfix, "", $data->get_id())); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - - /*! renders self as xml, starting part */ protected function xml_start(){ diff --git a/codebase/treegridmultitable_connector.php b/codebase/treegridmultitable_connector.php index 29e0dbd..4e7f38a 100644 --- a/codebase/treegridmultitable_connector.php +++ b/codebase/treegridmultitable_connector.php @@ -10,9 +10,10 @@ class TreeGridMultitableConnector extends TreeGridConnector{ private $level = 0; private $max_level = null; - public function __construct($res,$type=false,$item_type=false,$data_type=false){ + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ $data_type="TreeGridMultitableDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + if (!$render_type) $render_type="MultitableRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("beforeProcessing", Array($this, 'id_translate_before')); $this->event->attach("afterProcessing", Array($this, 'id_translate_after')); } @@ -49,28 +50,6 @@ class TreeGridMultitableConnector extends TreeGridConnector{ } - protected function render_set($res){ - $output=""; - $index=0; - $records = Array(); - while ($data=$this->sql->get_next($res)){ - $data[$this->config->id['name']] = $this->level.'%23'.$data[$this->config->id['name']]; - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - if (($this->max_level !== null)&&($this->level == $this->max_level)) { - $data->set_kids(false); - } else { - if ($data->has_kids()===-1) - $data->set_kids(true); - } - $output.=$data->to_xml_start(); - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - - public function xml_start(){ if (isset($_GET['id'])) { return "<rows parent='".($this->level - 1).'%23'.$_GET['id']."'>"; @@ -81,6 +60,7 @@ class TreeGridMultitableConnector extends TreeGridConnector{ public function get_level() { + if ($this->level) return $this->level; if (!isset($_GET['id'])) { if (isset($_POST['ids'])) { $ids = explode(",",$_POST["ids"]); @@ -109,7 +89,7 @@ class TreeGridMultitableConnector extends TreeGridConnector{ public function level_id($id) { - return $this->level.'#'.$id; + return $this->level.'%23'.$id; } @@ -122,6 +102,13 @@ class TreeGridMultitableConnector extends TreeGridConnector{ } + /*! gets maximum level of tree + */ + public function getMaxLevel() { + return $this->max_level; + } + + /*! remove level prefix from id, parent id and set new id before processing @param action DataAction object diff --git a/codebase/treegroup_connector.php b/codebase/treegroup_connector.php index 16db63c..80a15f1 100644 --- a/codebase/treegroup_connector.php +++ b/codebase/treegroup_connector.php @@ -9,12 +9,18 @@ class TreeGroupConnector extends TreeConnector{ private $id_postfix = '__{group_param}'; - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - parent::__construct($res,$type,$item_type,$data_type); + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ + if (!$render_type) $render_type="GroupRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("beforeProcessing", Array($this, 'check_id')); } + public function get_id_postfix() { + return $this->id_postfix; + } + + public function render(){ if (isset($_GET['id'])) { $_GET['id'] = str_replace($this->id_postfix, "", $_GET['id']); @@ -55,38 +61,9 @@ class TreeGroupConnector extends TreeConnector{ $this->end_run(); } - protected function render_set($res){ - $output=""; - $index=0; - $records = Array(); - while ($data=$this->sql->get_next($res)){ - if (isset($data[$this->config->id['name']])) { - $has_kids = false; - } else { - $data[$this->config->id['name']] = $data['value'].$this->id_postfix; - $data[$this->config->text[0]['name']] = $data['value']; - $has_kids = true; - } - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - if ($has_kids === false) { - $data->set_kids(false); - } - - if ($data->has_kids()===-1 && $this->dload) - $data->set_kids(true); - $output.=$data->to_xml_start(); - if (($data->has_kids()===-1 || ( $data->has_kids()==true && !$this->dload))&&($has_kids == true)){ - $sub_request = new DataRequestConfig($this->request); - $sub_request->set_relation(str_replace($this->id_postfix, "", $data->get_id())); - $output.=$this->render_set($this->sql->select($sub_request)); - } - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } + /*! renders self as xml, starting part + */ public function xml_start(){ if (isset($_GET['id'])) { return "<tree id='".$_GET['id'].$this->id_postfix."'>"; diff --git a/codebase/treemultitable_connector.php b/codebase/treemultitable_connector.php index 0493f4c..8e96a83 100644 --- a/codebase/treemultitable_connector.php +++ b/codebase/treemultitable_connector.php @@ -9,10 +9,10 @@ class TreeMultitableConnector extends TreeConnector{ private $level = 0; private $max_level = null; - - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - $data_type="TreeDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){ + if (!$data_type) $data_type="TreeDataProcessor"; + if (!$render_type) $render_type="MultitableRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); $this->event->attach("beforeProcessing", Array($this, 'id_translate_before')); $this->event->attach("afterProcessing", Array($this, 'id_translate_after')); } @@ -49,27 +49,6 @@ class TreeMultitableConnector extends TreeConnector{ $this->end_run(); } - protected function render_set($res){ - $output=""; - $index=0; - $records = Array(); - while ($data=$this->sql->get_next($res)){ - $data[$this->config->id['name']] = $this->level_id($data[$this->config->id['name']]); - $data = new $this->names["item_class"]($data,$this->config,$index); - $this->event->trigger("beforeRender",$data); - if (($this->max_level !== null)&&($this->level == $this->max_level)) { - $data->set_kids(false); - } else { - if ($data->has_kids()===-1) - $data->set_kids(true); - } - $output.=$data->to_xml_start(); - $output.=$data->to_xml_end(); - $index++; - } - return $output; - } - public function xml_start(){ if (isset($_GET['id'])) { return "<tree id='".($this->level - 1).'#'.$_GET['id']."'>"; @@ -80,6 +59,7 @@ class TreeMultitableConnector extends TreeConnector{ public function get_level() { + if ($this->level) return $this->level; if (!isset($_GET['id'])) { if (isset($_POST['ids'])) { $ids = explode(",",$_POST["ids"]); @@ -125,6 +105,20 @@ class TreeMultitableConnector extends TreeConnector{ } + /*! gets maximum level of tree + */ + public function getMaxLevel() { + return $this->max_level; + } + + + public function is_max_level() { + if (($this->max_level !== null) && ($this->level >= $this->max_level)) + return true; + return false; + } + + /*! remove level prefix from id, parent id and set new id before processing @param action DataAction object |