+398.83
Рейтинг
965.74
Сила

Максим

Работа в различных окружениях (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();
}


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

Дополнительные поля - использование в плагинах

В новой разрабатываемой версии LiveStreet есть функционал дополнительных (пользовательских) полей. Сейчас он задействован для топиков. Суть сводится к удобной возможности добавлять в различные объекты новые поля разных типов.

Сейчас поддерживаются следующие типы полей:
  • Целое число
  • Дробное число
  • Строка
  • Текст
  • Чекбокс
  • Дата
  • Выпадающий список
  • Теги
  • Ссылка на видео
  • Файл
  • Изображение

Постепенно мы наращиваем функционал и количество типов.
За весь функционал по полям отвечает модуль Property. Рассмотрим пример подключения функционала дополнительных полей к плагину «Статьи» на базе ORM.

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

Плагин "Фриланс - заказы на сайте"


Создает новый раздел, где пользователи могут размещать свои заказы.

Основные возможности:
  • Ограничение создания заказов по рейтингу
  • Категории заказов
  • Фильтр поиск заказов: активность, категории, страна, город, цена
  • Комментирование заказов
  • Ответ на заказ через личные сообщения (по кнопке формируется шаблон личного сообщения автору заказа)
  • Отдельное облако тегов для заказов
  • Вывод последних комментариев к заказам в отдельную вкладку в прямой эфире
  • Блок с последними заказами
  • Возможность скрывать емайл и телефон у заказа (показывается только авторизованным)

Скриншоты доступны в каталоге.

Скидка под катом

Плагин «Постовой / Статьи / GoGetLinks»


С помощью этого плагина вы можете получать дополнительный доход со своих сайтов, размещая платные статьи, постовые и контекстные ссылки в топиках. Плагин подходит для работы с биржами GoGetLinks.net, Miralinks, Webartex.

Основные особенности:
— в конфиге настраивается список пользователей, которым доступен функционал плагина
— опция для разрешения индексации всех ссылок в тексте топика (для размещения статей)
— возможность запретить дальнейшее редактирование топика его автором (чтобы платный материал не был удален)
— вставка постового в конец топика
— возможность персонально для каждого топика задать свои HTML title, description и keywords

Под катом скриншоты и скидки

Плагин "Tags Kit" - расширенный функционал тегов


Плагин значительно расширяет функционал стандартных тегов.
На данный момент доступны три большие группы дополнительного функционала.


По катом описание и скидка →

Новый функционал топиков

В разрабатываемой новой версии LS ( github.com/livestreet/livestreet ) мы переработали функционал топиков.

В первую очередь избавились от жесткого разделения на типы (топик, опрос, фотосет, ссылка). Добавили возможность самому создавать произвольные типы топиков, которые могут отличаться набором полей. Управление полями топиков происходит через новый функционал EAV (модуль Property), на данный момент доступны типы: число, строка, большой текст, выбор из списка, дата, теги, чекбокс, ссылка на видео (youtube, vimeo, rutube).

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

Интеграция плагинов с админ-панелью LS

Одна из главных фишек новой админки, это удобная и проста интеграция с другими плагинами.
Теперь плагины могут встраивать свой интерфейс прямо внутрь админки.

Рассмотрим основные технические моменты. Есть два варианта интеграции:
  1. Визуальное управление конфигом плагина
  2. Встраивание функционала в интерфейс админки (для более сложных плагинов)

Визуальное управление конфигом плагина
Все что нужно сделать, это описать так называемую схему конфига. Она состоит из двух частей — описание всех параметров конфига и описание групп/разделов параметров, которые формируют визуальную группировку на странице редактирование параметров.
Описание всех параметров задается в конфиге плагина в специальном ключе $config_scheme$, например
$config['$config_scheme$'] = array(
	'per_page' => array(
		/*
		 * тип: integer, string, array, boolean, float
		 */
		'type' => 'integer',
		/*
		 * отображаемое имя параметра, ключ языкового файла относительно плагина, или просто текст
		 */
		'name' => 'Количество элементов на страницу',
		/*
		 * отображаемое описание параметра, ключ языкового файла относительно плагина, или просто текст
		 */
		'description' => 'config.per_page.description',
		/*
		 * валидатор (не обязательно)
		 */
		'validator' => array(
			/*
			 * тип валидатора, существующие типы валидаторов движка:
			 * Boolean, Compare, Date, Email, Number, Regexp, Required, String, Tags, Type, Url, + Array (специальный валидатор, см. документацию)
			 */
			'type' => 'Number',
			/*
			 * параметры, которые будут переданы в валидатор
			 */
			'params' => array(
				'min' => 1,
				'max' => 20,
				/*
				 * разрешить только целое число
				 */
				'integerOnly' => true,
				/*
				 * не допускать пустое значение
				 */
				'allowEmpty' => false,
			),
		),
	),
	'param_string_1' => array(
		'type' => 'string',
		'name' => 'config.param_string_1.name',
		'description' => 'config.param_string_1.description',
		'validator' => array(
			'type' => 'String',
			'params' => array(
				'min' => 5,
				'max' => 50,
				'allowEmpty' => true,
			),
		),
	),
);


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

Бета-версия админ-панели для LiveStreet CMS



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

Итак, на данный момент это бета, в ней много еще нет, но уже заложена базовая основа для наращивания функционала.
Главное, что мы сделали:
  • Механизм и интерфейс редактирования конфигов
  • Простая интеграция плагинов в админку
  • Поддержка интерфейса для управления конфигами плагинов
  • Универсальное key-value хранилище данных для плагинов
  • Новый функционал управления дополнительными полями. Можно к любой сущности привязывать доп поля (если сущность ORM, то это делается буквально одной строчкой). В коробке поддержка полей для топиков.
  • Управление пользователями и банами (нужный и долгожданный функционал)
  • Базовая интеграция каталога плагинов прямо в админ-панель
  • Базовая статистика по контенту (топики, комментарии, регистрации)

И да, мы сделали админку в виде отдельного плагина. Это избавляет от тесной интеграции с ядром движка, позволяет кастомизировать админку под свои проекты, не обязательно блого-социальные.

Код админки github.com/livestreet/lsplugin-admin
Установка:
  1. Админка работает только на текущей девел-версии ЛС.
  2. Скачиваем LS от сюда github.com/livestreet/livestreet
  3. Не забываем про каталог framework, который берем здесь github.com/livestreet/livestreet-framework
  4. Далее через стандартный инсталлятор (/install/) ставим LS
  5. После установки выполняем в БД патч из /install/patch.sql
  6. Авторизируемся под администратором и по адресу /admin/ активируем плагин «Admin panel» (предварительно скачав его с github.com/livestreet/lsplugin-admin, название каталога с плагином должно быть «admin»)

В комплекте с админкой в /example/plugins/ идет пример плагина «Статьи», который интегрируется в интерфейс админки и работает с дополнительными полями. По интеграции будет отдельный топик.

По админке выслушаем любые пожелания, от функционала до оформления.

Под катом несколько скриншотов