+29.51
Рейтинг
70.91
Сила

Сергей

Новое в разрабатываемой версии LiveStreet CMS


Подготавливая админку к выходу мы с Максимом планировали написать полный перечень новых возможностей движка и админки, но времени на это не было, поэтому первая статья-знакомство с бетой админки от Максима была короткой. Решил восполнить этот пробел написав полный список того, что внедрено в новую разрабатываемую версию движка и того, что мы сделали в админке.

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

Интеграция плагинов с админ-панелью 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,
			),
		),
	),
);


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

Переписать "blog" -> "community" и "personal_blog" -> "blog"

Приветствую. Только изучаю LS. Пытаюсь сделать, казалось бы, тривиальную вещь — пути «blog» переписать на «community» а «personal_blog» на «blog».(те коллективные все становятся «community», а персональные «blog»).
$config['router']['rewrite']

тут не поможет… Как сделать? Куда смотреть?

Тег audio [Решено]

Доброго времени суток господа.

Занялась прикручиванием аудио к сайту, посредством uppod. Есть некоторая маленькая проблема, хотелось бы что бы тег был не просто <audio>ссылка</audio> а вида <audio=«текст»>ссылка</audio> дабы можно было приписывать к аудио еще и имя трека. Пустые плееры смотрятся негоже.

