예제 #1
0
 /**
  * Get a value from the cache
  *
  * @return mixed
  */
 public function get()
 {
     $layers = $this->layers;
     // Inner cache
     if ($layers & Cache::INNER) {
         if (isset(self::$data[$this->prefix][$this->key])) {
             $this->_hit("INNER");
             return self::$data[$this->prefix][$this->key];
         }
     }
     // Flat key for outer and distributed layers
     $key = "{$this->prefix}-{$this->key}";
     // Outer cache
     if ($layers & Cache::OUTER) {
         if (null !== ($value = SHM::get($key))) {
             if ($layers & Cache::INNER) {
                 self::$data[$this->prefix][$this->key] = $value;
             }
             $this->_hit("OUTER");
             return $value;
         }
     }
     // Distributed cache
     if ($layers & Cache::DISTR) {
         if (null !== ($value = DSHM::get($key))) {
             if ($layers & Cache::OUTER) {
                 SHM::put($key, $value);
             }
             if ($layers & Cache::INNER) {
                 self::$data[$this->prefix][$this->key] = $value;
             }
             $this->_hit("DISTR");
             return $value;
         }
     }
     $this->_hit("NONE");
     return null;
 }
예제 #2
0
 /**
  * Inits locale cache
  *
  * @return void
  */
 static function initLocales()
 {
     if (self::$_locales_ready) {
         return;
     }
     $lang = CAppUI::pref("LOCALE");
     $_all_locales = DSHM::get("exclass-locales-{$lang}");
     if (!$_all_locales) {
         $undefined = CAppUI::tr("Undefined");
         $ds = CSQLDataSource::get("std");
         $_all_locales = array();
         $request = new CRequest();
         $request->addTable("ex_class_field_translation");
         $request->addWhere(array("lang" => "= '{$lang}'"));
         $request->addLJoin(array("ex_class_field" => "ex_class_field.ex_class_field_id = ex_class_field_translation.ex_class_field_id", "ex_concept" => "ex_concept.ex_concept_id = ex_class_field.concept_id", "ex_class_field_group" => "ex_class_field_group.ex_class_field_group_id = ex_class_field.ex_group_id"));
         $request->addSelect(array("ex_class_field_translation.std", "IF(ex_class_field_translation.desc  IS NOT NULL, ex_class_field_translation.desc,  ex_class_field_translation.std) AS `desc`", "IF(ex_class_field_translation.court IS NOT NULL, ex_class_field_translation.court, ex_class_field_translation.std) AS `court`", "ex_class_field.ex_class_field_id AS field_id", "ex_class_field.name", "ex_class_field.prop", "ex_class_field.concept_id", "ex_class_field_group.ex_class_id", "ex_concept.ex_list_id"));
         $list = $ds->loadList($request->makeSelect());
         // Chargement des list_items par concept, field ou list
         $request = new CRequest();
         $request->addTable("ex_list_item");
         $request->addSelect(array("ex_list_item_id", "list_id", "concept_id", "field_id", "name"));
         $list_items = $ds->loadList($request->makeSelect());
         // Chargement en une seule requete de toutes les traductions de champs
         $enum_list_cache = array("list" => array(), "concept" => array(), "field" => array());
         $mapper = array("list_id" => "list", "concept_id" => "concept", "field_id" => "field");
         foreach ($list_items as $_item) {
             $_item_id = $_item["ex_list_item_id"];
             $_item_name = $_item["name"];
             foreach ($mapper as $_field_name => $_to) {
                 if ($_field_value = $_item[$_field_name]) {
                     $enum_list_cache[$_to][$_field_value][$_item_id] = $_item_name;
                 }
             }
         }
         foreach ($list as $_item) {
             $_locales = array();
             $key = "-{$_item['name']}";
             $_locales[$key] = $_item["std"];
             if ($_item["desc"]) {
                 $_locales["{$key}-desc"] = $_item["desc"];
             }
             if ($_item["court"]) {
                 $_locales["{$key}-court"] = $_item["court"];
             }
             $_ex_class_id = $_item['ex_class_id'];
             $_prefix = "CExObject_{$_ex_class_id}";
             $prop = $_item["prop"];
             if (strpos($prop, "enum") === false && strpos($prop, "set") === false) {
                 if (!isset($_all_locales[$_prefix])) {
                     $_all_locales[$_prefix] = array();
                 }
                 $_all_locales[$_prefix] = array_merge($_all_locales[$_prefix], $_locales);
                 continue;
             }
             $key = ".{$_item['name']}";
             $_locales["{$key}."] = $undefined;
             $concept_id = $_item["concept_id"];
             $ex_list_id = $_item["ex_list_id"];
             $field_id = $_item["field_id"];
             $enum_list = array();
             if ($concept_id) {
                 if ($ex_list_id) {
                     if (isset($enum_list_cache["list"][$ex_list_id])) {
                         $enum_list = $enum_list_cache["list"][$ex_list_id];
                     }
                 } else {
                     if (isset($enum_list_cache["concept"][$concept_id])) {
                         $enum_list = $enum_list_cache["concept"][$concept_id];
                     }
                 }
             } else {
                 if (isset($enum_list_cache["field"][$field_id])) {
                     $enum_list = $enum_list_cache["field"][$field_id];
                 }
             }
             foreach ($enum_list as $_value => $_locale) {
                 $_locales["{$key}.{$_value}"] = $_locale;
             }
             if (!isset($_all_locales[$_prefix])) {
                 $_all_locales[$_prefix] = array();
             }
             $_all_locales[$_prefix] = array_merge($_all_locales[$_prefix], $_locales);
         }
         DSHM::put("exclass-locales-{$lang}", $_all_locales, true);
     }
     foreach ($_all_locales as $_prefix => $_locales) {
         CAppUI::addLocales($_prefix, $_locales);
     }
     self::$_locales_ready = true;
 }