/** @return DirItem */ private function getAvatarImg() { if (!isset($this->avatars)) { $this->avatars = array_values(DirManager::images('avatars')->getDirContent(null, DirItemFilter::IMAGES)); check_condition($this->avatars, 'No avatar images'); } return $this->avatars[rand(0, count($this->avatars) - 1)]; }
private function getImages(ArrayAdapter $params, $FNAME) { $dir = $params->str('dir'); $name = $params->get('name'); //НЕПОСРЕДСТВЕННО КАРТИНКА if ($name instanceof DirItem) { return $name; } /* * FOLDING */ $FCW = FoldedContextWatcher::getInstance(); $folding = null; $ident = $params->get('ident'); //Тип фолдинга. Он может быть передан либо в параметре 'group', либо по префиксу смарти-функции, например: postimg (post-название типа фолдинга). $foldingType = $params->get('group'); $foldingType = $foldingType ? $foldingType : (starts_with($FNAME, 'img') ? null : array_get_value(0, explode('img', $FNAME))); //Подтип фолдинга, например: is - подтип фолдингов для фолдингов с типом post (выпуск журнала среди всех постов). $foldingSubType = $params->get('type'); if ($params->has('post')) { /* @var $post AbstractPost */ $post = $params->get('post'); $ident = $post->getIdent(); $folding = Handlers::getInstance()->getPostsProcessorByPostType($post->getPostType())->getFolding(); } else { if ($foldingType) { $hasSubtype = FoldedStorage::isFoldingHasSubtype($foldingType); if ($hasSubtype && !$foldingSubType) { //У фолдинга есть подтип, но в параметрах он не передан - определим фолдинг по контексту $folding = $FCW->getFoldedEntityEnsureType($foldingType)->getFolding(); } else { $folding = FoldedStorageInsts::byTypeStype($foldingType, $foldingSubType); } } else { if ($foldingSubType) { //Если передан только тип, то считаем, что имеется ввиду фолдинг поста $folding = Handlers::getInstance()->getPostsProcessorByPostType($foldingSubType)->getFolding(); } } } if ($folding && !$ident) { //У нас есть фолдинг, но нет идентификатора сущности - определим её из контекста $ident = $FCW->getFoldedEntityEnsureType($folding->getFoldingType())->getIdent(); } if (!$dir && !$name && $ident && $folding) { /* * Не передано название картинки, но передан идентификатор сущности - показываем cover. * TODO - подумать, возможно имеет смысл сделать возможность показывать любую картинку в заданном размере. */ return $folding->getCover($ident, $params->str('dim')); } /* * Берём путь "как есть", если: * 1. Передан специальный параметр asis * 2. Передана dir, и она начинается с '/' * 3. Не передана dir, но при этом name начинается с '/' * 4. dir или name указывают на адрес в интернете */ $asis = $params->bool('asis') || starts_with($dir, DIR_SEPARATOR) || !$dir && starts_with($name, DIR_SEPARATOR) || PsUrl::isHttp($dir) || PsUrl::isHttp($name); if ($asis) { if (!$dir) { return $name; } if (starts_with($name, DIR_SEPARATOR)) { return cut_string_end($dir, DIR_SEPARATOR) . $name; } return ($name ? ensure_ends_with($dir, DIR_SEPARATOR) : $dir) . $name; } /** @var DirManager */ $DM = null; /* * Теперь определим DirManager. Мы его можем взять: */ if ($folding) { //1. Из ресурсов фолдинга $DM = $folding->getResourcesDm($ident, 'src'); } else { //2. Обычный resources->images, если фолдинг не установлен $DM = DirManager::images(); } /* * Определим список показываемых картинок по атрибуту $name. Пример тега: * {postimg type='tr' ident='matrix' name='mao.gif mu.png mu.png'} * Просто разделим значение атрибута $name по точкам и пробелам и склеим в названия картинок. */ $NAMES = preg_split("/[. ]/", $name); $DI = $DM ? $DM->getDirItem($dir, $name) : DirItem::inst($dir, $name); if (count($NAMES) % 2 != 0 || $DI->isImg()) { //Указано что-то непонятное - не чётное кол-во составных элементов return $DI; } $IMAGES = array(); for ($i = 0; $i < count($NAMES); $i += 2) { $imgName = $NAMES[$i] . '.' . $NAMES[$i + 1]; $IMAGES[] = $DM ? $DM->getDirItem($dir, $imgName) : DirItem::inst($dir, $imgName); } return $IMAGES; }
/** * Основной метод, выполняющий загрузку содержимого тестовой страницы */ private function getContentImpl(RequestArrayAdapter $params, Smarty $smarty) { //Силовые упражнения $exId = $params->int('ex_id'); if ($exId) { //$ex = GymManager::getInstance()->getExercise($exId); $tplPath = "gym/exercises/{$exId}.tpl"; return $smarty->templateExists($tplPath) ? $smarty->fetch($tplPath) : null; } //Специальные страницы $pageType = $params->str('pagetype'); if ($pageType) { $smParams = array(); switch ($pageType) { case 'smarty': foreach (array('blocks', 'functions', 'modifiers') as $type) { $items = DirManager::smarty('plugins/' . $type)->getDirContentFull(null, PsConst::EXT_PHP); /* @var $item DirItem */ foreach ($items as $item) { //Название $name = explode('.', $item->getName()); $name = $name[1]; //Первый комментарий $tokens = token_get_all($item->getFileContents()); $comment = array(T_COMMENT, T_DOC_COMMENT); $fileComment = ''; foreach ($tokens as $token) { if (in_array($token[0], $comment)) { $fileComment = trim($token[1]); break; } } $smParams[$type][] = array('name' => $name, 'comment' => $fileComment); } } break; case 'doubleimg': $images = DirManager::images()->getDirContentFull(null, DirItemFilter::IMAGES); $sorted = array(); /* @var $img DirItem */ foreach ($images as $img) { $ident = $img->getSize() . 'x' . $img->getImageAdapter()->getWidth() . 'x' . $img->getImageAdapter()->getHeight(); $sorted[$ident][] = $img; } $result = array(); /* @var $img DirItem */ foreach ($sorted as $ident => $imgs) { if (count($imgs) > 1) { $result[$ident] = $imgs; } } $smParams = array('images' => $result); break; case 'testmethods': $smParams['methods'] = TestManagerCaller::getMethodsList(); break; case 'imgbysize': $images = DirManager::images()->getDirContentFull(null, DirItemFilter::IMAGES, array('GymExercises')); DirItemSorter::inst()->sort($images, DirItemSorter::BY_SIZE); $smParams = array('images' => $images); break; case 'formules': $formules = TexImager::inst()->getAllFormules(); $totalSize = 0; /* @var $formula DirItem */ foreach ($formules as $formula) { $totalSize += $formula->getSize(); $formula->setData('class', 'TeX'); } DirItemSorter::inst()->sort($formules, DirItemSorter::BY_SIZE); $smParams = array('formules' => $formules, 'formules_size' => $totalSize); break; } $content = $smarty->fetch("test/page_{$pageType}.tpl", $smParams); if ($pageType) { switch ($pageType) { case 'patterns': $out = array(); preg_match_all("/===(.*?)===/", $content, $out, PREG_PATTERN_ORDER); $params = array(); for ($i = 0; $i < count($out[0]); $i++) { $full = $out[0][$i]; $ctt = $out[1][$i]; $params[$full] = "<div class=\"demo-head\">{$ctt}</div>"; } $content = PsStrings::replaceMap($content, $params); } } return $content; } //Тестовая страница $num = $params->int('num'); $num = $num ? $num : 1; return $smarty->fetch("test/page{$num}.tpl"); }
/** * Преобразование в массив. * Возвращает события для отображения на временнОй шкале. Параметры: * * [title] - название события * [start] - начало события, в формате 1985-01-29 или 580 BC * [end] - окончание события, в формате 1985-01-29 ил 500 BC * [image] - картинка события * [color] - цвет полоски * [link] - ссылка * [textColor] - цвет текста * [icon] - иконка для события-точки * [description] - текст, показываемый под событием * */ public function toArray() { $rec = array(); $rec['title'] = $this->title; $rec['start'] = $this->dt_start; $rec['image'] = $this->image; $rec['textColor'] = $this->textColor; /* * Все необходимые проверки мы выполняем в классе на момент установки значений, поэтому здесь можем просто собирать установленные значения */ if ($this->link) { $rec['link'] = $this->link; } if ($this->dt_stop) { $rec['end'] = $this->dt_stop; } if ($this->lineColor) { $rec['color'] = $this->lineColor; } if ($this->icon) { $rec['icon'] = DirManager::images()->relFilePath('timeline', $this->icon); } /* Содержимое */ $rec['description'] = PsHtml::p(array('class' => 'dates'), $this->dates) . $this->content; /* Наши данные */ $this->custom['ident'] = $this->ident; $this->custom['interval'] = DatesTools::inst()->toString(DatesTools::TS_NUMBERED, $this->dt_start, $this->dt_stop); /* Специфические данные */ $rec['custom'] = $this->custom; return $rec; }
protected function __construct() { $this->dirsMagager = DirManager::images('GymExercises'); }
/** @return DirItem */ public static function resizeBase($file, $dim) { return self::inst()->doResize(DirManager::images()->getDirItem('base', $file), $dim); }