diff --git a/include/basis_db.class.php b/include/basis_db.class.php index 5b2c68fe4..36d1eddc7 100644 --- a/include/basis_db.class.php +++ b/include/basis_db.class.php @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * Authors: Christian Paminger , - * Andreas Oesterreicher + * Andreas Oesterreicher * */ /** @@ -38,6 +38,7 @@ abstract class db extends basis define('FHC_INTEGER',1); define('FHC_STRING',2); define('FHC_BOOLEAN',3); + define('FHC_LANG_ARRAY',4); } if (is_null(db::$db_conn)) $this->db_connect(); @@ -56,7 +57,7 @@ abstract class db extends basis abstract function db_affected_rows($result=null); abstract function db_result_seek($result=null, $offset); abstract function db_last_error(); - abstract function db_free_result($result=null); + abstract function db_free_result($result=null); abstract function db_version(); abstract function db_escape($var); abstract function db_null_value($var, $qoute=true); @@ -67,7 +68,7 @@ abstract class db extends basis abstract function db_getResultJSON($result = null); abstract function db_parse_array($var); - + /** * Erzeugt aus den Funktionsparameter eine SQL Abfrage * --- Wird in der Art Sonderzeichen gefunden wird dieses als FunktionsParmeter verarbeitet @@ -95,7 +96,7 @@ abstract class db extends basis $where=(!is_null($pWhere)?trim($pWhere):''); $order=(!is_null($pOrder)?trim($pOrder):''); $limit=(is_numeric($pLimit)?$pLimit:''); - + if (empty($sql) && empty($art)) { $this->errormsg='die SQL Art fehlt!'; @@ -123,7 +124,7 @@ abstract class db extends basis $sql.=($where?' '.trim($where).' ':''); else $sql.=($where?' where '.trim($where).' ':''); - if ($art=='select') + if ($art=='select') { // FIXME: If $where is e.g. 'orderstatus' because there's a column named orderstatus, this would // fail horribly? Same for the 'where'-stuff above. -MP @@ -131,22 +132,22 @@ abstract class db extends basis $sql.=($order?trim($order).' ':''); else $sql.=($order?' order by '.trim($order).' ':''); - } - if ($art=='select') + } + if ($art=='select') { if (strstr('limit',strtolower($where))) $sql.=($limit?trim($limit).' ':''); - else + else $sql.=($limit?' limit '.trim($limit).' ':''); } } - + if (!$results=$this->db_query($sql)) { $this->errormsg=$this->db_last_error(); return false; } - + if ($art!='select' && empty($pSql)) return true; @@ -159,9 +160,9 @@ abstract class db extends basis $rows=array(); while($row = $this->db_fetch_object($results)) $rows[]=$row; - return $rows; - } - + return $rows; + } + } require_once(dirname(__FILE__).'/'.DB_SYSTEM.'.class.php'); diff --git a/include/pgsql.class.php b/include/pgsql.class.php index ca9fd95ef..81c444dfd 100644 --- a/include/pgsql.class.php +++ b/include/pgsql.class.php @@ -22,6 +22,7 @@ /** * Datenbank Abstraktionsklasse fuer Postgresql Datenbank */ +require_once('sprache.class.php'); class basis_db extends db { @@ -292,6 +293,27 @@ class basis_db extends db $var = $this->db_null_value($var, false); break; + case FHC_LANG_ARRAY: + + $sprache = new sprache(); + $sprache->getAll(true); + $buf = $var; + $var = array(); + $languages = $sprache->getAllIndexesSorted(); + + foreach($languages as $sk => $sp) + { + if(!$sp || !isset($buf[$sp])) + $var[$sk] = ""; + else + $var[$sk] = $this->db_escape($buf[$sp]); + } + $var = str_replace('\\', '\\\\', $var); + $var = str_replace('"', '\\\"', $var); + $var = '\'{"' . join('","', $var) . '"}\''; + + break; + case FHC_BOOLEAN: if($var===true) $var='true'; @@ -350,15 +372,48 @@ class basis_db extends db */ public function db_parse_array($var) { - if ($var == '') + if ($var == '') return; - preg_match_all('/(?<=^\{|,)(([^,"{]*)|\s*"((?:[^"\\\\]|\\\\(?:.|[0-9]+|x[0-9a-f]+))*)"\s*)(,|(?loadIndexArray(); + + $sprache = new sprache(); + $sprache->getAll(true); + $languages = $sprache->getAllIndexesSorted(); + + + foreach ($matches as $mk => $match) + { + $values[$languages[$mk+1]] = $match[3] != '' ? stripcslashes($match[3]) : (strtolower($match[2]) == 'null' ? null : $match[2]); + } + return $values; } } + +function indexSort($a, $b) +{ + return strcmp($a->index, $b->index); +} ?> diff --git a/include/sprache.class.php b/include/sprache.class.php index e500725b6..74d866161 100644 --- a/include/sprache.class.php +++ b/include/sprache.class.php @@ -1,271 +1,317 @@ -, - * Andreas Oesterreicher and - * Karl Burkhart . - */ - -/** - * Klasse Sprache - */ -require_once(dirname(__FILE__).'/basis_db.class.php'); - -class sprache extends basis_db -{ - public $result; - public static $index_arr = array(); - public $sprache; // string - public $locale; - public $index; // int, id des array index - public $content; // boolean - public $bezeichnung_arr; - - /** - * - * Konstruktor - * @param Sprache die geladen werden soll (Default=null) - */ - public function __construct($sprache = null) - { - parent::__construct(); - - if(!is_null($sprache)) - $this->load($sprache); - } - - /** - * - * Lädt die Sprache - * @param $sprache die geladen werden soll - * @return true bei Erfolg, false wenn ein Fehler aufgetreten ist - */ - public function load($sprache) - { - $qry = "SELECT *,".$this->getSprachQuery('bezeichnung')." FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($sprache, FHC_STRING, false).";"; - - if($this->db_query($qry)) - { - if($row = $this->db_fetch_object()) - { - $this->sprache = $row->sprache; - $this->locale = $row->locale; - $this->index = $row->index; - $this->content = $this->db_parse_bool($row->content); - $this->bezeichnung_arr=$this->parseSprachResult('bezeichnung',$row); - return true; - } - else - { - $this->errormsg = 'Sprache nicht gefunden'; - return false; - } - } - else - { - $this->errormsg = "Fehler bei der Abfrage."; - return false; - } - } - - /** - * - * Lädt alle verfügbaren Sprachen - * @return true bei Erfolg, false wenn ein Fehler aufgetreten ist. - */ - public function getAll($content=null) - { - $qry = "SELECT *,".$this->getSprachQuery('bezeichnung')." FROM public.tbl_sprache"; - - if(!is_null($content)) - $qry.= " WHERE content=".$this->db_add_param($content, FHC_BOOLEAN); - $qry.=" ORDER BY sprache"; - - if(!$this->db_query($qry)) - { - $this->errormsg ="Fehler bei der Abfrage."; - return false; - } - - while($row = $this->db_fetch_object()) - { - $sprache = new sprache(); - $sprache->sprache = $row->sprache; - $sprache->locale = $row->locale; - $sprache->index = $row->index; - $sprache->content = $this->db_parse_bool($row->content); - $sprache->bezeichnung_arr=$this->parseSprachResult('bezeichnung',$row); - - $this->result[] = $sprache; - } - return true; - } - - /** - * - * Lädt das Index Array - * @return true bei Erfolg, false wenn ein Fehler aufgetreten ist. - */ - public function loadIndexArray() - { - $qry = "SELECT sprache, index FROM public.tbl_sprache WHERE index is not null ORDER BY index"; - - if(!$this->db_query($qry)) - { - $this->errormsg ="Fehler bei der Abfrage."; - return false; - } - - while($row = $this->db_fetch_object()) - { - self::$index_arr[$row->sprache]=$row->index; - } - return true; - } - - /** - * - * Löscht die übergebene Sprache - * @param $sprache die gelöscht werden soll - */ - public function delete($sprache) - { - $qry = "DELETE FROM public.tbl_sprache WHERE sprache = ".$this->db_add_param($sprache, FHC_STRING, false).";"; - - if(!$this->db_query($qry)) - { - $this->errormsg = "Fehler beim löschen der Sprache aufgetreten."; - return false; - } - return true; - - } - - /** - * - * Liefert die Anzahl aller aktiven Sprachen zurück - * @return $anzahl der Sprachen, false im Fehlerfall - */ - public function getAnzahl() - { - $anzahl = 0; - $qry = 'SELECT count(sprache) as anzahl FROM public.tbl_sprache WHERE content = true;'; - - if(!$this->db_query($qry)) - { - $this->errormsg = 'Fehler aufgetreten'; - return false; - } - - if($row = $this->db_fetch_object()) - { - $anzahl = $row->anzahl; - } - - return $anzahl; - } - - /** - * - * Liefert die Sprache eines Index zurück - * @param $index der Sprache die gesucht wird - * @return $sprache, false im Fehlerfall - */ - public function getSpracheFromIndex($index) - { - $sprache = ''; - $qry = "SELECT sprache FROM public.tbl_sprache WHERE index=".$this->db_add_param($index, FHC_INTEGER, false).";"; - - if(!$this->db_query($qry)) - { - $this->errormsg = "Fehler aufgetreten."; - return false; - } - - if($row = $this->db_fetch_object()) - { - $sprache = $row->sprache; - } - return $sprache; - } - - /** - * Liefert einen String mit den aufgespaltenen Elementen fuer mehrsprachige Arrays - * Der Result der Query kann dann mittels parseSprachResult wieder in ein Array umgewandelt werden - * - * @param $feldname - * @return string mit den aufgeschluesselten Arrayelementen der Sprache - */ - public function getSprachQuery($feldname) - { - $result = ''; - - if(!isset(self::$index_arr) || count(self::$index_arr)==0) - $this->loadIndexArray(); - - foreach(self::$index_arr as $sprache=>$index) - { - $result .= $feldname.'['.$index.'] as '.$feldname.'_'.$index.','; - } - return mb_substr($result,0,-1); - } - - /** - * Wandelt den Result von mehrsprachigen Arrays in einer SQL Query in ein PHP Array um - * - * @param $feldname name der Datenbankspalte - * @param $row row des SQL Results - * @return array mit den Sprachen der Spalte - */ - public function parseSprachResult($feldname, $row) - { - $result = array(); - - if(!isset(self::$index_arr) || count(self::$index_arr)==0) - $this->getAll(); - - foreach(self::$index_arr as $sprache=>$index) - { - $name = $feldname.'_'.$index; - if(isset($row->$name)) - $result[$sprache] = $row->$name; - else - $result[$sprache] = null; - } - return $result; - } - - /** - * - * Liefert die Bezeichnung einer Sprache in der angegebenen Sprache - * @param $sprache Kurzbezeichnung der Sprache dessen Bezeichnung geladen werden soll - * @param $anzeigesprache Sprache in der die bezeichnung geladen werden soll - */ - public function getBezeichnung($sprache, $anzeigesprache) - { - $qry = "SELECT bezeichnung[(SELECT index FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($anzeigesprache).")] - FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($sprache); - - if($result = $this->db_query($qry)) - { - if($row = $this->db_fetch_object($result)) - { - return $row->bezeichnung; - } - } - } -} +, + * Andreas Oesterreicher and + * Karl Burkhart . + */ + +/** + * Klasse Sprache + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class sprache extends basis_db +{ + public $result; + public static $index_arr = array(); + public $sprache; // string + public $locale; + public $index; // int, id des array index + public $content; // boolean + public $bezeichnung_arr; + + /** + * + * Konstruktor + * @param Sprache die geladen werden soll (Default=null) + */ + public function __construct($sprache = null) + { + parent::__construct(); + + if(!is_null($sprache)) + $this->load($sprache); + } + + /** + * + * Lädt die Sprache + * @param $sprache die geladen werden soll + * @return true bei Erfolg, false wenn ein Fehler aufgetreten ist + */ + public function load($sprache) + { + $qry = "SELECT *,".$this->getSprachQuery('bezeichnung')." FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($sprache, FHC_STRING, false).";"; + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->sprache = $row->sprache; + $this->locale = $row->locale; + $this->index = $row->index; + $this->content = $this->db_parse_bool($row->content); + $this->bezeichnung_arr=$this->parseSprachResult('bezeichnung',$row); + return true; + } + else + { + $this->errormsg = 'Sprache nicht gefunden'; + return false; + } + } + else + { + $this->errormsg = "Fehler bei der Abfrage."; + return false; + } + } + + /** + * + * Lädt alle verfügbaren Sprachen + * @return true bei Erfolg, false wenn ein Fehler aufgetreten ist. + */ + public function getAll($content=null) + { + $qry = "SELECT *,".$this->getSprachQuery('bezeichnung')." FROM public.tbl_sprache"; + + if(!is_null($content)) + $qry.= " WHERE content=".$this->db_add_param($content, FHC_BOOLEAN); + $qry.=" ORDER BY sprache"; + + if(!$this->db_query($qry)) + { + $this->errormsg ="Fehler bei der Abfrage."; + return false; + } + + while($row = $this->db_fetch_object()) + { + $sprache = new sprache(); + $sprache->sprache = $row->sprache; + $sprache->locale = $row->locale; + $sprache->index = $row->index; + $sprache->content = $this->db_parse_bool($row->content); + $sprache->bezeichnung_arr=$this->parseSprachResult('bezeichnung',$row); + + $this->result[] = $sprache; + } + return true; + } + + /** + * + * Lädt das Index Array + * @return true bei Erfolg, false wenn ein Fehler aufgetreten ist. + */ + public function loadIndexArray() + { + $qry = "SELECT sprache, index FROM public.tbl_sprache WHERE index is not null ORDER BY index"; + + if(!$this->db_query($qry)) + { + $this->errormsg ="Fehler bei der Abfrage."; + return false; + } + + while($row = $this->db_fetch_object()) + { + self::$index_arr[$row->sprache]=$row->index; + } + return true; + } + + /** + * + * Löscht die übergebene Sprache + * @param $sprache die gelöscht werden soll + */ + public function delete($sprache) + { + $qry = "DELETE FROM public.tbl_sprache WHERE sprache = ".$this->db_add_param($sprache, FHC_STRING, false).";"; + + if(!$this->db_query($qry)) + { + $this->errormsg = "Fehler beim löschen der Sprache aufgetreten."; + return false; + } + return true; + + } + + /** + * + * Liefert die Anzahl aller aktiven Sprachen zurück + * @return $anzahl der Sprachen, false im Fehlerfall + */ + public function getAnzahl() + { + $anzahl = 0; + $qry = 'SELECT count(sprache) as anzahl FROM public.tbl_sprache WHERE content = true;'; + + if(!$this->db_query($qry)) + { + $this->errormsg = 'Fehler aufgetreten'; + return false; + } + + if($row = $this->db_fetch_object()) + { + $anzahl = $row->anzahl; + } + + return $anzahl; + } + + /** + * + * Liefert die Sprache eines Index zurück + * @param $index der Sprache die gesucht wird + * @return $sprache, false im Fehlerfall + */ + public function getSpracheFromIndex($index) + { + $sprache = ''; + $qry = "SELECT sprache FROM public.tbl_sprache WHERE index=".$this->db_add_param($index, FHC_INTEGER, false).";"; + + if(!$this->db_query($qry)) + { + $this->errormsg = "Fehler aufgetreten."; + return false; + } + + if($row = $this->db_fetch_object()) + { + $sprache = $row->sprache; + } + return $sprache; + } + + /** + * + * Liefert den Index einer Sprache zurück + * @param $sprache der Sprache die gesucht wird + * @return $index, false im Fehlerfall + */ + public function getIndexFromSprache($sprache) + { + $index = false; + $qry = "SELECT * FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($sprache).";"; + + if(!$this->db_query($qry)) + { + $this->errormsg = "Fehler aufgetreten."; + return false; + } + + if($row = $this->db_fetch_object()) + { + $index = $row->index; + } + return $index; + } + + public function getAllIndexesSorted() + { + $languages = array(); + + if(!isset($this->result)) + $this->getAll(true); + + foreach($this->result as $s) + { + $languages[$s->index] = $s->sprache; + } + ksort($languages); + + //lücken im sprachenarray füllen + for($i = 1; $i<=max(array_keys($languages));$i++) + { + if(!isset($languages[$i])) + $languages[$i] = false; + } + return $languages; + } + + /** + * Liefert einen String mit den aufgespaltenen Elementen fuer mehrsprachige Arrays + * Der Result der Query kann dann mittels parseSprachResult wieder in ein Array umgewandelt werden + * + * @param $feldname + * @return string mit den aufgeschluesselten Arrayelementen der Sprache + */ + public function getSprachQuery($feldname) + { + $result = ''; + + if(!isset(self::$index_arr) || count(self::$index_arr)==0) + $this->loadIndexArray(); + + foreach(self::$index_arr as $sprache=>$index) + { + $result .= $feldname.'['.$index.'] as '.$feldname.'_'.$index.','; + } + return mb_substr($result,0,-1); + } + + /** + * Wandelt den Result von mehrsprachigen Arrays in einer SQL Query in ein PHP Array um + * + * @param $feldname name der Datenbankspalte + * @param $row row des SQL Results + * @return array mit den Sprachen der Spalte + */ + public function parseSprachResult($feldname, $row) + { + $result = array(); + + if(!isset(self::$index_arr) || count(self::$index_arr)==0) + $this->getAll(); + + foreach(self::$index_arr as $sprache=>$index) + { + $name = $feldname.'_'.$index; + if(isset($row->$name)) + $result[$sprache] = $row->$name; + else + $result[$sprache] = null; + } + return $result; + } + + /** + * + * Liefert die Bezeichnung einer Sprache in der angegebenen Sprache + * @param $sprache Kurzbezeichnung der Sprache dessen Bezeichnung geladen werden soll + * @param $anzeigesprache Sprache in der die bezeichnung geladen werden soll + */ + public function getBezeichnung($sprache, $anzeigesprache) + { + $qry = "SELECT bezeichnung[(SELECT index FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($anzeigesprache).")] + FROM public.tbl_sprache WHERE sprache=".$this->db_add_param($sprache); + + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_object($result)) + { + return $row->bezeichnung; + } + } + } +}