elFinder::callback PHP Method

callback() protected method

Output callback result with JavaScript that control elFinder or HTTP redirect to callbackWindowURL
Author: Naoki Sawada
protected callback ( $args )
    protected function callback($args)
    {
        $checkReg = '/[^a-zA-Z0-9;._-]/';
        $node = isset($args['node']) && !preg_match($checkReg, $args['node']) ? $args['node'] : '';
        $json = isset($args['json']) && json_decode($args['json']) ? $args['json'] : '{}';
        $bind = isset($args['bind']) && !preg_match($checkReg, $args['bind']) ? $args['bind'] : '';
        $done = !empty($args['done']);
        while (ob_get_level()) {
            if (!ob_end_clean()) {
                break;
            }
        }
        if ($done || !$this->callbackWindowURL) {
            $script = '';
            if ($node) {
                if ($bind) {
                    $trigger = 'elf.trigger(\'' . $bind . '\', data);';
                    $triggerdone = 'elf.trigger(\'' . $bind . 'done\');';
                    $triggerfail = 'elf.trigger(\'' . $bind . 'fail\', data);';
                } else {
                    $trigger = $triggerdone = $triggerfail = '';
                }
                $script .= '
					var w = window.opener || window.parent || window;
					try {
						var elf = w.document.getElementById(\'' . $node . '\').elfinder;
						if (elf) {
							var data = ' . $json . ';
							if (data.error) {
								' . $triggerfail . '
								elf.error(data.error);
							} else {
								data.warning && elf.error(data.warning);
								data.removed && data.removed.length && elf.remove(data);
								data.added   && data.added.length   && elf.add(data);
								data.changed && data.changed.length && elf.change(data);
								' . $trigger . '
								' . $triggerdone . '
								data.sync && elf.sync();
							}
						}
					} catch(e) {
						// for CORS
						w.postMessage && w.postMessage(JSON.stringify({bind:\'' . $bind . '\',data:' . $json . '}), \'*\');
					}';
            }
            $script .= 'window.close();';
            $out = '<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><script>' . $script . '</script></head><body><a href="#" onlick="window.close();return false;">Close this window</a></body></html>';
            header('Content-Type: text/html; charset=utf-8');
            header('Content-Length: ' . strlen($out));
            header('Cache-Control: private');
            header('Pragma: no-cache');
            echo $out;
        } else {
            $url = $this->callbackWindowURL;
            $url .= (strpos($url, '?') === false ? '?' : '&') . '&node=' . rawurlencode($node) . ($json !== '{}' ? '&json=' . rawurlencode($json) : '') . ($bind ? '&bind=' . rawurlencode($bind) : '') . '&done=1';
            header('Location: ' . $url);
        }
        exit;
    }