energine
[ class tree: energine ] [ index: energine ] [ all elements ]

Source for file DBWorker.class.php

Documentation is available at DBWorker.class.php

  1. <?php
  2.  
  3. /**
  4.  * Класс DBWorker.
  5.  *
  6.  * @package energine
  7.  * @subpackage core
  8.  * @author 1m.dm
  9.  * @copyright Energine 2006
  10.  * @version $Id$
  11.  */
  12.  
  13. //require_once('core/framework/SystemConfig.class.php');
  14. //require_once('core/framework/QAL.class.php');
  15.  
  16. /**
  17.  * Предоставляет производным классам ссылку на объект для работы с БД.
  18.  *
  19.  * @package energine
  20.  * @subpackage core
  21.  * @author 1m.dm
  22.  * @abstract
  23.  */
  24. abstract class DBWorker extends Object {
  25.  
  26.     /**
  27.      * @access protected
  28.      * @static
  29.      * @var QAL единый для всех экземпляров класса объект QAL
  30.      */
  31.     protected static $dbhInstance;
  32.  
  33.     /**
  34.      * @access protected
  35.      * @var QAL ссылка на self::$dbhInstance (для производных классов)
  36.      */
  37.     protected $dbh;
  38.     /**
  39.      * Кеш переводов
  40.      * (получается за ними по отдельности очень часто нужно обращаться)
  41.      * @var unknown_type 
  42.      */
  43.     private static $translations null;
  44.  
  45.     /**
  46.      * Конструктор класса.
  47.      *
  48.      * @access public
  49.      * @return void 
  50.      */
  51.     public function __construct({
  52.         parent::__construct();
  53.         if (!isset(self::$dbhInstance)) {
  54.             $dsn sprintf('mysql:host=%s;dbname=%s'$this->getConfigValue('database.host')$this->getConfigValue('database.name'));
  55.             self::$dbhInstance new QAL(
  56.                 $dsn,
  57.                 $this->getConfigValue('database.username'),
  58.                 $this->getConfigValue('database.password'),
  59.                 array(
  60.                     PDO::ATTR_PERSISTENT => false,
  61.                     PDO::ATTR_EMULATE_PREPARES => true,
  62.                     PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
  63.                 )
  64.             );
  65.         }
  66.         $this->dbh = self::$dbhInstance;
  67.     }
  68.  
  69.     /**
  70.      * Возвращает перевод текстовой константы из таблицы переводов для
  71.      * указанного языка. Если язык явно не указан - используется текущий язык.
  72.      *
  73.      * @access public
  74.      * @static
  75.      * @param string $const текстовая константа
  76.      * @param int $langId язык для перевода
  77.      * @return string 
  78.      */
  79.     public static function _translate($const$langId null{
  80.         $const strtoupper($const);
  81.         
  82.         $currentLangId intval(Language::getInstance()->getCurrent());
  83.         //если не закешированы - кешируем переводы для текущего языка
  84.         //действия по кешированию логичней было бы разместить в конструкторе, 
  85.         //но на момент его вызова еще не известен дефолтный язык
  86.         if(is_null(self::$translations)){
  87.             $res self::$dbhInstance->selectRequest(
  88.             'SELECT UPPER(ltag_name) AS const, trans.ltag_value_rtf AS translation FROM share_lang_tags ltag '.
  89.             'LEFT JOIN share_lang_tags_translation trans ON trans.ltag_id = ltag.ltag_id '.
  90.             'WHERE lang_id = '.$currentLangId
  91.             );
  92.             if(is_array($res)){
  93.                 foreach($res as $row){
  94.                     self::$translations[$currentLangId][$row['const']] $row['translation'];
  95.                 }
  96.             }
  97.             //вот что должно происходить если в базе нет констант текущего языка?
  98.         }
  99.         //устанавливаем дефолтное возвращаемое значение равным значению константы перевода
  100.         $result $const;
  101.         //
  102.         //Тут столько хитрых проверок не просто так - а чтобы минимизировать количество обращений к БД
  103.         //
  104.         //Если язык - не указан, используем текущий, а информация о константах на нем у нас закеширована
  105.         if (!isset($langId)) {
  106.             $langId $currentLangId;
  107.             //эта константа есть в переводах для текущего языка?
  108.             if(isset(self::$translations[$currentLangId][$const])){
  109.                 //тогда возвращаем ее значение
  110.                 $result self::$translations[$currentLangId][$const];
  111.             }
  112.             else{
  113.                 //если не было  - теперь будет
  114.                 //а значение возвращается дефолтное
  115.                 self::$translations[$currentLangId][$const$const;
  116.             }
  117.         }
  118.         //может все таки есть инфа в кеше?
  119.         elseif(isset(self::$translations[$langId][$const])){
  120.             //если да - то чудесно
  121.             $result self::$translations[$langId][$const];
  122.         }
  123.         else{
  124.             //лезем за значением в базу
  125.             $res self::$dbhInstance->selectRequest(
  126.                 'SELECT trans.ltag_value_rtf AS result FROM share_lang_tags ltag '.
  127.                 'LEFT JOIN share_lang_tags_translation trans ON trans.ltag_id = ltag.ltag_id '.
  128.                 'WHERE ltag.ltag_name = '.self::$dbhInstance->quote($result).' AND lang_id = '.intval($langId)
  129.             );
  130.             if (is_array($res)) {
  131.                 //если нашли - вернем его
  132.                 $result simplifyDBResult($res'result'true);
  133.             }
  134.             //а если не нашли - будет возвращаться дефолтное значение
  135.             
  136.             //нашли - не нашли все равно в кеш записываем 
  137.             self::$translations[$langId][$const$result;
  138.         }
  139.         return $result;
  140.     }
  141.  
  142.     /**
  143.      * Возвращает дату в виде строки прописью
  144.      *
  145.      * @param $year 
  146.      * @param $month 
  147.      * @param $day 
  148.      * @return string 
  149.      * @static
  150.      */
  151.     public static function _dateToString($year$month$day){
  152.         $result = (int)$day.' '.self::_translate('TXT_MONTH_'.(int)$month).' '.$year;
  153.         return $result;
  154.     }
  155.  
  156.     /**
  157.      * Нестатический метод-обёртка над DBWorker::_translate -
  158.      * для удобства использования внутри производных классов.
  159.      *
  160.      * @access public
  161.      * @param string $const текстовая константа
  162.      * @param int $langId язык для перевода
  163.      * @return string 
  164.      * @see DBWorker::_translate()
  165.      */
  166.     public function translate($const$langID null{
  167.         return self::_translate($const$langID);
  168.     }
  169.  
  170.     /**
  171.      * Дата прописью
  172.      * Обертка над DBWorker::_dateToString
  173.      *
  174.      * @param $date string
  175.      * @param $format string
  176.      * @return string 
  177.      * @see DBWorker::_dateToString
  178.      */
  179.     public function dateToString($date$format='%d-%d-%d'){
  180.         list($year$month$daysscanf($date$format);
  181.         return self::_dateToString($year$month$day);
  182.     }
  183.  
  184. }
В создании документации нам помог: phpDocumentor