Ставим хук внутри шаблона.

Появилась возможность устанавливать хуки прямо внутри шаблона — trac.lsdev.ru/livestreet/changeset/848
Делается это за счет плагина к Smarty hook, например:
{hook run='body_begin'}
вызовет хуки повешенные на событие 'template_body_begin'(обратите внимание, что приставка template_ добавляется автоматически, если хук вызван из шаблона), а их результат в виде строки вернется в шаблон.

Предлагаю определиться какие нужны стандартные хуки? Сейчас добавлено только два: body_begin и body_end, соответственно вызываются в начале HTML тега BODY и в конце.

Мультизагрузка изображений

Требуется модуль для мультизагрузки изображений, как с URL, так и с локального компьютера.
Addon «Галерея» не подходит. Нужно расширение встроенного загрузчика.
Сколько будет стоить такой модуль, совместимый с 0.4?

Личные сообщения и комментарии читаю.
Спасибо!

Пасхальная сборка LiveStreet 0.4.RC

Выкладываем для тестирования пасхальную сборку LiveStreet 0.4.RC :)
Это не релиз, это только релиз-кандидат. Созданный специально для более тщательного тестирования. Все найденные баги/глюки просьба писать в этот топик.
Скачать с sourceforge.net

Всех с Рождеством Воскресением Христовым!

ошибка: Call to a member function getBlog()

Скачал сегодня с SVN последний ревижн 0.4.

Цель — сравнить скорость текущей версии на 500к топиках (как и обещал — продолжение «маньячных» похождений :)).

Конвертирование старой базы — прошло гладко. Тут гуд.
Единственное с чем столкнулся — получил вот такой вот еррор на главной странице, в правой колонке:

Fatal error: Call to a member function getBlog() on a non-object in 
/templates/compiled/new/%%17^171^17121A2C%%block.stream_comment.tpl.php on line 13


Многоуважаемые лайфстритовцы, может кто сталкивался?
Код еще не капал — сия тема лишь для экономии времени — может кто-то уже сталкивался и нашел простое решение данного «глюка»?
Буду благодарен!
И обязательно постану методы оптимизации, если вообще таковые найдем ;)

PS. Разработчикам респектище! С большой базой новая версия работает x*(n+1) раз быстрее… :)
примерно-точный коэффициент n пока найти не удалось — из-за глюка :(

Переопределение методов модулей с помощью ...Hook'ов!

В LiveStreet 0.4 появилась возможность переопределять не только целиком модули, но и отдельные методы. Это позволить разным плагинам бесконфликтно переопределять разные методы одного модуля.

Принцип действия этого механизма основан на Hook'ах:
  1. Вызов каждого метода сопровождается выполнением хуков — module_ModuleName_MethodName_before и module_ModuleName_MethodName_after, соответственно ДО и ПОСЛЕ вызова метода модуля. В первом случаи в хук передаются параметры вызова метода, во втором передается результат выполнения метода модуля.
  2. На module_ModuleName_MethodName_before можно повесить специальный хук — delegate, результат выполнения которого и будет «результатом» выполнения метода модуля

Пример:
<?php 
class HookTest extends Hook {
	public function RegisterHook() {
		$this->AddDelegateHook('module_text_parser_before','testHook',__CLASS__,-3);
	}

	public function testHook($aVars) {
		return 'Topic text > '.$aVars[0];
	}
}
?>

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

Делегирование в плагинах

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

Итак, по порядку, что уже было:
1) (fixed) ошибка с определением названия экшена при делегировании: создал тикет
2) предложение об автоподстановке префиксов делегатов ( livestreet.ru/blog/dev_documentation/3710.html#comment59803, пункт 2 )
3) (fixed) отсутствие поддержки делегирования на основе данных из xml-файла (по-видимому, функция просто ещё в разработке)

И теперь ещё кое-какие мысли (пока все в файле /engine/classes/ActionPlugin.class.php).

