summaryrefslogtreecommitdiffstats
path: root/codebase/data_connector.php
diff options
context:
space:
mode:
authorStanislav <stanislau.wolski@gmail.com>2012-05-22 01:25:12 +0300
committerStanislav <stanislau.wolski@gmail.com>2012-05-22 01:25:12 +0300
commitb33829f06ced3f35a4463f84f769b753faf70ab4 (patch)
tree638c9af7d2dc0c8f3f1c69046cf1c736a417e887 /codebase/data_connector.php
parent05ad07fee439616159c687a806270fd587af9abc (diff)
downloadconnector-php-b33829f06ced3f35a4463f84f769b753faf70ab4.zip
connector-php-b33829f06ced3f35a4463f84f769b753faf70ab4.tar.gz
connector-php-b33829f06ced3f35a4463f84f769b753faf70ab4.tar.bz2
[add] ability to define extra data attributes
Diffstat (limited to 'codebase/data_connector.php')
-rw-r--r--codebase/data_connector.php888
1 files changed, 453 insertions, 435 deletions
diff --git a/codebase/data_connector.php b/codebase/data_connector.php
index 4e6ad76..de6d2f0 100644
--- a/codebase/data_connector.php
+++ b/codebase/data_connector.php
@@ -1,435 +1,453 @@
-<?php
-/*
- @author dhtmlx.com
- @license GPL, see license.txt
-*/
-require_once("base_connector.php");
-
-class CommonDataProcessor extends DataProcessor{
- protected function get_post_values($ids){
- if (isset($_GET['action'])){
- $data = array();
- if (isset($_POST["id"])){
- $dataset = array();
- foreach($_POST as $key=>$value)
- $dataset[$key] = ConnectorSecurity::filter($value);
-
- $data[$_POST["id"]] = $dataset;
- }
- else
- $data["dummy_id"] = $_POST;
- return $data;
- }
- return parent::get_post_values($ids);
- }
-
- protected function get_ids(){
- if (isset($_GET['action'])){
- if (isset($_POST["id"]))
- return array($_POST['id']);
- else
- return array("dummy_id");
- }
- return parent::get_ids();
- }
-
- protected function get_operation($rid){
- if (isset($_GET['action']))
- return $_GET['action'];
- return parent::get_operation($rid);
- }
-
- public function output_as_xml($results){
- if (isset($_GET['action'])){
- LogMaster::log("Edit operation finished",$results);
- ob_clean();
- $type = $results[0]->get_status();
- if ($type == "error" || $type == "invalid"){
- echo "false";
- } else if ($type=="insert"){
- echo "true\n".$results[0]->get_new_id();
- } else
- echo "true";
- } else
- return parent::output_as_xml($results);
- }
-};
-
-/*! DataItem class for DataView component
-**/
-class CommonDataItem extends DataItem{
- /*! return self as XML string
- */
- function to_xml(){
- if ($this->skip) return "";
- return $this->to_xml_start().$this->to_xml_end();
- }
-
- function to_xml_start(){
- $str="<item id='".$this->get_id()."' ";
- for ($i=0; $i < sizeof($this->config->text); $i++){
- $name=$this->config->text[$i]["name"];
- $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'";
- }
- return $str.">";
- }
-}
-
-
-/*! Connector class for DataView
-**/
-class DataConnector extends Connector{
-
- /*! constructor
-
- 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.
- */
- 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";
-
- $this->sections = array();
- $this->attributes = array();
-
- if (!$render_type) $render_type="RenderStrategy";
- parent::__construct($res,$type,$item_type,$data_type,$render_type);
-
- }
-
- protected $sections;
- public function add_section($name, $string){
- $this->sections[$name] = $string;
- }
-
- protected $attributes;
- public function add_top_attribute($name, $string){
- $this->attributes[$name] = $string;
- }
-
- protected function parse_request_mode(){
- //do nothing, at least for now
- }
-
- //parse GET scoope, all operations with incoming request must be done here
- protected function parse_request(){
- if (isset($_GET['action'])){
- $action = $_GET['action'];
- //simple request mode
- if ($action == "get"){
- //data request
- if (isset($_GET['id'])){
- //single entity data request
- $this->request->set_filter($this->config->id["name"],$_GET['id'],"=");
- } else {
- //loading collection of items
- }
- } else {
- //data saving
- $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;
-
- parent::parse_request();
- }
-
- if (isset($_GET["start"]) && isset($_GET["count"]))
- $this->request->set_limit($_GET["start"],$_GET["count"]);
-
- $key = ConnectorSecurity::checkCSRF($this->editing);
- if ($key !== "")
- $this->add_top_attribute("dhx_security", $key);
- }
-
- /*! renders self as xml, starting part
- */
- protected function xml_start(){
- $start = "<data";
- foreach($this->attributes as $k=>$v)
- $start .= " ".$k."='".$v."'";
- $start.= ">";
-
- foreach($this->sections as $k=>$v)
- $start .= "<".$k.">".$v."</".$k.">\n";
- return $start;
- }
-};
-
-class JSONDataConnector extends DataConnector{
-
- public function __construct($res,$type=false,$item_type=false,$data_type=false){
- if (!$item_type) $item_type="JSONCommonDataItem";
- if (!$data_type) $data_type="CommonDataProcessor";
- $this->data_separator = ",\n";
- 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]";
-
- $is_sections = sizeof($this->sections) && $this->is_first_call();
- if ($this->dload || $is_sections){
- $start = "{ \"data\":".$start.$end;
- $end="";
-
- if ($is_sections){
- //extra sections
- foreach($this->sections as $k=>$v)
- $end.= ", ".$k.":".$v;
- }
-
- if ($this->dload){
- //info for dyn. loadin
- if ($pos=$this->request->get_start())
- $end .= ", \"pos\":".$pos." }";
- else
- $end .= ", \"pos\":0, \"total_count\":".$this->sql->get_size($this->request)." }";
- } else
- $end .= " }";
- }
- $out = new OutputWriter($start, $end);
- $out->set_type("json");
- $this->event->trigger("beforeOutput", $this, $out);
- $out->output("", true, $this->encoding);
- }
-}
-
-class JSONCommonDataItem extends DataItem{
- /*! return self as XML string
- */
- function to_xml(){
- if ($this->skip) return "";
-
- $data = array();
- for ($i=0; $i<sizeof($this->config->text); $i++){
- $extra = $this->config->text[$i]["name"];
- $data[$extra]=$this->data[$extra];
- }
- return json_encode($data);
- }
-}
-
-
-/*! 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;
-
- function to_xml_start(){
- $str="<item id='".$this->get_id()."' ";
- for ($i=0; $i < sizeof($this->config->text); $i++){
- $name=$this->config->text[$i]["name"];
- $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'";
- }
-
- if ($this->kids === true)
- $str .=" dhx_kids='1'";
-
- return $str.">";
- }
-
- function has_kids(){
- return $this->kids;
- }
-
- function set_kids($value){
- $this->kids=$value;
- }
-}
-
-
-class TreeDataConnector extends DataConnector{
- protected $parent_name = 'parent';
-
- /*! constructor
-
- 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[$this->parent_name]))
- $this->request->set_relation($_GET[$this->parent_name]);
- else
- $this->request->set_relation("0");
-
- $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,$render_type){
- if (!$item_type) $item_type="JSONTreeCommonDataItem";
- if (!$data_type) $data_type="CommonDataProcessor";
- if (!$render_type) $render_type="JSONTreeRenderStrategy";
- parent::__construct($res,$type,$item_type,$data_type,$render_type);
- }
-
- 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);
- $out->output("", true, $this->encoding);
- }
-
-}
-
-
-class JSONTreeCommonDataItem extends TreeCommonDataItem{
- /*! return self as XML string
- */
- function to_xml_start(){
- if ($this->skip) return "";
-
- $data = array( "id" => $this->get_id() );
- for ($i=0; $i<sizeof($this->config->text); $i++){
- $extra = $this->config->text[$i]["name"];
- $data[$extra]=$this->data[$extra];
- }
-
- if ($this->kids === true)
- $data["dhx_kids"] = 1;
-
- return $data;
- }
-
- function to_xml_end(){
- return "";
- }
-}
-
-
-?>
-
+<?php
+/*
+ @author dhtmlx.com
+ @license GPL, see license.txt
+*/
+require_once("base_connector.php");
+
+class CommonDataProcessor extends DataProcessor{
+ protected function get_post_values($ids){
+ if (isset($_GET['action'])){
+ $data = array();
+ if (isset($_POST["id"])){
+ $dataset = array();
+ foreach($_POST as $key=>$value)
+ $dataset[$key] = ConnectorSecurity::filter($value);
+
+ $data[$_POST["id"]] = $dataset;
+ }
+ else
+ $data["dummy_id"] = $_POST;
+ return $data;
+ }
+ return parent::get_post_values($ids);
+ }
+
+ protected function get_ids(){
+ if (isset($_GET['action'])){
+ if (isset($_POST["id"]))
+ return array($_POST['id']);
+ else
+ return array("dummy_id");
+ }
+ return parent::get_ids();
+ }
+
+ protected function get_operation($rid){
+ if (isset($_GET['action']))
+ return $_GET['action'];
+ return parent::get_operation($rid);
+ }
+
+ public function output_as_xml($results){
+ if (isset($_GET['action'])){
+ LogMaster::log("Edit operation finished",$results);
+ ob_clean();
+ $type = $results[0]->get_status();
+ if ($type == "error" || $type == "invalid"){
+ echo "false";
+ } else if ($type=="insert"){
+ echo "true\n".$results[0]->get_new_id();
+ } else
+ echo "true";
+ } else
+ return parent::output_as_xml($results);
+ }
+};
+
+/*! DataItem class for DataView component
+**/
+class CommonDataItem extends DataItem{
+ /*! return self as XML string
+ */
+ function to_xml(){
+ if ($this->skip) return "";
+ return $this->to_xml_start().$this->to_xml_end();
+ }
+
+ function to_xml_start(){
+ $str="<item id='".$this->get_id()."' ";
+ for ($i=0; $i < sizeof($this->config->text); $i++){
+ $name=$this->config->text[$i]["name"];
+ $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'";
+ }
+
+ if ($this->userdata !== false)
+ foreach ($this->userdata as $key => $value)
+ $str.=" ".$key."='".$this->xmlentities($value)."'";
+
+ return $str.">";
+ }
+}
+
+
+/*! Connector class for DataView
+**/
+class DataConnector extends Connector{
+
+ /*! constructor
+
+ 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.
+ */
+ 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";
+
+ $this->sections = array();
+ $this->attributes = array();
+
+ if (!$render_type) $render_type="RenderStrategy";
+ parent::__construct($res,$type,$item_type,$data_type,$render_type);
+
+ }
+
+ protected $sections;
+ public function add_section($name, $string){
+ $this->sections[$name] = $string;
+ }
+
+ protected $attributes;
+ public function add_top_attribute($name, $string){
+ $this->attributes[$name] = $string;
+ }
+
+ protected function parse_request_mode(){
+ //do nothing, at least for now
+ }
+
+ //parse GET scoope, all operations with incoming request must be done here
+ protected function parse_request(){
+ if (isset($_GET['action'])){
+ $action = $_GET['action'];
+ //simple request mode
+ if ($action == "get"){
+ //data request
+ if (isset($_GET['id'])){
+ //single entity data request
+ $this->request->set_filter($this->config->id["name"],$_GET['id'],"=");
+ } else {
+ //loading collection of items
+ }
+ } else {
+ //data saving
+ $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;
+
+ parent::parse_request();
+ }
+
+ if (isset($_GET["start"]) && isset($_GET["count"]))
+ $this->request->set_limit($_GET["start"],$_GET["count"]);
+
+ $key = ConnectorSecurity::checkCSRF($this->editing);
+ if ($key !== "")
+ $this->add_top_attribute("dhx_security", $key);
+ }
+
+ /*! renders self as xml, starting part
+ */
+ protected function xml_start(){
+ $start = "<data";
+ foreach($this->attributes as $k=>$v)
+ $start .= " ".$k."='".$v."'";
+ $start.= ">";
+
+ foreach($this->sections as $k=>$v)
+ $start .= "<".$k.">".$v."</".$k.">\n";
+ return $start;
+ }
+};
+
+class JSONDataConnector extends DataConnector{
+
+ public function __construct($res,$type=false,$item_type=false,$data_type=false){
+ if (!$item_type) $item_type="JSONCommonDataItem";
+ if (!$data_type) $data_type="CommonDataProcessor";
+ $this->data_separator = ",\n";
+ 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]";
+
+ $is_sections = sizeof($this->sections) && $this->is_first_call();
+ if ($this->dload || $is_sections){
+ $start = "{ \"data\":".$start.$end;
+ $end="";
+
+ if ($is_sections){
+ //extra sections
+ foreach($this->sections as $k=>$v)
+ $end.= ", ".$k.":".$v;
+ }
+
+ if ($this->dload){
+ //info for dyn. loadin
+ if ($pos=$this->request->get_start())
+ $end .= ", \"pos\":".$pos." }";
+ else
+ $end .= ", \"pos\":0, \"total_count\":".$this->sql->get_size($this->request)." }";
+ } else
+ $end .= " }";
+ }
+ $out = new OutputWriter($start, $end);
+ $out->set_type("json");
+ $this->event->trigger("beforeOutput", $this, $out);
+ $out->output("", true, $this->encoding);
+ }
+}
+
+class JSONCommonDataItem extends DataItem{
+ /*! return self as XML string
+ */
+ function to_xml(){
+ if ($this->skip) return "";
+
+ $data = array();
+ for ($i=0; $i<sizeof($this->config->text); $i++){
+ $extra = $this->config->text[$i]["name"];
+ $data[$extra]=$this->data[$extra];
+ }
+
+ if ($this->userdata !== false)
+ foreach ($this->userdata as $key => $value)
+ $data["key"]=$value;
+
+ return json_encode($data);
+ }
+}
+
+
+/*! 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;
+
+ function to_xml_start(){
+ $str="<item id='".$this->get_id()."' ";
+ for ($i=0; $i < sizeof($this->config->text); $i++){
+ $name=$this->config->text[$i]["name"];
+ $str.=" ".$name."='".$this->xmlentities($this->data[$name])."'";
+ }
+
+ if ($this->userdata !== false)
+ foreach ($this->userdata as $key => $value)
+ $str.=" ".$key."='".$this->xmlentities($value)."'";
+
+ if ($this->kids === true)
+ $str .=" dhx_kids='1'";
+
+ return $str.">";
+ }
+
+ function has_kids(){
+ return $this->kids;
+ }
+
+ function set_kids($value){
+ $this->kids=$value;
+ }
+}
+
+
+class TreeDataConnector extends DataConnector{
+ protected $parent_name = 'parent';
+
+ /*! constructor
+
+ 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[$this->parent_name]))
+ $this->request->set_relation($_GET[$this->parent_name]);
+ else
+ $this->request->set_relation("0");
+
+ $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,$render_type){
+ if (!$item_type) $item_type="JSONTreeCommonDataItem";
+ if (!$data_type) $data_type="CommonDataProcessor";
+ if (!$render_type) $render_type="JSONTreeRenderStrategy";
+ parent::__construct($res,$type,$item_type,$data_type,$render_type);
+ }
+
+ 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);
+ $out->output("", true, $this->encoding);
+ }
+
+}
+
+
+class JSONTreeCommonDataItem extends TreeCommonDataItem{
+ /*! return self as XML string
+ */
+ function to_xml_start(){
+ if ($this->skip) return "";
+
+ $data = array( "id" => $this->get_id() );
+ for ($i=0; $i<sizeof($this->config->text); $i++){
+ $extra = $this->config->text[$i]["name"];
+ $data[$extra]=$this->data[$extra];
+ }
+
+ if ($this->userdata !== false)
+ foreach ($this->userdata as $key => $value)
+ $data["key"]=$value;
+
+ if ($this->kids === true)
+ $data["dhx_kids"] = 1;
+
+ return $data;
+ }
+
+ function to_xml_end(){
+ return "";
+ }
+}
+
+
+?>
+