summaryrefslogtreecommitdiffstats
path: root/codebase/treegroup_connector.php
blob: 16db63cfc95d339120cf9d82b99b7e3a4d3ba4e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
/*
	@author dhtmlx.com
	@license GPL, see license.txt
*/
require_once("tree_connector.php");

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);
		$this->event->attach("beforeProcessing", Array($this, 'check_id'));
	}


	public function render(){
		if (isset($_GET['id'])) {
			$_GET['id'] = str_replace($this->id_postfix, "", $_GET['id']);
		}
		$this->parse_request();
		if (!isset($_GET['id'])) {
			$this->request->set_relation(false);
		}
		
		if (isset($_GET["editing"]))
			$this->editing=true;
		else if (isset($_POST["ids"])){
			$this->editing=true;
		} else {
			$this->editing = false;
		}
		
		if ($this->editing){
			$dp = new $this->names["data_class"]($this,$this->config,$this->request);
			$dp->process($this->config,$this->request);
		}
		else {
			$wrap = new SortInterface($this->request);
			$this->event->trigger("beforeSort",$wrap);
			$wrap->store();
			
			$wrap = new FilterInterface($this->request);
			$this->event->trigger("beforeFilter",$wrap);
			$wrap->store();
			
			if (isset($_GET['id'])) {
				$this->output_as_xml( $this->sql->select($this->request) );
			} else {
				$relation_id = $this->config->relation_id['name'];
				$this->output_as_xml( $this->sql->get_variants($this->config->relation_id['name'], $this->request));
			}
		}
		$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;
	}

	public function xml_start(){
		if (isset($_GET['id'])) {
			return "<tree id='".$_GET['id'].$this->id_postfix."'>";
		} else {
			return "<tree id='0'>";
		}
	}


	public function check_id($action) {
		if (isset($_GET['editing'])) {
			$id = $action->get_id();
			$pid = $action->get_value($this->config->relation_id['name']);
			$pid = str_replace($this->id_postfix, "", $pid);
			$action->set_value($this->config->relation_id['name'], $pid);
			if (strpos($id, $this->id_postfix) == false) {
				return $action;
			} else {
				$action->error();
				$action->set_response_text("This record can't be updated!");
				return $action;
			}
		} else {
			return $action;
		}
	}
}

?>