Вот мой код из Text.class.php
$sText = preg_replace('/<audio>(.*)<\/audio>/Ui', '<object id="audioplayer954" type="application/x-shockwave-flash" data="/player/uppod.swf" width="305" height="36"><param name="wmode" value="opaque"></param><param name="bgcolor" value="#ffffff"></param><param name="allowScriptAccess" value="always"></param><param name="movie" value="/player/uppod.swf"></param><param name="flashvars" value="comment=&st=/player/st/audio103-767.txt&file=$1"></param></object>


Пожалуйста подскажите как добавить такую возможность.



Решила дописать полное решение, вдруг кому-то пригодится.
Благодарность за помощь: PSNet
Код плеера здесь на основе uppod. Значит в самом коде плеера замените данные на свои (audio103-767.txt и прочие).

1. Открываем config/jevix.php

В список разрешенных тегов «cfgAllowTags» добавляем 'audio'
В список преформатированных тегов «cfgSetTagPreformatted» добавляем 'audio'
К разрешенным параметрам тегов «cfgAllowTagParams» добавляем:
array(
	'audio',
	array('title')
),


2. Добавляем в /engine/modules/text/Text.class.php
$sText = preg_replace(
'#<audio( title="([^"]+)")?>(.*)<\/audio>#iuU',
'<object type="application/x-shockwave-flash" data="/player/uppod.swf" width="305" height="36"><param name="wmode" value="opaque"></param></param><param name="allowScriptAccess" value="always"></param><param name="movie" value="/player/uppod.swf"></param><param name="flashvars" value="comment=$2&st=/player/st/audio103-767.txt&file=$3"></param></object>', $sText);


Теперь вам доступен тег
<audio title="название трека">ссылка</audio>

Выпадающее меню на jquery в header_top.tpl

Заметка для себя.
Как добавить многоуровневое выпадающее горизонтальное меню на Livestreet 1.0.3

Понравился мне здесь один вариант готового меню, которое остается только допилить напильником.
Если кому-то не приглянулся дизайн, то всегда можно поискать аналоги, я на оригинальность не претендую…



А в этом деле нам помогут камень, ножницы, бумага и волшебный порошок...
Читать дальше →

Про ЛС-каталог и мои плагины

Т.к. многие спрашивают меня про то, почему моих плагинов нет в ЛС-каталоге, то я должен, видимо, как-то объясниться перед пользователями своих плагинов. Что и делаю.
Читать дальше →

Выносим обработку евентов в отдельный файл

В транковой версии на github.com появилась возможность выносить объемную обработку евентов из экшена в отдельные файлы.

Эти файлы размещаются в каталоге /classes/actions/[action]/Event[Name].class.php, где [action] — это название экшена, которому принадлежит евент, [Name] — название внешнего обработчика евента.

Рассмотрим более подробно.
Пусть у нас будет экшен ActionBlog.class.php:
<?php

class ActionBlog extends Action {

	public $oUserCurrent=null;

	public function Init() {
		$this->oUserCurrent=$this->User_GetUserCurrent();

		$this->SetDefaultEvent('index');
	}

	/**
	 * Регистрируем евенты
	 *
	 */
	protected function RegisterEvent() {
		/**
		 * Регистрируем внешние обработчики евентов
		 */
		$this->RegisterEventExternal('Topic','ActionBlog_EventTopic');

		$this->AddEvent('index','EventIndex');
		$this->AddEventPreg('/^topic$/i','/^(\d+)\.html$/i','/^$/i','Topic::EventShowTopic');
		$this->AddEventPreg('/^topic$/i','/^list$/i','/^$/i','Topic::EventList');
	}


	protected function EventIndex() {
		/**
		 * Устанавливаем шаблон для вывода
		 */
		$this->SetTemplateAction('index');
	}
}
?>

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

Как заставить CSS и JS обновляться автоматически при обновлении файлов

У нас на сервере включена полезная опция объединения всех JS и CSS файлов. Задается она в конфиге

/**
 * Параметры компрессии css-файлов
 */
$config['compress']['css']['merge'] = true;       // указывает на необходимость слияния файлов по указанным блокам.
$config['compress']['js']['merge']  = true; 


Однако при обновлении исходников JS и CSS файлов пользователи не получают обновления. Я видел есть плагин ReloadCSS однако он не занимается JS файлами, плюс тыкать кнопку мне тоже не охота совсем. В итоге я полез в код движка и нашел место, где формируется название скомпрессированных файлов

engine/modules/viewer/Viewer.class.php функция Compress
        /**
	 * Сжимает все переданные файлы в один,
	 * использует файловое кеширование
	 *
	 * @param  array  $aFiles	Список файлов
	 * @param  string $sType	Тип файла - js, css
	 * @return array
	 */
	protected function Compress($aFiles,$sType) {
		$sCacheDir  = $this->sCacheDir."/".Config::Get('view.skin');
		$sCacheName = $sCacheDir."/".md5(serialize($aFiles).'_head').".{$sType}";
		$sPathWeb    = Config::Get('path.root.web');
		/**
		 * Если кеш существует, то берем из кеша
		 */
		if(!file_exists($sCacheName)) {


Видно, что в формировании ключа участвуют только имена файлов. Я добавил туда еще и размеры, заодно проверил скорость формирования ключа. Вот такой код у меня получился:

	/**
	 * Сжимает все переданные файлы в один,
	 * использует файловое кеширование
	 *
	 * @param  array  $aFiles	Список файлов
	 * @param  string $sType	Тип файла - js, css
	 * @return array
	 */
	protected function Compress($aFiles,$sType) {
		$sPathWeb    = Config::Get('path.root.web');
		$aFileDates = array();
		$iStart = microtime(true);
		foreach ($aFiles as $sFile) {
			// если файл локальный
			if (strpos($sFile, $sPathWeb)!==false) {
				$sFile=$this->GetServerPath($sFile);
				list($sFile,)=explode('?',$sFile,2);
				$aFileDates[] = filectime($sFile);
			}
		}
		$sCacheDir  = $this->sCacheDir."/".Config::Get('view.skin');
		$sCacheName = $sCacheDir."/".md5(implode($aFiles).implode($aFileDates).'_head').".{$sType}";
		echo "Key calculation took ".(microtime(true) - $iStart)." secs\n";
		/**
		 * Если кеш существует, то берем из кеша
		 */
		if(!file_exists($sCacheName)) {


Проверка показала, что время пренебрежимо мало:

Key calculation took 0,0016648769378662 secs
Key calculation took 0,0010089874267578 secs


Убираем отладочный вывод и радумеся обновлениям JS и CSS.

Можно было бы это сделать плагином, но в плагине пришлось бы переопределить функцию Compress. Может, лучше это изменение просто включить в следующую версию LS.

Реализация конкурсов

Собственно впервые столкнулся с данной cms. Необходимо реализовать на сайте раздел «конкурсы», видел такой платный плагин, но он к сожалению не подходит. Хотя готов его приобрести если исполнитель решит что проще его допилить до нужного функционала.
Собственно что должно быть в конкурсах:
Афиша конкурса, картинка ну и описание например
под каждой афишей две кнопки «участники» и «прислать работу»
Если конкурс окончен, то вместо кнопки «прислать работу», появляется «голосование»
Соответственно если идет голосование, то пользователь может проголосовать за участника
Вывод на странице например по 10 конкурсов, и под этими 10тью конкурсами «архив», куда можно будет отправлять конкурсы через админку, либо они бы отправлялись автоматически.
При клике на кнопку «участники». открывается список участников, которые участвую в данном конкурсе.
При клике «прислать работу», должна быть возможность написать текст, вставить картинку, аудио, видео.
В целом это все, более подробно при личном общении.
p.s. в комментах пожалуйста напишите приблизительный бюджет…

Заблокировать персональные сообщения админу

Недавно столкнулся с проблемой, пользователи стали задавать вопросы по сайту мне, главному админу. Хотя у меня есть специальные люди которые этими вопросами занимаются. Об этом много раз упоминалось на сайте. Думаю в этом случае мне поможет лишь блокировка лички. Может есть плагин, или какой нибудь готовый способ?