Beispiel #1
0
 /**
  * Метод возвращает спрайты для всех зарегистрированных директорий
  */
 public static function getAllDirsSptites()
 {
     $sprites = array();
     foreach (PsUtil::getClassConsts(__CLASS__, 'DIR_') as $dirName) {
         $sprites[$dirName] = self::getSprite($dirName);
     }
     return $sprites;
 }
Beispiel #2
0
 /**
  * Идентификатор акции - хэш от типа акции и её параметров.
  * Две акции с одним типом но разными кодами считаются разными.
  * 
  * @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);
 }
Beispiel #3
0
 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();
 }
Beispiel #4
0
 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;
 }
Beispiel #5
0
 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;
 }
Beispiel #6
0
 /**
  * @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 -- Нет --");
             }
         }
     }
 }
Beispiel #8
0
 /**
  * Метод собирает всю необходимую информацию о галерее и кеширует её для быстрого доступа.
  */
 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);
 }
Beispiel #9
0
 /**
  * Все возможные действия над таблицей
  */
 public static function getActions()
 {
     return PsUtil::getClassConsts(__CLASS__, 'ACTION_');
 }
 /**
  * Возвращает дефолтные названия соединений
  */
 public static function getDefaultConnectionNames()
 {
     return PsUtil::getClassConsts(__CLASS__, 'CONN_');
 }
Beispiel #11
0
 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;
     }
 }
Beispiel #13
0
 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];
 }
Beispiel #14
0
 /**
  * Переопределим конструктоп для проверки наличия всех нужных нам свойств.
  * Данная проверка нужна, чтобы не забыть определить все свойство, так как у нас два источника элементов галереи - база и файловая система.
  */
 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);
 }
Beispiel #15
0
 /**
  * Массив всех зарегистрированных фильтров
  */
 public static function getFilters()
 {
     return PsUtil::getClassConsts(__CLASS__);
 }
Beispiel #16
0
 protected function _construct()
 {
     $this->buttons = PsUtil::getClassConsts(get_called_class(), 'BUTTON_');
     $this->buttonsAllowed = $this->buttons;
 }
Beispiel #17
0
 public static function getColumns()
 {
     return PsUtil::getClassConsts(__CLASS__, 'FIELD_');
 }
Beispiel #18
0
 /**
  * Плагины, использованные в постах
  */
 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}");
             }
         }
     }
 }
Beispiel #20
0
 /**
  * Подписью кеша служит кол-во ячеек, принадлежащих пользователям.
  */
 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);
 }
Beispiel #21
0
 /**
  * Список всех действий над комментарием
  */
 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_'));
 }
Beispiel #23
0
 /**
  * Функция, которая будет вызвана после фетчинга шаблона для оборачивания
  * содержимого в специальный элемент.
  */
 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);
 }
Beispiel #24
0
 /**
  * Определяет все различия между файлом и таблицей и приводит в соответствие с файлом:
  * 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;
     }
 }
Beispiel #25
0
 /**
  * Массив всех типов данных php
  */
 public static function getPhpTypes()
 {
     return PsUtil::getClassConsts(__CLASS__, 'PHP_TYPE_');
 }
Beispiel #26
0
 protected function getRequiredParamKeys()
 {
     return array_merge(DiscussionController::getJsDataKeys(), PsUtil::getClassConsts(__CLASS__, 'JS_PARAM_ACTION'));
 }