Плагин «Документация для шаблона»

Делал прежде всего для себя, однако может кому еще надо подобное.

Простой мини плагин для разработчиков шаблонов. Позволяет создавать страницу с документацией. Или можно сделать FAQ например.

Что он делает?

— Создает страницу /about
— Добавляет ссылку в админку на страницу /about
— Показывается страница только админу
— Подключает style.css для оформления страницы
— Языковые файлы
— Шаблон страницы index.tpl

Краудсорсинговая документация

Пришла идея сделать документацию для разработчиков. Судя по всему, такая необходимость давно назрела. К сожалению, документация быстро устаревает, а бывает и совсем исчезает. Чтобы такого не произошло и её существование не сильно зависело от меня — решил разместить её на GitHub — оттуда уж точно никуда не денется. Надеюсь на вашу помощь в написании.

В общем, вот — livestreet.net

Работа в различных окружениях (devel, production и т.п.)

В новой версии LS мы изменили механизм работы определения окружения и загрузки соответствующих конфигов (config.local.php и config.stable.php). Если раньше эти конфиги всегда подгружались(просто перезаписывая данные), то сейчас подключается только нужный конфиг.

Логику работы мы взяли из популярного фреймворка Laravel. Теперь у нас есть в корне сайта каталог /bootstrap/ с файлом start.php. Именно в этом файле задается механизм определения текущего окружения:
$sEnv=Engine::DetectEnvironment(array(
                                 'production' => array('your-machine-name'),
                             ));

В метод DetectEnvironment передается список окружений (ключи массива) и в качестве значений список хост-неймов серверов. Текущий хост-нейм можно посмотреть в nix командой hostname. Как альтернатива в метод DetectEnvironment вместо списка можно передать функцию и определить в ней свою логику:
$sEnv=Engine::DetectEnvironment(function(){
    // здесь ваша логика
    return 'devel';
});

В зависимости от текущего окружения будет загружен необходимый конфиг (если он существует). Например, для окружения «production» загрузится /application/config/config.production.php Этот же механизм работает и для плагинов! Будет подгружен конфиг /application/config/plugins/[plugin_name]/config.production.php

По умолчанию (если не удалось определить окружение) подключается окружение «local». Дополнительно зарезервировано окружение «testing», которое используется для юнит-тестов. Активируется оно довольно просто — достаточно перед подключением файла /bootstrap/start.php создать переменную $bUseEnvironmentTesting=true;.

Обновление модулей кеширования и логирования

В разрабатываемой версии мы переработали модули Cache и Logger — код стал проще, меньше и более функционален.

Модуль кеширования (Cache)
Реализован новый принцип работы с разными бекендами, теперь каждый бекенд представляет из себя отдельную сущность (наследуется от ModuleCache_EntityBackend). Такой подход позволяет легко добавлять новые типы бекендов — достаточно создать сущность с нужным типом кеша, например, вот так выглядит XCache:
/**
 * Бекенд xcache
 */
class ModuleCache_EntityBackendXcache extends ModuleCache_EntityBackend {
	/**
	 * Проверяет доступность использования текущего бекенда
	 *
	 * @return mixed
	 */
	public function IsAvailable() {
		if (extension_loaded('xcache')) {
			return true;
		}
		return 'The xcache extension must be loaded for using this backend!';
	}
	/**
	 * Проверяет доступность использование мульти-get запросов к кешу (указывать сразу несколько ключей)
	 *
	 * @return mixed
	 */
	public function IsAllowMultiGet() {
		return true;
	}
	/**
	 * Инициализация бекенда
	 *
	 * @param array $aParams
	 *
	 * @return mixed
	 */
	public function Init($aParams=array()) {
		require_once(LS_DKCACHE_PATH.'Cache/Backend/TagEmuWrapper.php');
		require_once(LS_DKCACHE_PATH.'Zend/Cache/Backend/Xcache.php');
		$aConfig=Config::Get('xcache');

		$oCahe = new Zend_Cache_Backend_Xcache(is_array($aConfig) ? $aConfig : array());
		if (isset($aParams['stats_callback'])) {
			$this->oCacheBackend=new Dklab_Cache_Backend_TagEmuWrapper(new Dklab_Cache_Backend_Profiler($oCahe,$aParams['stats_callback']));
		} else {
			$this->oCacheBackend=new Dklab_Cache_Backend_TagEmuWrapper($oCahe);
		}
	}
	/**
	 * Получить значение из кеша
	 *
	 * @param string $sName	Имя ключа
	 * @return mixed|bool
	 */
	public function Get($sName) {
		return $this->oCacheBackend->load($sName);
	}
	/**
	 * Записать значение в кеш
	 *
	 * @param  mixed  $mData	Данные для хранения в кеше
	 * @param  string $sName	Имя ключа
	 * @param  array  $aTags	Список тегов, для возможности удалять сразу несколько кешей по тегу
	 * @param  int|bool    $iTimeLife	Время жизни кеша в секундах
	 * @return bool
	 */
	public function Set($mData,$sName,$aTags=array(),$iTimeLife=false) {
		return $this->oCacheBackend->save($mData,$sName,$aTags,$iTimeLife);
	}
	/**
	 * Удаляет значение из кеша по ключу(имени)
	 *
	 * @param string $sName	Имя ключа
	 * @return bool
	 */
	public function Delete($sName) {
		return $this->oCacheBackend->remove($sName);
	}
	/**
	 * Чистит кеши
	 *
	 * @param string $cMode	Режим очистки кеша
	 * @param array $aTags	Список тегов, актуально для режима Zend_Cache::CLEANING_MODE_MATCHING_TAG
	 * @return bool
	 */
	public function Clean($cMode=Zend_Cache::CLEANING_MODE_ALL,$aTags=array()) {
		return $this->oCacheBackend->clean($cMode,$aTags);
	}
}

