[ PHPXref.com ] [ Generated: Sun Jul 20 20:11:31 2008 ] [ SAPID CMS 1.2.3 ]
[ Index ]     [ Variables ]     [ Functions ]     [ Classes ]     [ Constants ]     [ Statistics ]

title

Body

[close]

/kernel/ -> kernel.lib.php (source)

   1  <?PHP
   2  
   3  
   4  /**

   5  * SAPID Kernel Module.

   6  * Defines basic parser class.

   7  *

   8  * $Log: kernel.lib.php,v $

   9  * Revision 1.14  2005/09/01 15:58:15  sheiko

  10  * *** empty log message ***

  11  *

  12  * Revision 1.13  2005/09/01 11:00:41  mephius

  13  * fixed bug with duplicate qc values

  14  *

  15  * Revision 1.12  2005/08/29 05:39:10  sheiko

  16  * FireFox Support for Insert Image/File

  17  *

  18  * Revision 1.11  2005/08/22 05:34:08  sheiko

  19  * load_qc_data() was changed for new interface of images/files adding. It needs to program Firefox support

  20  *

  21  * Revision 1.10  2005/08/03 09:20:27  toxin76

  22  *  embendded <sapi:for-each... > now works correct in ddc (it makes a temporary save from the vars of the outer for-each and load them back before finishing its work)

  23  *

  24  *

  25  * Revision 1.9  2005/07/18 05:53:31  mephius

  26  * fixed bug with quotes in queries with type "string"

  27  *

  28  * Revision 1.8  2005/07/04 11:10:28  sheiko

  29  * New QC-image attributes - resize and addiconsize. Sample of using resize="width*height"

  30  *

  31  * Revision 1.7  2005/06/30 09:13:08  sheiko

  32  * *** empty log message ***

  33  *

  34  * Revision 1.6  2005/06/30 08:20:14  mephius

  35  * added ability of quering data as lists (HTML SELECT in edit mode) {temporary}

  36  *

  37  * Revision 1.5  2005/06/16 06:54:36  mephius

  38  * Fixed small bug with incorrect trace mode info while in admin mode

  39  *

  40  * Revision 1.4  2005/06/14 13:21:52  mephius

  41  * Formatted header of this file

  42  *

  43  *

  44  * @package kernel

  45  * @author $Author: sheiko $ 

  46  * @version $Id: kernel.lib.php,v 1.14 2005/09/01 15:58:15 sheiko Exp $

  47  * @since SAPID v.0.9

  48  * @copyright (c) by Mephius

  49  */
  50  
  51  
  52  /**

  53  * SAPI Core class. Needs to be extended with DAL (Data Abstraction Layer).

  54  * Parses XML Sapiens objects in the given template.

  55  * @package kernel

  56  * @author $Author: sheiko $ 

  57  * @version $Id: kernel.lib.php,v 1.14 2005/09/01 15:58:15 sheiko Exp $

  58  * @since SAPID v.0.9

  59  * @copyright (c) by Mephius

  60  */
  61  
  62  if (!defined("SAPID_STARTED")) die("Hacking attempt!");
  63  
  64  class sapi_core {
  65      /**

  66      * Current value of the template

  67      * @var string (may be string or filepath)

  68      */
  69      var $template="";
  70  
  71      /**

  72      * This instance name

  73      * @var string (may be string or filepath)

  74      */
  75      var $name="";
  76  
  77      /**

  78      * Query containers parsing passed flag

  79      * @var boolean

  80      */
  81      var $qc_passed=false;
  82  
  83      /**

  84      * Processing instructions parsing passed flag

  85      * @var boolean

  86      */
  87      var $pi_passed=false;
  88  
  89      /**

  90      * Static Data Containers parsing passed flag

  91      * @var boolean

  92      */
  93      var $sdc_passed=false;
  94  
  95      /**

  96      * Dynamic Data Containers parsing passed flag

  97      * @var boolean

  98      */
  99      var $ddc_passed=false;
 100  
 101      /**

 102      * Value parsing passed flag

 103      * @var boolean

 104      */
 105      var $val_passed=false;
 106  
 107      /**

 108      * Parser Environment

 109      * @var array

 110      */
 111      var $env=array();
 112  
 113      /**

 114      * Found SAPI objects

 115      * @var array

 116      */
 117      var $sapi=array();
 118  
 119      /**

 120      * Temp. array of parsed <sapi:code> instructions

 121      * @var array

 122      */
 123      var $code=array();
 124  
 125      /**

 126      * Current element (used by XML Parser)

 127      * @var string

 128      */
 129      var $element="";
 130  
 131      /**

 132      * Counter

 133      * @var integer

 134      */
 135      var $count=0;
 136  
 137      /**

 138      * Code Array

 139      * @var array

 140      */
 141      var $codearr=array();
 142  
 143      /**

 144      * Parser Stack value

 145      * @var array

 146      */
 147      var $stack=array();
 148  
 149      /**

 150      * Current handler

 151      * @var string

 152      */
 153      var $handler="";
 154  
 155      /**

 156      * Temporary Parser Environment

 157      * @var string

 158      */
 159      var $thandler="";
 160  
 161      /**

 162      * Parser Mode

 163      * @var integer

 164      */
 165      var $mode=0;
 166  
 167      /**

 168      * Parsing error

 169      * @var string

 170      */
 171      var $error="";
 172  
 173  
 174      /**

 175      * Class constructor

 176      * @param mixed $template initial value of template to parse

 177      * @param array $env initial environmant array

 178      * @param string $handler this instance handler    

 179      * @param string $name this instance name

 180      * @return object

 181      */
 182  	function sapi_core ($template, $env=false, $handler="", $name="sapi_env"){
 183          
 184          if(!$env){
 185              $env=$this->env=&$GLOBALS["env"];
 186          }else{
 187              $this->env=$env;
 188          }
 189          $this->mode = (isset($env["mode"])?$env["mode"]:0);
 190          $this->template=$template;
 191          if($name=="sapi_env") {
 192              $this->load_template($template);
 193              $this->load_pagedata();
 194              if(is_array($this->env)) $this->env=($this->init_stack($this->env) + $this->env);
 195              $this->check_predefinition();
 196          }
 197  
 198          $this->handler=$handler;
 199          $this->name=$name;
 200  
 201          return $this;
 202      } //\\sapi_core

 203  
 204  
 205      /**

 206       * Appends to an array it's "serialized" copy

 207       * $arr["one"]["two"] will be accessable as $arr["one.two"]

 208       *

 209       * @param array $arr array to serialize

 210       * @return array

 211       */
 212  	function init_stack($arr){
 213          $arr2=array();
 214          if(empty($arr)) return $arr;
 215          $flag_end=0;
 216          while (!empty($arr)){
 217              foreach ($arr as $key=>$value) {
 218                  if (is_array($value)) {
 219                      unset($arr[$key]);
 220                      foreach ($value as $k=>$v) {
 221                          if(is_array($v)) $arr[$key . "." . $k]=$v; else $arr2[$key . "." . $k]=$v;
 222                      }
 223                  }else{
 224                      unset($arr[$key]);
 225                  }
 226              }
 227          }
 228          return $arr2;
 229      } //\\init_stack

 230  
 231  
 232      /**

 233       * XML Parser start element handler

 234       *

 235       * @param object $parser XML Parser Resourse ID

 236       * @param string $name element name

 237       * @param array $attribs element attributes

 238       */
 239  	function sapi_start($parser, $name, $attribs)
 240      {
 241          $this->element=$name;
 242          if ($name=="SAPI:WHEN" and $attribs["EXP"]){
 243  
 244              //$data=preg_replace("/([a-zA-Z_\d\.]+)\.value/is", "\$this->env[\"\\1\"]", $attribs["EXP"]);

 245  
 246  
 247              $this->code.="if (".preg_replace("/([a-zA-Z_\d\.]+)\.value/is", "\$this->env[\"\\1\"]", $attribs["EXP"]).") {\n";
 248          }elseif ($name=="SAPI:FOR-EACH"){
 249              if(!isset($attribs["NAME"])) $attribs["NAME"]="enum";
 250              $this->code.="
 251              \$filename=ROOT_PATH . \"usr/extensions/".preg_replace("/(.*)\(.*\)$/isU", "\\1", $attribs["SELECT"]).".inc.php\";
 252              if(is_file(\$filename)) include_once(\$filename);
 253              \$temp_create=true;\$temp_save_array=array();\$temp_tenv=array();
 254                      
 255              \$" . $attribs["NAME"] . "=" . $attribs["SELECT"] . ";
 256              ".(TRACE?"
 257              \$result['count'][]=count(\$" . $attribs["NAME"] . ");
 258              \$result['slice'][]=array_slice(\$" . $attribs["NAME"] . ", 0, 1);
 259              \$result['handler'][]=\$this->handler.'.'.".$attribs["NAME"].";
 260              \$result['array'][]='\$" . $attribs["NAME"] . "=" . addslashes($attribs["SELECT"]) . "';
 261              ":"")."
 262              if(is_array(\$".$attribs["NAME"]."))
 263              foreach (\$".$attribs["NAME"]." as \$key=>\$value){
 264              unset(\$arr);
 265              
 266                          
 267              if(!strpos(\"".$attribs["NAME"]."\", \$this->handler)) {
 268                  \$th=\$this->handler;
 269                  \$this->handler.=\".".$attribs["NAME"]."\";
 270                  \$this->thandler.=\".this\";
 271              }
 272               if(is_array(\$tenv)){
 273                  foreach (\$tenv as \$k=>\$entry) if (is_array(\$entry)) {
 274                      foreach (\$entry as \$k2=>\$tv)    {
 275                          if(\$temp_create){
 276                              
 277                             if (isset(\$this->env[\$k.\".\".\$k2]))  \$temp_save_array[\$k.\".\".\$k2]=\$this->env[\$k.\".\".\$k2];
 278                              \$temp_tenv[\$k][\$k2]=\$tv;
 279                          }
 280                          unset(\$this->env[\$k.\".\".\$k2]);
 281  
 282                      }
 283                      unset(\$this->env[\$this->handler]);
 284                  }
 285                  \$temp_create=false;
 286              }
 287                      
 288              \$tenv=array();
 289              \$tenv[\$this->handler]=\$value;
 290              \$tenv[\$this->thandler]=\$value;
 291              \$arr[\$th][\"".$attribs["NAME"]."\"]=\$value;
 292  
 293  
 294              \$this->env=\$this->env + \$this->init_stack(\$tenv);// + \$arr;\n";

 295  
 296          }elseif ($name=="SAPI:CODE"){
 297              $this->code.="
 298          \$iter_stack= '" . addcslashes(stripcslashes(trim($this->codearr[$this->count])), "'") . "';
 299          if(strstr(\$iter_stack, '.value')){
 300              \$tmp_sapi_obj =& new sapi_parser(stripslashes(\$iter_stack), \$this->env, \$this->handler, \"tmp_sapi_env\");
 301              \$this->stack.=\$tmp_sapi_obj->build_page();
 302          }else \$this->stack.=\$iter_stack;";
 303  
 304              $this->count++;
 305          }
 306  
 307      } //\\sapi_start

 308  
 309      /**

 310       * XML Parser end element handler

 311       *

 312       * @param object $parser XML Parser Resourse ID

 313       * @param string $name element name

 314       */
 315  	function sapi_end($parser, $name)
 316      {
 317          if ($name=="SAPI:FOR-EACH") $this->code .= "\$this->handler=preg_replace(\"/(.*)(\.[a-zA-z\d]+)$/\", \"\\\\1\", \$this->handler);
 318          \$this->thandler=preg_replace(\"/\.this$/\", \"\", \$this->thandler);
 319          \n}\n
 320          if (is_array(\$temp_save_array)){
 321              foreach (\$temp_save_array as \$key=>\$value)\$this->env[\$key]=\$value;
 322              foreach (\$temp_tenv as \$key1=>\$value1)foreach (\$value1 as \$key2=>\$value2) \$tenv[\$key1][\$key2]=\$value2;
 323          }
 324          
 325        ";
 326          if ($name=="SAPI:WHEN") {
 327              $this->code.="\n}\n";
 328          }
 329      } //\\sapi_end

 330  
 331      /**

 332       * XML Parser character data handler

 333       *

 334       * @param object $parser XML Parser Resourse ID

 335       * @param string $name element name

 336       */
 337  	function sapi_data($parser, $data)
 338      {
 339          if ($this->element=="SAPI:EXP" and trim($data)!="") {
 340              $this->code.= "if (".preg_replace("/([a-zA-Z_\d\.]+)\.value/is", "\$this->env[\"\\1\"]", $data).") {";
 341          }
 342      } //\\sapi_data

 343  
 344  
 345      /**

 346       * Initializes sapi containers from file

 347       *

 348       * @param string $filename

 349       */
 350  	function sapi_init($name, $type){
 351  
 352          $sapi=$this->load_sapi($name, $type);
 353  
 354          //        preg_match_all("/<sapi:qc (.*)>(.*)<\/sapi:qc>/isU", $sapi, $tqc, PREG_PATTERN_ORDER);

 355          preg_match_all("/<sapi:sdc (.*)>(.*)<\/sapi:sdc>/isU", $sapi, $tsdc, PREG_PATTERN_ORDER);
 356          preg_match_all("/<sapi:ddc (.*)>(.*)<\/sapi:ddc>/isU", $sapi, $tddc, PREG_PATTERN_ORDER);
 357          unset($sapi);
 358          $sapi_containers=array_merge(/*$tqc,*/ $tsdc, $tddc);
 359          //unset($tqc);

 360          unset($sdc);
 361          unset($ddc);
 362  
 363          if (is_array($sapi_containers))
 364          foreach ($sapi_containers as $k=>$value){
 365              foreach ($value as $key=>$container) {
 366                  $p = xml_parser_create();
 367                  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
 368                  xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
 369                  xml_parse_into_struct($p, $container, $values, $tags);
 370                  xml_parser_free($p);
 371                  foreach ($tags as $tag=>$index) {
 372                      //                    if ($tag=="sapi:qc") {

 373                      //                        $data=$values[$index[0]]["attributes"];

 374                      //                        $data["value"]=$sapi_containers[$k+2][$key];

 375                      //                        $this->sapi["qc"][$data["name"]]=$data;

 376                      //                    }

 377                      if ($tag=="sapi:sdc") {
 378                          $data=$values[$index[0]]["attributes"];
 379                          $data["value"]=$sapi_containers[$k+2][$key];
 380                          $this->sapi["sdc"][$data["name"]]=$data;
 381                      }
 382                      if ($tag=="sapi:ddc") {
 383                          $data=$values[$index[0]]["attributes"];
 384                          $cache_fname=ROOT_PATH . "usr/system/cache/ddc." . $data["name"] . ".cache";
 385                          if(is_file($cache_fname) and OBJ_CACHE and !TRACE and @filemtime($cache_fname)>@filemtime($filename)){
 386                              $fp=@fopen($cache_fname, "r");
 387                              if (!$fp) message_die("Filed opening <b>" . $cache_fname . "</b> for reading!");
 388                              else{
 389                                  $size=filesize($cache_fname);
 390                                  $data["exec"]=fread($fp, $size);
 391                                  $this->sapi["ddc"][$data["name"]]=$data;
 392                                  fclose($fp);
 393                              }
 394                          }else{
 395                              preg_match("/<sapi:name>(.*)<\/sapi:name>/isU", $sapi_containers[$k+2][$key], $name);
 396                              preg_match("/<sapi:email>(.*)<\/sapi:email>/isU", $sapi_containers[$k+2][$key], $email);
 397                              preg_match("/<sapi:url>(.*)<\/sapi:url>/isU", $sapi_containers[$k+2][$key], $url);
 398                              preg_match("/<sapi:comments>(.*)<\/sapi:comments>/isU", $sapi_containers[$k+2][$key], $comment);
 399                              $sapi_containers[$k+2][$key]=preg_replace("/<sapi:author>(.*)<\/sapi:author>/isU", "", $sapi_containers[$k+2][$key]);
 400                              $sapi_containers[$k+2][$key]=preg_replace("/<sapi:comments>(.*)<\/sapi:comments>/isU", "", $sapi_containers[$k+2][$key]);
 401                              $data["author"]["name"]=$name[1];
 402                              $data["author"]["email"]=$email[1];
 403                              $data["author"]["url"]=$url[1];
 404                              $data["comments"]=$comment[1];
 405  
 406  
 407                              $ddc_body=$sapi_containers[$k+2][$key];
 408                              preg_match_all("/<sapi:code.*>(.*)<\/sapi:code>/isU", $ddc_body, $tcode, PREG_PATTERN_ORDER);
 409                              $this->codearr=$tcode[1];
 410                              $ddc_body=preg_replace("/<sapi:code(.*)>/isU", "<sapi:code\\1><![CDATA[", $ddc_body);
 411                              $ddc_body=str_replace("</sapi:code>", "]]></sapi:code>", $ddc_body);
 412                              $sp=xml_parser_create();
 413                              xml_set_element_handler($sp, array(&$this, 'sapi_start'), array(&$this, 'sapi_end'));
 414                              xml_set_character_data_handler($sp, array(&$this, 'sapi_data'));
 415                              xml_parser_set_option($sp, XML_OPTION_SKIP_WHITE, 1);
 416                              $this->count=0;
 417                              $this->code="";
 418                              if(!xml_parse($sp, trim($ddc_body))) {
 419                                  if(DEBUG){
 420                                      $ddc_body=str_replace("<![CDATA[", "", $ddc_body);
 421                                      $ddc_body=str_replace("]]>", "", $ddc_body);
 422                                      $arr=explode("\n", trim($ddc_body));
 423                                      $code='<span style="color: red;"><b>Error:</b>&nbsp;' . xml_error_string(xml_get_error_code($sp)) . " at line ".xml_get_current_line_number($sp)."</span><br /><br />";
 424                                      foreach ($arr as $key=>$line) {
 425                                          if($key==xml_get_current_line_number($sp)-1) $code.='<div style="background-color: #FF9797"><div style="float: left; clear: left; width: 20px; background-color: #dfdfdf;">'.($key+1).".</div>".str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", htmlentities($line))."</div>"; else $code.='<div style="float: left; clear: left; width: 20px; background-color: #dfdfdf;">'.($key+1).".</div>".str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", htmlentities($line))."<br />";
 426                                      }
 427                                      $this->env["sapi_error_cnt"]++;
 428                                      $data["exec"]="\$error=<<<EOC\n<div style=\"border: 1px solid red; color: white; background-color: red; font-weight: bold; cursor: pointer;\" align=\"center\" onclick=\"if(document.getElementById('sapi_error_".$this->env["sapi_error_cnt"]."').style.display!='block') document.getElementById('sapi_error_".$this->env["sapi_error_cnt"]."').style.display='block'; else document.getElementById('sapi_error_".$this->env["sapi_error_cnt"]."').style.display='none';\">SAPI Error #".$this->env["sapi_error_cnt"]."</div><div id=\"sapi_error_".$this->env["sapi_error_cnt"]."\" style=\"display: none;margin-top: 2px; position: absolute; background-color: #efefef; width: 700px; border: 1px solid Gray; padding: 5px;\">" . $code."</div>\nEOC;\n \$this->stack=\$error;";
 429                                  }else $data["exec"]="";
 430                              }else{
 431                                  $data["exec"]=trim($this->code);
 432                              }
 433                              xml_parser_free($sp);
 434  
 435                              if(OBJ_CACHE and !TRACE){
 436                                  $fp=@fopen(ROOT_PATH . "usr/system/cache/ddc." . $data["name"] . ".cache", "w+");
 437                                  if (!$fp) message_die("Failed opening <b>" . ROOT_PATH . "usr/system/cache/" . $tag . "." . $data["name"] . "cache" . "</b> for writing!");
 438                                  else{
 439                                      fwrite($fp, $data["exec"]);
 440                                      fclose($fp);
 441                                  }
 442                              }
 443  
 444                              $this->sapi["ddc"][$data["name"]]=$data;
 445                          }
 446                      }
 447                  }
 448              }
 449          }
 450          unset($sapi_containers);
 451      } //\\sapi_init

 452  
 453  
 454      /**

 455       * Loads query container data

 456       *

 457       * @param string $name

 458       * @param string $query_type

 459       * @return string

 460       */
 461  		function load_qc_data($name