$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="- 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();
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 function parse_request_mode(){
if (isset($_GET['action']) && $_GET["action"] != "get")
$this->editing = true;
else
parent::parse_request_mode();
}
//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;
}
parent::check_csrf();
} else {
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"]);
}
/*! renders self as xml, starting part
*/
protected function xml_start(){
$start = "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,$render_type=false){
if (!$item_type) $item_type="JSONCommonDataItem";
if (!$data_type) $data_type="CommonDataProcessor";
if (!$render_type) $render_type="JSONRenderStrategy";
$this->data_separator = ",\n";
parent::__construct($res,$type,$item_type,$data_type,$render_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;
}
/*! generates xml description for options collections
@param list
comma separated list of column names, for which options need to be generated
*/
protected function fill_collections($list=""){
$options = array();
foreach ($this->options as $k=>$v) {
$name = $k;
$option="\"{$name}\":[";
if (!is_string($this->options[$name]))
$option.=substr(json_encode($this->options[$name]->render()),1,-1);
else
$option.=$this->options[$name];
$option.="]";
$options[] = $option;
}
$this->extra_output .= implode($this->data_separator, $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){
$json = $this->render_set($res);
if ($this->simple) return $json;
$result = json_encode($json);
$this->fill_collections();
$is_sections = sizeof($this->sections) && $this->is_first_call();
if ($this->dload || $is_sections || sizeof($this->attributes) || !empty($this->extra_data)){
$attributes = "";
foreach($this->attributes as $k=>$v)
$attributes .= ", \"".$k."\":\"".$v."\"";
$extra = "";
if (!empty($this->extra_output))
$extra .= ', "collections": {'.$this->extra_output.'}';
$sections = "";
if ($is_sections){
//extra sections
foreach($this->sections as $k=>$v)
$sections .= ", \"".$k."\":".$v;
}
$dyn = "";
if ($this->dload){
//info for dyn. loadin
if ($pos=$this->request->get_start())
$dyn .= ", \"pos\":".$pos;
else
$dyn .= ", \"pos\":0, \"total_count\":".$this->sql->get_size($this->request);
}
if ($attributes || $sections || $this->extra_output || $dyn) {
$result = "{ \"data\":".$result.$attributes.$extra.$sections.$dyn."}";
}
}
// return as string
if ($this->as_string) return $result;
// output direct to response
$out = new OutputWriter($result, "");
$out->set_type("json");
$this->event->trigger("beforeOutput", $this, $out);
$out->output("", true, $this->encoding);
return null;
}
}
class JSONCommonDataItem extends DataItem{
/*! return self as XML string
*/
function to_xml(){
if ($this->skip) return false;
$data = array(
'id' => $this->get_id()
);
for ($i=0; $iconfig->text); $i++){
$extra = $this->config->text[$i]["name"];
$data[$extra]=$this->data[$extra];
if (is_null($data[$extra]))
$data[$extra] = "";
}
if ($this->userdata !== false)
foreach ($this->userdata as $key => $value){
if ($value === null)
$data[$key]="";
$data[$key]=$value;
}
return $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="
- 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 .=" ".Connector::$kids_var."='1'";
return $str.">";
}
function has_kids(){
return $this->kids;
}
function set_kids($value){
$this->kids=$value;
}
}
class TreeDataConnector extends DataConnector{
protected $parent_name = 'parent';
public $rootId = "0";
/*! 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($this->rootId);
$this->request->set_limit(0,0); //netralize default reaction on dyn. loading mode
}
/*! renders self as xml, starting part
*/
protected function xml_start(){
$attributes = " ";
if (!$this->rootId || $this->rootId != $this->request->get_relation())
$attributes = " parent='".$this->request->get_relation()."' ";
foreach($this->attributes as $k=>$v)
$attributes .= " ".$k."='".$v."'";
return "";
}
}
class JSONTreeDataConnector extends TreeDataConnector{
public function __construct($res,$type=false,$item_type=false,$data_type=false,$render_type=false){
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){
$result = $this->render_set($res);
if ($this->simple) return $result;
$data = array();
if (!$this->rootId || $this->rootId != $this->request->get_relation())
$data["parent"] = $this->request->get_relation();
$data["data"] = $result;
$this->fill_collections();
if (!empty($this->options))
$data["collections"] = $this->options;
foreach($this->attributes as $k=>$v)
$data[$k] = $v;
$data = json_encode($data);
// return as string
if ($this->as_string) return $data;
// output direct to response
$out = new OutputWriter($data, "");
$out->set_type("json");
$this->event->trigger("beforeOutput", $this, $out);
$out->output("", true, $this->encoding);
}
/*! 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[]=Array("id"=>$this->xmlentities($k), "value"=>$this->xmlentities($v));//'{"id":"'.$this->xmlentities($k).'", "value":"'.$this->xmlentities($v).'"}';
$options=$str;
}
$this->options[$name]=$options;
}
/*! generates xml description for options collections
@param list
comma separated list of column names, for which options need to be generated
*/
protected function fill_collections($list=""){
$options = array();
foreach ($this->options as $k=>$v) {
$name = $k;
if (!is_array($this->options[$name]))
$option=$this->options[$name]->render();
else
$option=$this->options[$name];
$options[$name] = $option;
}
$this->options = $options;
$this->extra_output .= "'collections':".json_encode($options);
}
}
class JSONTreeCommonDataItem extends TreeCommonDataItem{
/*! return self as XML string
*/
function to_xml_start(){
if ($this->skip) return false;
$data = array( "id" => $this->get_id() );
for ($i=0; $iconfig->text); $i++){
$extra = $this->config->text[$i]["name"];
if (isset($this->data[$extra]))
$data[$extra]=$this->data[$extra];
}
if ($this->userdata !== false)
foreach ($this->userdata as $key => $value)
$data[$key]=$value;
if ($this->kids === true)
$data[Connector::$kids_var] = 1;
return $data;
}
function to_xml_end(){
return "";
}
}
?>