На данный момент в стандартном комплекте идет поддержка File, XCache и Memcached. Также добавлены дополнительные бекенды — FileOrm и Life. FileOrm служит для отдельного файлового кеширования схем таблиц в БД, автоматически применяется в функционале ORM. Life — это сохранение данных на время выполнения скрипта, т.е. аналог паттерна Registry. Применяется он в методах GetLife и SetLife.

Читать дальше →

Новый модуль для работы с изображениями и модуль FS

В разрабатываемой новой версии мы обновили модуль Image для работы с изображениями.
Теперь он основан на библиотеке Imagine и предоставляет удобные методы для манипуляции с изображениями. Дополнительной особенностью является поддержка разных PHP библиотек (драйверов): gd, imagick и gmagick. Нужный драйвер устанавливается в конфиге $config['module']['image']['driver']='imagick';

/**
 * Получаем параметры
 */
$aParams=$this->Image_BuildParams('gallery');
/**
 * Создаем объект изображения
 */
if(!$oImage=$this->Image_Open($sFileSource,$aParams)) {
	$sMsgError=$this->Image_GetLastError();
}


Читать дальше →

Языковой файл плагина

Интересно, а где находится информация о том что массив в языковом файле плагина не добавляется к общему массиву, а к элементу [«plugin»][«название плагина»] => array(«здесь то что в файле»)? И что в итоге в шаблоне надо подставлять {$aLang.plugin.названиеплагина.названиеключа}? Это как то совсем не очевидно. Я это понял только посмотрев содержимое docs.livestreetcms.com/api/1.0/ModuleLang#GetLangMsg-detail.

Похоже это появилось в версии 1.0.1 livestreet.ru/blog/11132.html#comment199625:
В ЛС 1.0.1 поменялся вывод языка из плагинов на такую конструкцию.

Несколько вопросов от новичка, возможно глупых

Здравствуйте!

Давно слежу за LS, но никак не решался перевести на неё свой сайт. Начну с предыстории: сейчас у меня блог на Wordpress + форум на PunBB (тематика — один из дистрибутивов Linux) и я осознал, что пришло время переезжать на сабж :)

В данный момент на сайте процветает бардак — в блоге перемешаны новости разного формата, посетители зачастую не могут найти нужную информацию и задают на форуме одни и те же вопросы; полезная информация разбросана как по сайту, так и по форуму и это еще больше усложняет поиск. И я решил поступить следующим образом: построить сайт с нуля, всю накопившуюся полезную информацию структурировать в раздел «Документация»; вместо форума организовать что-то вроде Q&A, ибо в данный момент форум по сути выполняет ту же самую функцию; ну и добавить еще некоторые плюшки.

Теперь задам свои вопросы, которые кому-то могут показаться глупыми.

  1. Насколько я понял, решения для создания вики-страниц в LS нет (кроме плагина MediaWikiIntegration), а так как я считаю MediaWiki слишком громоздкой для своего небольшого сайта, у меня назрел такой вопрос: могу ли я дать некоторым пользователям права на создание и редактирование статических страниц, без других прав администратора? Или каким еще образом я могу организовать раздел с пользовательской докуметацией?
  2. Могу ли я в сайдбаре справа создать блок с произвольным содержимым, который будет отображаться только на некоторых статических страницах?
  3. Каким образом я могу создать пользовательскую галерею изображений? Грубо говоря все пользователи заливают изображения в один общедоступный альбом.

Буду благодарен за любые советы!

Стандарты написания кода экосистемы LiveStreet

Предлагаю вниманию сообщества и, в первую очередь, разработчиков первую версию стандартов по написанию кода для LiveStreet окружения:

  • github.com/psnet/ls-coding-standarts — этот документ регламентирует стандарт написания кода для экосистемы LiveStreet.

Также для тех, кто пишет плагины, будет удобной инструкция по подготовке плагина к выпуску и публикации в каталоге дополнений LiveStreet:


Ваши предложения, рекомендации можно направлять в пулреквесты, создание исюшек на гите или просто комментированием здесь.

Данных документов ранее не существовало, что вводило в некоторое замешательство новых разработчиков, которые не всегда сразу понимали с какой стороны подходить к написанию кода.

кросс пост из гида.

Стек наследований [Решено]

Доброго времени, копаясь в коде LS наткнулся на следующую запись (плагин Page):

protected $aInherits = array(
		'module' => array(
			'PluginSitemap_ModuleSitemap' => 'PluginPage_ModuleSitemap',
		),
	);


В документации по LS нашел только (docs.livestreetcms.com/api/1.0/ModulePlugin#aInherits-detail) это.

Читать дальше →