3 class DelayedConnector extends Connector{
\r
4 protected $init_flag=false;//!< used to prevent rendering while initialization
\r
5 private $data_mode=false;//!< flag to separate xml and data request modes
\r
6 private $data_result=false;//<! store results of query
\r
8 public function dataMode($name){
\r
9 $this->data_mode = $name;
\r
10 $this->data_result=array();
\r
12 public function getDataResult(){
\r
13 return $this->data_result;
\r
16 public function render(){
\r
17 if (!$this->init_flag){
\r
18 $this->init_flag=true;
\r
21 return parent::render();
\r
24 protected function output_as_xml($res){
\r
25 if ($this->data_mode){
\r
26 while ($data=$this->sql->get_next($res)){
\r
27 $this->data_result[]=$data[$this->data_mode];
\r
31 return parent::output_as_xml($res);
\r
33 protected function end_run(){
\r
34 if (!$this->data_mode)
\r
39 class CrossOptionsConnector extends Connector{
\r
40 public $options, $link;
\r
41 private $master_name, $link_name, $master_value;
\r
43 public function __construct($res,$type=false,$item_type=false,$data_type=false){
\r
44 $this->options = new OptionsConnector($res,$type,$item_type,$data_type);
\r
45 $this->link = new DelayedConnector($res,$type,$item_type,$data_type);
\r
47 EventMaster::attach_static("connectorInit",array($this, "handle"));
\r
49 public function handle($conn){
\r
50 if ($conn instanceof DelayedConnector) return;
\r
51 if ($conn instanceof OptionsConnector) return;
\r
53 $this->master_name = $this->link->get_config()->id["db_name"];
\r
54 $this->link_name = $this->options->get_config()->id["db_name"];
\r
56 $this->link->event->attach("beforeFilter",array($this, "get_only_related"));
\r
58 if (isset($_GET["dhx_crosslink_".$this->link_name])){
\r
59 $this->get_links($_GET["dhx_crosslink_".$this->link_name]);
\r
64 $conn->event->attach("beforeRender", array($this, "getOptions"));
\r
65 $conn->event->attach("beforeRenderSet", array($this, "prepareConfig"));
\r
69 $conn->event->attach("afterProcessing", array($this, "afterProcessing"));
\r
71 public function prepareConfig($conn, $res, $config){
\r
72 $config->add_field($this->link_name);
\r
74 public function getOptions($data){
\r
75 $this->link->dataMode($this->link_name);
\r
77 $this->get_links($data->get_value($this->master_name));
\r
79 $data->set_value($this->link_name, implode(",",$this->link->getDataResult()));
\r
81 public function get_links($id){
\r
82 $this->master_value = $id;
\r
83 $this->link->render();
\r
85 public function get_only_related($filters){
\r
86 $index = $filters->index($this->master_name);
\r
87 if ($index!==false){
\r
88 $filters->rules[$index]["value"]=$this->master_value;
\r
90 $filters->add($this->master_name, $this->master_value, "=");
\r
92 public function afterProcessing($action){
\r
93 $status = $action->get_status();
\r
95 $master_key = $action->get_value($this->master_name);
\r
96 $link_key = $action->get_value($this->link_name);
\r
97 $link_key = explode(',', $link_key);
\r
99 if ($status == "inserted")
\r
100 $master_key = $action->get_new_id();
\r
104 $this->link->delete($master_key);
\r
107 $this->link->delete($master_key);
\r
109 for ($i=0; $i < sizeof($link_key); $i++)
\r
110 if ($link_key[$i]!="")
\r
111 $this->link->insert(array(
\r
112 $this->link_name => $link_key[$i],
\r
113 $this->master_name => $master_key
\r