summaryrefslogtreecommitdiffstats
path: root/codebase/data_connector.php
diff options
context:
space:
mode:
Diffstat (limited to 'codebase/data_connector.php')
-rw-r--r--codebase/data_connector.php215
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);