— Сейчас, при делегировании экшена (например {plugin_dir}/classes/actions/ActionSettings.class.php) происходит автоматическое делегирование соответствующей директории темплейтов, что не очень хорошо, т.к. это совершенно необязательно по логике и придется тупо копировать всю папку actions/ActionSettings в плагин.
Сейчас там проверяется только наличие в плагине папки с соответствующим шаблоном:
$sTemplateName=in_array(Config::Get('view.skin'),array_map('basename',glob(Config::Get('path.root.server').'/plugins/'.$aMatches[1].'/templates/skin/*',GLOB_ONLYDIR)))
				? Config::Get('view.skin')
				: 'default';

хорошо бы проверять наличие папки с соответствующим экшеном:
$fGetTpl = create_function('$sPath','preg_match("/skin\/([\w]+)\/actions/i",$sPath,$aMatches); return $aMatches[1];');
$sTemplateName=in_array(Config::Get('view.skin'),array_map($fGetTpl,glob(Config::Get('path.root.server').'/plugins/'.$aMatches[1].'/templates/skin/*/actions/Action'.ucfirst($aMatches[2]),GLOB_ONLYDIR)))
				? Config::Get('view.skin')
				: 'default';


— В методе SetTemplateAction() код
$this->getTemplatePathPlugin().'/actions/Action'.ucfirst($aMatches[2]).'/'.$sTemplate.'.tpl'
в случае без делегирования вернет /actions/ActionSettings/profile.tpl, а надо actions/ActionSettings/profile.tpl, поэтому первый слэш переносим отсюда в getTemplatePathPlugin():
$sDir=Config::Get('path.root.server')."/plugins/{$aMatches[1]}/templates/skin/{$sTemplateName}/";


— Дублирование кода в GetTemplate() лучше заменить на
if (is_null($this->sActionTemplate)) {
    $this->SetTemplateAction($this->sCurrentEvent);
}


— В дополнение к первому:
Чаще всего нужно изменить не все шаблоны экшена, а только некоторые, зачем же копировать не измененные? Сделаем проверку, есть ли они в делегирующей папке, и, если нет, вернем стандартные:
protected function SetTemplateAction($sTemplate) {
if($sActionTemplate=preg_match('/^Plugin([\w]+)_Action([\w]+)$/i',$this->GetActionClass(),$aMatches)) {
      $sTplFile = 'actions/Action'.ucfirst($aMatches[2]).'/'.$sTemplate.'.tpl';
      $sActionTemplate = is_file($this->getTemplatePathPlugin().$sTplFile)
        ? $this->getTemplatePathPlugin().$sTplFile
        : $sTplFile;
    }
    $this->sActionTemplate = $sActionTemplate;
	}


Вот такие вот мысли.
Что скажете?

PS — также с нетерпением ждем описания функционала кастомных модулей.

Как управлять Блоками плагина в 0.4?

Задача: Есть плагин, в составе которого есть блок, который надо выборочно распихать по экшнам/экшнам+эвентам (наподобие блока баннера fastvps на главной+блогах)

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

В итоге повесил хук на init_action, обращающийся к роутеру за сведениями об экшне+эвенте и этим хуком по собственным правилам вывожу необходимый блок.

+ понадобилось отключить в конфиге block.rule_index_blog.clear, иначе блок не выводился на главной (скорей всего это надо пофиксить в svn'е)

Вопрос: как мне наиболее православно всё это переписать, ибо я копчиком чувствую костыльность решения?

Переделка модуля под версию 0.4

Доброго времени суток. Есть модуль под версию 0.3. Я переделал под 0.4 всё работает кроме одного: он не хочет аплоадить фотки в директорию.

Вопрос:

Что надо поменять в:
$sDirSave=DIR_UPLOADS_PHOTOS.'/'.func_generator(1).'/'.func_generator(1).'/'.func_generator(1).'/'.func_generator(1).'/'.func_generator(1);


если раньше в config.php писалось:
define('DIR_UPLOADS_PHOTOS',DIR_UPLOADS.'/photos');


а теперь:
$config['path']['uploads']['photos']  ='___path.uploads.root___/photos';


?

Нюансы переработки модуля в соответствующий плагин для 0.4 на примере модуля Круг друзей


Собрался с силами и попробовал превратить модуль в плагин :)
Решил начать с самого простого — модуля Круг друзей.
Получившийся плагин iFace для 0.4 можно скачать здесь (как и модуль распространяется бесплатно при условии сохранения копирайтов).
Расскажу с какими нюансами столкнулся.
Читать дальше →