diff options
Diffstat (limited to 'codebase/data_connector.php')
-rw-r--r-- | codebase/data_connector.php | 215 |
1 files changed, 129 insertions, 86 deletions
diff --git a/codebase/data_connector.php b/codebase/data_connector.php index d66e64b..130d217 100644 --- a/codebase/data_connector.php +++ b/codebase/data_connector.php @@ -87,11 +87,12 @@ 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"; $section = array(); - 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 $sections; @@ -121,6 +122,9 @@ class DataConnector extends Connector{ $this->editing = true; } } else { + if (isset($_GET["dhx_colls"])) + $this->fill_collections($_GET["dhx_colls"]); + if (isset($_GET['editing']) && isset($_POST['ids'])) $this->editing = true; @@ -150,6 +154,55 @@ class JSONDataConnector extends DataConnector{ parent::__construct($res,$type,$item_type,$data_type); } + /*! assign options collection to the column + + @param name + name of the column + @param options + array or connector object + */ + public function set_options($name,$options){ + if (is_array($options)){ + $str=array(); + foreach($options as $k => $v) + $str[]='{"id":"'.$this->xmlentities($k).'", "value":"'.$this->xmlentities($v).'"}'; + $options=implode(",",$str); + } + $this->options[$name]=$options; + } + + + protected function fill_collections($list){ + $names=explode(",",$list); + $options=array(); + for ($i=0; $i < sizeof($names); $i++) { + $name = $this->resolve_parameter($names[$i]); + if (!array_key_exists($name,$this->options)){ + $this->options[$name] = new JSONDistinctOptionsConnector($this->get_connection(),$this->names["db_class"]); + $c = new DataConfig($this->config); + $r = new DataRequestConfig($this->request); + $c->minimize($name); + + $this->options[$name]->render_connector($c,$r); + } + + $option="\"{$name}\":["; + if (!is_string($this->options[$name])) + $option.=substr($this->options[$name]->render(),0,-2); + else + $option.=$this->options[$name]; + $option.="]"; + $options[] = $option; + } + $this->extra_output .= implode(",", $options); + } + + protected function resolve_parameter($name){ + if (intval($name).""==$name) + return $this->config->text[intval($name)]["db_name"]; + return $name; + } + protected function output_as_xml($res){ $start = "[\n"; $end = substr($this->render_set($res),0,-2)."\n]"; @@ -196,6 +249,50 @@ class JSONCommonDataItem extends DataItem{ } } + +/*! wrapper around options collection, used for comboboxes and filters +**/ +class JSONOptionsConnector extends JSONDataConnector{ + protected $init_flag=false;//!< used to prevent rendering while initialization + public function __construct($res,$type=false,$item_type=false,$data_type=false){ + if (!$item_type) $item_type="JSONCommonDataItem"; + if (!$data_type) $data_type=""; //has not sense, options not editable + parent::__construct($res,$type,$item_type,$data_type); + } + /*! render self + process commands, return data as XML, not output data to stdout, ignore parameters in incoming request + @return + data as XML string + */ + public function render(){ + if (!$this->init_flag){ + $this->init_flag=true; + return ""; + } + $res = $this->sql->select($this->request); + return $this->render_set($res); + } +} + + +class JSONDistinctOptionsConnector extends JSONOptionsConnector{ + /*! render self + process commands, return data as XML, not output data to stdout, ignore parameters in incoming request + @return + data as XML string + */ + public function render(){ + if (!$this->init_flag){ + $this->init_flag=true; + return ""; + } + $res = $this->sql->get_variants($this->config->text[0]["db_name"],$this->request); + return $this->render_set($res); + } +} + + + class TreeCommonDataItem extends CommonDataItem{ protected $kids=-1; @@ -223,116 +320,62 @@ class TreeCommonDataItem extends CommonDataItem{ class TreeDataConnector extends DataConnector{ - protected $id_swap = array(); - public function __construct($res,$type=false,$item_type=false,$data_type=false){ - if (!$item_type) $item_type="TreeCommonDataItem"; - if (!$data_type) $data_type="CommonDataProcessor"; - parent::__construct($res,$type,$item_type,$data_type); + protected $parent_name = 'parent'; - $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); - $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); - } - - protected function xml_start(){ - return "<data parent='".$this->request->get_relation()."'>"; - } - - /*! store info about ID changes during insert operation - @param dataAction - data action object during insert operation - */ - public function parent_id_correction_a($dataAction){ - $this->id_swap[$dataAction->get_id()]=$dataAction->get_new_id(); - } - /*! update ID if it was affected by previous operation - @param dataAction - data action object, before any processing operation - */ - public function parent_id_correction_b($dataAction){ - $relation = $this->config->relation_id["db_name"]; - $value = $dataAction->get_value($relation); + /*! constructor - if (array_key_exists($value,$this->id_swap)) - $dataAction->set_value($relation,$this->id_swap[$value]); + Here initilization of all Masters occurs, execution timer initialized + @param res + db connection resource + @param type + string , which hold type of database ( MySQL or Postgre ), optional, instead of short DB name, full name of DataWrapper-based class can be provided + @param item_type + 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 provides data rendering + */ + 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"; + if (!$render_type) $render_type="TreeRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } //parse GET scoope, all operations with incoming request must be done here protected function parse_request(){ parent::parse_request(); - if (isset($_GET["parent"])) - $this->request->set_relation($_GET["parent"]); + if (isset($_GET[$this->parent_name])) + $this->request->set_relation($_GET[$this->parent_name]); else $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; + $this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode } + /*! renders self as xml, starting part + */ + protected function xml_start(){ + return "<data parent='".$this->request->get_relation()."'>"; + } } 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); - - $this->event->attach("afterInsert",array($this,"parent_id_correction_a")); - $this->event->attach("beforeProcessing",array($this,"parent_id_correction_b")); + if (!$render_type) $render_type="JSONTreeRenderStrategy"; + parent::__construct($res,$type,$item_type,$data_type,$render_type); } - 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); |