/** * Идентификатор акции - хэш от типа акции и её параметров. * Две акции с одним типом но разными кодами считаются разными. * * @param array $params - параметры акции */ private function sign(array $params) { $type = self::getType(); $sign['_STOCK_CLASS_TYPE_'] = $type; foreach (PsUtil::getClassConsts($this, 'DATA_') as $param) { $sign[$param] = check_condition(array_get_value($param, $params), "Для акции {$type} не указан обязательный параметр [{$param}]."); } return simple_hash($sign); }
/** * Класс для создания экземпляра источника данных. * * @param string $mident - идентификатор маппинга. Должен совпадать для источника и цели. * @param array $params - параметры. Используются для уточнения, что необходимо загрузить (например идентификатор фолдинга). * @return MappingSource */ public static final function inst($mident, array $params = array()) { //Получим название класса-имплементации $class = get_called_class(); //Отсортируем параметры ksort_deep($params); //Получим hash загрузчика данных $hash = simple_hash(array('class' => $class, 'params' => $params, 'mident' => $mident)); if (!array_key_exists($hash, self::$items)) { self::$items[$hash] = new $class($class, $params, $mident, $hash); } return self::$items[$hash]; }
private final function fetchPost($fetchType, $cached) { $entity = $this->pp()->getFolding()->getFoldedEntity($this->postContent->getIdent()); switch ($fetchType) { case self::FETCH_TYPE_PARAMS: $smartyParams['showcase_mode'] = false; $cacheId = $cached ? simple_hash($smartyParams) : null; return $entity->fetchTpl($smartyParams, FoldedResources::FETCH_RETURN_PARAMS_OB, false, $cacheId); case self::FETCH_TYPE_CONTENT: $smartyParams['showcase_mode'] = false; $cacheId = $cached ? simple_hash($smartyParams) : null; return $entity->fetchTpl($smartyParams, FoldedResources::FETCH_RETURN_FULL_OB, true, $cacheId); case self::FETCH_TYPE_CONTENT_SHOWCASE: $smartyParams['showcase_mode'] = true; $cacheId = $cached ? simple_hash($smartyParams) : null; return $entity->fetchTpl($smartyParams, FoldedResources::FETCH_RETURN_FULL_OB, $cacheId); } raise_error("Неизвестный тип фетчинга поста: [{$fetchType}]"); }
/** * Метод возвращает список действий, которые должны быть выполнены в рамках триггера. * Под действием понимается вызов процедуры. * * @return null|string */ public static function getTriggerActions($table, $scope, $action) { $result = array(); $TABLE_WITH_CACHE = self::getTablesWithCache($scope == ENTITY_SCOPE_PROJ ? ENTITY_SCOPE_ALL : $scope); $TABLE2FOLDINGS = self::getTables2Foldings($scope == ENTITY_SCOPE_PROJ ? ENTITY_SCOPE_ALL : $scope); if (in_array($table, $TABLE_WITH_CACHE) || array_key_exists($table, $TABLE2FOLDINGS)) { $result[] = "CALL onDbChange('{$table}', '" . DbBean::CHANGE_TABLE . "')"; } if ($action == self::ACTION_UPDATE && array_key_exists($table, $TABLE2FOLDINGS)) { /* @var $folding FoldedResources */ foreach ($TABLE2FOLDINGS[$table] as $folding) { $columnIdent = $folding->getTableColumnIdent(); $columnStype = $folding->getTableColumnStype(); if ($columnStype) { //Если в таблице есть столбец с подтипом фолдинга, то достаточно добавить один триггер $ftype = $folding->getFoldingType(); $result[] = "CALL onDbChange(CONCAT('{$ftype}-', NEW.{$columnStype}, '-', NEW.{$columnIdent}), '" . DbBean::CHANGE_FOLD_ENT . "')"; } else { $unique = $folding->getUnique(); $result[] = "CALL onDbChange(CONCAT('{$unique}-', NEW.{$columnIdent}), '" . DbBean::CHANGE_FOLD_ENT . "')"; } } } /** * Небольшая обработка */ $fetched = array(); foreach ($result as $line) { $fetched[] = "\t" . ensure_ends_with(trim($line), ';'); } /* * Если мы собираем действия для проекта и они совпадают с действиями для SDK - триггер не выкладываем */ if ($scope == ENTITY_SCOPE_PROJ) { $sdkActions = self::getTriggerActions($table, ENTITY_SCOPE_SDK, $action); if (simple_hash($fetched) == simple_hash($sdkActions)) { return null; //--- } } return $fetched; }
/** * Метод возвращает информацию из информационного шаблона, производя его фетчинг * с переданными параметрами Smarty. */ public function getInfo($ident, $tpl, array $smartyParams = array()) { //Информационный шаблон $tpl = $tpl instanceof DirItem ? $tpl : $this->getInfoDi($ident, $tpl); //Если шаблон не сущетвует - просто пропускаем его, и не будем ругаться if (!$tpl->isFile()) { return null; //--- } //Ключом являются параметры Смарти, с которыми мы фетчим информационный шаблон $cacheKey = simple_hash($smartyParams); //Идентификатором кеша является путь к файлу шаблона $cacheId = self::CACHE_INFO_TPL . md5($tpl->getRelPath()); //Пробуем загрузить закешированный $cached = to_array($this->getFromFoldedCache($ident, $cacheId, array())); if (!array_key_exists($cacheKey, $cached)) { $cached[$cacheKey] = $this->getInfoTplCtt($ident, $tpl, $smartyParams); $this->saveToFoldedCache($cached, $ident, $cacheId); } return $cached[$cacheKey]; }
/** @return CssSpritesCreator */ public static function inst(array $params = array()) { $hash = simple_hash($params); return self::$INSTS[$hash] = array_key_exists($hash, self::$INSTS) ? self::$INSTS[$hash] : new CssSpritesCreator($params); }