/** * Метод возвращает спрайты для всех зарегистрированных директорий */ public static function getAllDirsSptites() { $sprites = array(); foreach (PsUtil::getClassConsts(__CLASS__, 'DIR_') as $dirName) { $sprites[$dirName] = self::getSprite($dirName); } return $sprites; }
/** * Идентификатор акции - хэш от типа акции и её параметров. * Две акции с одним типом но разными кодами считаются разными. * * @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); }
public static function psctrl(array $params) { $id = array_get_value_unset('id', $params); $class = to_array(array_get_value_unset('class', $params)); $class[] = 'pscontrols'; if (!empty($params)) { array_remove_keys($params, array_diff(array_keys($params), PsUtil::getClassConsts(__CLASS__, 'ACTION_'))); } return empty($params) ? '' : PSSmarty::template('common/pscontrols.tpl', array('id' => $id, 'class' => PsHtml::classes2string($class), 'actions' => $params))->fetch(); }
protected final function __construct() { $this->CLASS = get_called_class(); PsUtil::assertClassHasDifferentConstValues($this->CLASS, 'CODE_'); PsUtil::assertClassHasDifferentConstValues($this->CLASS, 'ACTION_'); $this->ACTIONS = PsUtil::getClassConsts($this->CLASS, 'ACTION_'); $this->LOGGER = PsLogger::inst($this->CLASS); $this->PROCESS_CODE = $this->getProcessCode(); check_condition(in_array($this->PROCESS_CODE, PsUtil::getClassConsts(__CLASS__, 'CODE_')), "Класс [{$this->CLASS}] использует незарегистрированный код аудита [{$this->PROCESS_CODE}]."); $this->SESSION = SESSION_AUDIT_ACTION . '-' . $this->CLASS . '-' . $this->PROCESS_CODE; }
private function buildJsDefs(PageParams $params, PageContext $ctxt) { $JS_CLASS_CONSTS = PsUtil::getClassConsts('PsConstJs'); $JS_CONSTS = $this->jsConsts(); $JS_COMMON = $this->jsCommon($ctxt); $JS_PAGE = $params->getJsParams(); $defs = json_encode(array_merge($JS_CONSTS, $JS_COMMON, $JS_PAGE)); $const = json_encode($JS_CLASS_CONSTS); $defs = "var defs={$defs}; var CONST={$const};"; $defs = PsHtml::linkJs(null, $defs); $this->LOGGER->infoBox('JS DEFS', $defs); return $defs; }
/** * @covers PsUtil::getClassConsts */ public function testGetClassConsts() { $fromCache = true; $this->assertEquals(ClassA::CONSTS(), PsUtil::getClassConsts(new ClassA(), null, $fromCache)); $this->assertFalse($fromCache); $this->assertEquals(ClassA::CONSTS(), PsUtil::getClassConsts(ClassA::get__CLASS__(), null, $fromCache)); $this->assertTrue($fromCache); $this->assertEquals(ClassA::CONSTS(), PsUtil::getClassConsts(ClassA::get__FILE__(), null, $fromCache)); $this->assertTrue($fromCache); $this->assertEquals(array('CONST_A' => 'A'), PsUtil::getClassConsts(ClassA::get__CLASS__(), 'CONST_A', $fromCache)); $this->assertFalse($fromCache); $this->assertEquals(ClassA::CONSTS(), PsUtil::getClassConsts(ClassA::get__CLASS__(), 'CONST_', $fromCache)); $this->assertFalse($fromCache); $this->assertEquals(array(), PsUtil::getClassConsts(ClassA::get__CLASS__(), 'CONSTX_', $fromCache)); $this->assertFalse($fromCache); $this->assertEquals(array(), PsUtil::getClassConsts(ClassA::get__CLASS__(), 'CONSTX_', $fromCache)); $this->assertTrue($fromCache); }
/** * В процессе закрытия данного класса мы напишем полный список изменённых сущностей */ public function onDestruct() { foreach (array('ACTION_FOLDING_' => 'Фолдинги', 'ACTION_ENTITY_' => 'Сущности') as $CONST_PREFIX => $name) { $this->LOGGER->infoBox($name); foreach (PsUtil::getClassConsts($this, $CONST_PREFIX) as $action) { $idents = array_get_value($action, $this->ACTIONS, array()); $count = count($idents); $this->LOGGER->info(); $this->LOGGER->info($action . ':'); if ($count > 0) { for ($i = 0; $i < $count; $i++) { $this->LOGGER->info("\t" . (1 + $i) . '. ' . $idents[$i][0] . ($idents[$i][1] ? ' [' . $idents[$i][1] . ']' : '')); } } else { $this->LOGGER->info("\t -- Нет --"); } } } }
/** * Метод собирает всю необходимую информацию о галерее и кеширует её для быстрого доступа. */ private function getSnapshot() { $DATA = PSCache::GALLERY()->getFromCache($this->gallery, PsUtil::getClassConsts($this, 'PARAM_')); if (is_array($DATA)) { return $DATA; //--- } $DATA = array(); /* * Информация о галерее (из базы) */ $galleryInfo = GalleryBean::inst()->getGalleryInfo($this->gallery); //name $gallName = $galleryInfo ? trim($galleryInfo['v_name']) : ''; $gallName = $gallName ? $gallName : 'Галерея'; /* * Картинки, входящие в галерею (те, для которых есть запись в БД и b_show=1). * Мы также сразу отсеим те картинки, для которых нет файла на файловой системе, * чтобы потом клиент не делал лишний запрос на наш сервер. */ $galleryImages = GalleryBean::inst()->getGalleryItems($this->gallery, false, $this->getDirectoryImgNames()); //Проведём фетчинг необходимых представлений галереи $SmartyParams['id'] = $this->gallery; $SmartyParams['name'] = $gallName; $SmartyParams['images'] = $galleryImages; //.box_images - блок картинок, который будет преобразован в галерею с помощью js. $imagesHtml = PSSmarty::template('mmedia/gallery/box_images.tpl', $SmartyParams)->fetch(); $imagesHtml = normalize_string($imagesHtml); //.as_list - для отображения списка картинок в popup окне $asListHtml = PSSmarty::template('mmedia/gallery/as_list.tpl', $SmartyParams)->fetch(); $asListHtml = normalize_string($asListHtml); //Все сложим в файл и сохраним в кеш $DATA[self::PARAM_CNT] = count($galleryImages); $DATA[self::PARAM_NAME] = $gallName; $DATA[self::PARAM_ASLIST] = $asListHtml; $DATA[self::PARAM_BOXIMGS] = $imagesHtml; return PSCache::GALLERY()->saveToCache($DATA, $this->gallery); }
/** * Все возможные действия над таблицей */ public static function getActions() { return PsUtil::getClassConsts(__CLASS__, 'ACTION_'); }
/** * Возвращает дефолтные названия соединений */ public static function getDefaultConnectionNames() { return PsUtil::getClassConsts(__CLASS__, 'CONN_'); }
private static function getTypes() { return PsUtil::getClassConsts(__CLASS__, 'TYPE_'); }
/** * Метод создаёт новый фолдинг */ public function makeNewFolding(ArrayAdapter $adapter) { $ifaces = $adapter->arr('ifaces'); $rtypes = $adapter->arr('rtypes'); $type = lowertrim($adapter->str('FoldingType')); $subtype = lowertrim($adapter->str('FoldingSubType')); $group = $adapter->str('FoldingGroup'); $classPrefix = $adapter->str('FoldingClassPrefix'); check_condition($type, 'Не передан тип фолдинга'); check_condition($group, 'Не передана группа для фолдинга'); check_condition($classPrefix, 'Не передан префикс для классов фолдинга'); //TODO - определять директорию для воздания менеджера фолдингов. die('Folding dir is not deffined.'); $classesDi = DirItem::inst(array('sdk/kit', 'folded'), $group); check_condition(!$classesDi->isDir(), "Директория {$classesDi} уже существует"); check_condition(!$classesDi->isFile(), "Элемент {$classesDi} не может быть файлом"); $rtypes = array_intersect(array_keys(PsUtil::getClassConsts('FoldedResources', 'RTYPE_')), $rtypes); $rtypesArr = trim(implode(', self::', $rtypes)); $rtypesArr = $rtypesArr ? "self::{$rtypesArr}" : ''; $hasPhp = in_array('RTYPE_PHP', $rtypes); $classesDm = DirManager::inst($classesDi->getRelPath())->makePath(); $resourcesPatternDmTo = DirManager::resources(array('folded', $group, FoldedResources::PATTERN_NAME)); check_condition(!$resourcesPatternDmTo->isDir(), "Целевая директория {$resourcesPatternDmTo} существует"); $resourcesPatternDmFrom = DirManager::resources(array('folded', FoldedResources::PATTERN_NAME)); check_condition($resourcesPatternDmFrom->isDir(), "Некорректна директория-источник {$resourcesPatternDmFrom}"); $interfaces = array(); foreach ($this->getFoldedInterfaces($ifaces) as $name => $ifaceClass) { $ctt = $ifaceClass->getClassBody(); if ($ctt) { $interfaces[] = "/****************\n\t * {$name}\n\t ****************/\n" . $ctt; } } $smParams = $adapter->getData(); $smParams['rtypes'] = $rtypesArr; $smParams['funique'] = FoldedResources::unique($type, $subtype); $smParams['BaseClass'] = 'Base' . $classPrefix; $smParams['ManagerClass'] = $classPrefix . 'Manager'; $smParams['ResourcesClass'] = $classPrefix . 'Resources'; $smParams['implements'] = $ifaces ? 'implements ' . implode(', ', $ifaces) . ' ' : ''; $smParams['interfaces'] = $interfaces ? implode("\n\n\t", $interfaces) : ''; try { //КЛАССЫ //Resources $tpl = PSSmarty::template(DirItem::inst(array(__DIR__, 'tpls'), 'resources.tpl'), $smParams); $di = $classesDm->getDirItem(null, $smParams['ResourcesClass'], 'php'); $di->writeToFile(trim($tpl->fetch()), true); //Manager $tpl = PSSmarty::template(DirItem::inst(array(__DIR__, 'tpls'), 'manager.tpl'), $smParams); $di = $classesDm->getDirItem(null, $smParams['ManagerClass'], 'php'); $di->writeToFile(trim($tpl->fetch()), true); if ($hasPhp) { //BaseClass $tpl = PSSmarty::template(DirItem::inst(array(__DIR__, 'tpls'), 'baseclass.tpl'), $smParams); $di = $classesDm->getDirItem(null, $smParams['BaseClass'], 'php'); $di->writeToFile(trim($tpl->fetch()), true); } //ШАБЛОН ДЛЯ СУЩНОСТЕЙ $resourcesPatternDmTo->makePath(); foreach ($rtypes as $rtype) { $ext = FoldedResources::resourceTypeToExt(PsUtil::newReflectionClass('FoldedResources')->getConstant($rtype)); $diTo = $resourcesPatternDmTo->getDirItem(null, FoldedResources::PATTERN_NAME, $ext); $diFrom = $resourcesPatternDmFrom->getDirItem(null, FoldedResources::PATTERN_NAME, $ext); if ($ext == PsConst::EXT_PHP) { $diTo->writeToFile(str_replace('eclassnamebase', $smParams['BaseClass'], $diFrom->getFileContents())); continue; } $diFrom->copyTo($diTo); } } catch (Exception $ex) { $classesDm->clearDir(null, true); $resourcesPatternDmTo->clearDir(null, true); throw $ex; } }
public final function includePanel($panelName) { if (array_key_exists($panelName, $this->includedPanels)) { return $this->includedPanels[$panelName]; } check_condition($this instanceof PanelFolding, "Фолдинг {$this} не может работать с панелями"); check_condition(in_array($panelName, PsUtil::getClassConsts($this, 'PANEL_')), "Панель [{$panelName}] не может быть предоставлена фолдингом {$this}"); //Сразу отметим, что панель была запрошена, так как может возникнуть ошибка $this->includedPanels[$panelName] = ''; /* * Уникальный код панели - тот самый, через который потом можно будет * достучаться до параметров панели из javascript. */ $panelUnique = $this->getUnique($panelName); //Стартуем профайлер $this->profilerStart(__FUNCTION__ . "({$panelName})"); /** @var PluggablePanel */ $panel = $this->buildPanel($panelName); //Мог вернуться и null, тогда ничего не подключаем if ($panel == null) { //Останавливаем профайлер без сохранения $this->profilerStop(false); return ''; } //Останавливаем профайлер $this->profilerStop(); check_condition($panel instanceof PluggablePanel, "Возвращена некорректная панель {$panelUnique}. Ожидался обект типа PluggablePanel, получен: " . PsUtil::getClassName($panel)); //Html content $this->includedPanels[$panelName] = trim($panel->getHtml()); //Js params $jsParams = $panel->getJsParams(); if (!isTotallyEmpty($jsParams)) { PageBuilderContext::getInstance()->setJsParamsGroup(PsConstJs::PAGE_JS_GROUP_PANELS, $panelUnique, $jsParams); } //Smarty resources params $smartyParams4Resources = $panel->getSmartyParams4Resources(); if (is_array($smartyParams4Resources) && !empty($smartyParams4Resources)) { PageBuilderContext::getInstance()->setSmartyParams4Resources($smartyParams4Resources); } return $this->includedPanels[$panelName]; }
/** * Переопределим конструктоп для проверки наличия всех нужных нам свойств. * Данная проверка нужна, чтобы не забыть определить все свойство, так как у нас два источника элементов галереи - база и файловая система. */ function __construct(array $data) { foreach (PsUtil::getClassConsts(__CLASS__, 'DBPROP_') as $propName) { check_condition(array_key_exists($propName, $data), "Required property {$propName} not given for " . __CLASS__); } parent::__construct($data); }
/** * Массив всех зарегистрированных фильтров */ public static function getFilters() { return PsUtil::getClassConsts(__CLASS__); }
protected function _construct() { $this->buttons = PsUtil::getClassConsts(get_called_class(), 'BUTTON_'); $this->buttonsAllowed = $this->buttons; }
public static function getColumns() { return PsUtil::getClassConsts(__CLASS__, 'FIELD_'); }
/** * Плагины, использованные в постах */ public function getSnapshot() { $SNAPSOT = PSCache::POPUPS()->getFromCache('POPUP_PAGES_SNAPSOT', PsUtil::getClassConsts(__CLASS__, 'CACHABLE_')); if (!is_array($SNAPSOT)) { $this->LOGGER->info('Building plugins SNAPSHOT...'); //Сначала соберём все плагины, использованные в постах $USED = array(); /* @var $pp PostsProcessor */ foreach (Handlers::getInstance()->getPostsProcessors() as $pp) { $pp->preloadAllPostsContent(); /* @var $post Post */ foreach ($pp->getPosts() as $post) { $plugins = $pp->getPostContentProvider($post->getId())->getPostParams()->getUsedPlugins(); if (empty($plugins)) { //В посте не используются плагины continue; } $this->LOGGER->info('Plugins [{}] used in post [{}].', implode(',', $plugins), IdHelper::ident($post)); $USED = array_merge($USED, $plugins); } } $USED = array_unique($USED); $this->LOGGER->info('Full list of used plugins: [{}].', implode(',', $USED)); //Соберём все видимые попап-страницы и плагины $ENTITYS = array(); foreach (array($this->getVisibleClassInsts(), PluginsManager::inst()->getVisibleClassInsts()) as $popups) { foreach ($popups as $ident => $popup) { $visType = $popup->getPopupVisibility(); $take = PopupVis::isAllwaysVisible($visType) || $visType == PopupVis::BYPOST && in_array($ident, $USED); if ($take) { $ENTITYS[] = $popup; } } } //Отсортируем собранные сущности по названию usort($ENTITYS, function ($e1, $e2) { $str1 = $e1 instanceof BasePopupPage ? $e1->getTitle() : $e1->getName(); $str2 = $e2 instanceof BasePopupPage ? $e2->getTitle() : $e2->getName(); return strcasecmp($str1, $str2); }); $VISIBLE = array(); $DEFAULT = array(); foreach ($ENTITYS as $entity) { $visType = $entity->getPopupVisibility(); if ($entity instanceof BasePopupPage) { $type = self::TYPE_PAGE; $ident = $entity->getIdent(); } if ($entity instanceof BasePlugin) { $type = self::TYPE_PLUGIN; $ident = $entity->getIdent(); } $VISIBLE[$type . '_' . $ident] = array('type' => $type, 'ident' => $ident); if ($visType == PopupVis::TRUE_DEFAULT) { $DEFAULT[$type . '_' . $ident] = array('type' => $type, 'ident' => $ident); } } $SNAPSOT = array(self::CACHABLE_VISIBLE => $VISIBLE, self::CACHABLE_DEFAULT => $DEFAULT); $SNAPSOT = PSCache::POPUPS()->saveToCache($SNAPSOT, 'POPUP_PAGES_SNAPSOT'); } return $SNAPSOT; }
/** * В процессе закрытия данного класса мы напишем полный список изменённых сущностей */ public function onDestruct() { foreach (array('ACTION_FOLDING_' => 'Фолдинги', 'ACTION_ENTITY_' => 'Сущности') as $CONST_PREFIX => $name) { $this->LOGGER->infoBox($name); foreach (PsUtil::getClassConsts($this, $CONST_PREFIX) as $action) { $idents = array_get_value($action, $this->ACTIONS, array()); $count = count($idents); $this->LOGGER->info(); $this->LOGGER->info($action . ':'); if ($count > 0) { for ($i = 0; $i < $count; $i++) { $this->LOGGER->info("\t" . (1 + $i) . '. ' . $idents[$i][0] . ($idents[$i][1] ? ' [' . $idents[$i][1] . ']' : '')); } } else { $this->LOGGER->info("\t -- Нет --"); } } } /** * Распечатаем карту зависимости сущностей фолдинга. * Операция настолько тяжёлая, что в режиме ajax также будем избегать её выполнение. */ if (PsDefines::isDevmode() && !PageContext::inst()->isAjax()) { $this->LOGGER->infoBox('Карта зависимости сущностей фолдингов:'); foreach ($this->getDependsOnMap() as $who => $fromWhoArr) { $this->LOGGER->info("\t{$who}:"); foreach ($fromWhoArr as $fromWho) { $this->LOGGER->info("\t\t{$fromWho}"); } } } }
/** * Подписью кеша служит кол-во ячеек, принадлежащих пользователям. */ private function getCachable($key) { $sign = $this->getOwnedCellsCnt(); $DATA = PSCache::MOSAIC()->getFromCache($this->id, PsUtil::getClassConsts(__CLASS__, 'CACHABLE_'), $sign); if (!is_array($DATA)) { $DATA = array(); $ownedCells = $this->BEAN->getOwnedCells($this->id); $sign = count($ownedCells); //Честно посчитаем подпись по кол-ву ячеек, с которым была построена карта $DATA[self::CACHABLE_AREAS] = MosaicImageCellsCompositor::area($ownedCells, $this->cellWidth, $this->cellHeight); $DATA[self::CACHABLE_STATISTIC] = $this->BEAN->getStatictic($this->id); PSCache::MOSAIC()->saveToCache($DATA, $this->id, $sign); } return array_get_value($key, $DATA); }
/** * Список всех действий над комментарием */ public static final function getCommentActions() { return PsUtil::getClassConsts(__CLASS__, 'COMMENT_ACTION_'); }
protected function _construct() { parent::_construct(); $this->setSmartyParam('ifaces', AdminFoldedManager::inst()->getFoldedInterfaces()); $this->setSmartyParam('rtypes', PsUtil::getClassConsts('FoldedResources', 'RTYPE_')); }
/** * Функция, которая будет вызвана после фетчинга шаблона для оборачивания * содержимого в специальный элемент. */ protected function wrapContent($content, array $params = array()) { $params['id'] = $this->getFoldedEntity()->getUnique(); $params['class'][] = PsUtil::getClassConsts(get_called_class(), 'CSS_'); return PsHtml::div($params, $content); }
/** * Определяет все различия между файлом и таблицей и приводит в соответствие с файлом: * 1. Создаёт те записи, которые есть в файле но нет в базе - F * 2. Модифицированные записи проводит в соответствие к фарианту из файла - M * 3. Записи, которые есть только в базе, удаляет - D * * @param $ident - идентификатор записи, которая будет обновлена. */ private function importDataFromFile($recIdent = null) { $accepted = false; $modified = $this->getModifiedRows(); if ($recIdent) { //Ищем конкретную запись foreach (PsUtil::getClassConsts(__CLASS__, 'DIFF_') as $type) { if (array_key_exists($recIdent, $modified[$type])) { //Запись с идентификатором $recIdent изменена с типом $type $this->executeUpdate($modified[$type][$recIdent]['SQL']); $accepted = true; break; } } } else { //Принимаем все изменения foreach ($modified as $info) { foreach ($info as $data) { $this->executeUpdate($data['SQL']); $accepted = true; } } } if ($accepted) { //Мы приняли одно или более изменений, сбросим полученную ранее разницу $this->modifiedRows = null; } }
/** * Массив всех типов данных php */ public static function getPhpTypes() { return PsUtil::getClassConsts(__CLASS__, 'PHP_TYPE_'); }
protected function getRequiredParamKeys() { return array_merge(DiscussionController::getJsDataKeys(), PsUtil::getClassConsts(__CLASS__, 'JS_PARAM_ACTION')); }