0.00
Рейтинг
0.27
Сила

Wave

Какой бы я хотел видеть стандартную сборку LiveStreet

Приятно, что LS развивается. Отлично что появляются модули, для конкретных задач. И не менее приятно, что есть люди, которые хотят, чтобы LiveStreet стал лучше.

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

Почему же она противоречива? Спросите вы.
Читать дальше →

Livestreet & Yii 1.1.6 - вместе веселее

Не спрашивайте «зачем?», просто я так захотел ;)

code.google.com/p/livestreet-yii/

Что ОК:
  1. ActiveRecord + модели к базовым записям в БД LiveStreet (возможно, косячные немного и не хватает коунтеров)
  2. LsCacheBehavior для базовых AR-моделей в зародышевом состоянии
  3. Дебаг-лог в Firebug
  4. jQuery в noConflict-mode
  5. Работают assetManager и clientScript

Что не ОК:
  1. Пока не придумал что делать с контроллерами
  2. Импорт классов с видлкардом "*" не работает (хз почему)
  3. Пока непонятно как православо пользовать виджеты из-за того, что я не придумал что делать с контроллерами
  4. Из-за того, что имена языков в LS называются полными именами, а не в формате ISO 639-*, непонятно что делать с Yii::t()

Как пользовать

Дописываем конфиг app'а путем православного инхерита ModuleYii и заменой метода GetConfig
public function GetConfig($sType){
	$aConfig = parent::GetConfig($sType);
	// православное дописывание конфига $aConfig
	return $aConfig;
}


Перед использованием любого механизма, связанного с Yii, необходимо создать/получить инстанцию app'а (а то вдруг она еще никем и нигде не создана!)
// возвращает CWebApplication или CConsoleApplication для PHP_SAPI = 'cli'
$oApp = $this->Yii_App();


Теперь можно топать дальше.

pathAlias для application = базовой директории LiveStreet (там, где index.php лежит).

Вкл/выкл дебаг-лог в plugins/yii/config/config.php:
defined('YII_DEBUG') or define('YII_DEBUG', true); // вкл
defined('YII_DEBUG') or define('YII_DEBUG', false); // выкл


Кто желает помочь в развитии плагина — помогайте :)

как сделать страницу профиля "главной" ?

как сделать при закрытой регистрации чтобы пользователь попадал сразу в свой профиль и страничка профиля была главной, а все остальные «дочерними»? интересует именно кусок кода как это сделать.подскажите куда копать, спасибо!

Решил перековырять немного ядро

Мои нововведения:
  • Хуки вокруг инициализации модулей _before и _after за счет методов InitModule
  • Переработанный __autoload
  • Получение информации о классе методом GetClassInfo вплоть до пути к класс-файлу

Плюсы
  • Никаких более регулярок для парсинга имени класса в других скриптах, всё в одном месте
  • Нет более вилок в коде по поводу регистра в именах классов и методов. Везде учитывается регистр (собственно, чем нам грозит php6, насколько я помню)
  • Стандартные хуки вокруг инициализации модулей — это просто прекрасно, я считаю, мне часто нужны были
  • func_list_plugins() — замена куче дублирующегося кода
  • Переработанный __autoload автоматом инклюдит все возможные классы, имена которых описаны по правилам ядра.

Сырцы
engine/classes/Engine.class.php raw
engine/modules/hook/Hook.class.php raw

func_list_plugins() (поместить в engine/include/function.php)
function func_list_plugins($bAll = false){
	$sPluginsDir = Config::Get('path.root.server').'/plugins';
	$sPluginsListFile = $sPluginsDir.'/plugins.dat';
	$aPlugin = array();
	if($bAll){
		$aPluginRaw = array();
		$aPaths = glob("$aPluginRaw/*", GLOB_ONLYDIR);
		if($aPaths)
		foreach($aPaths as $sPath){
			$aPluginRaw[] = basename($sPath);
		}
	}else{
		$aPluginRaw = @array_map('trim', file($sPluginsListFile));
	}
	if($aPluginRaw)
	foreach($aPluginRaw as $sPlugin){
		$sPluginXML = "$sPluginsDir/$sPlugin/plugin.xml";
		if(is_file($sPluginXML)){
			$aPlugin[] = $sPlugin;
		}
	}
	return $aPlugin;
	
}


Давайте потестим и обсудим, насколько всё это полезно?

зыж. модифицированное ядро отлично работает на моей тестовой площадке livestreet.ochecho.ru/

Livestreet: дао разработчика - 2

Первая часть цикла

Дао — это действие, процесс, поток. Чем чаще вы смотрите на код других плагинов, тем больше вы понимаете, как делать свой.
Накачайте плагинов под 0.4.2 и расматривайте, что у них внутри. Без этого вы не сможете начать писать свои плагины.

Я сделал типовой шаблон, из которого удобно делать свои собственные плагины. Располагается он тут:
http://github.com/medar/livestreetplugin
Чтобы скачать его, надо нажать в правом верхнем углу кнопку «Download Source». Желающие могут форкать и вносить изменения.

В файле находится «рыба» плагина с названием abcplugin.
Читать дальше →

Livestreet: дао разработчика - 1

Я сейчас работаю над одним проектов, в качестве платформы для которого я выбрал Livestreet. Так как с инфой для программистов у этого движка туго, я буду выкладывать те вещи, который я узнал о движке здесь. Надеюсь, это поможет остальным начинающим программистам на LS.

Я работаю с движком всего несколько дней, поэтому что-то в описании может быть неточно или неполно. Не стесняйтесь поправлять.

Цель этого цикла — дать поверхностный, но глобальный взгляд на движок, чтобы снизить порог вхождений. Плюс собрать все актуальные (0.4.1 и выше) ссылки, относящиеся к разработке в одно место.

Итак.

Для начала стоит пробежаться по существующей документации для разработчика (http://trac.lsdev.ru/livestreet/wiki/DeveloperDoc), чтобы понимать термины.
Откройте в IDE движок, пробежитесь по папкам движка, по плагину page, который идет в комплекте с движком.

В движке Livestreet:
Экшены, содержащие Ивенты (action, events) — это, кто знаком с MVC — контроллеры.
Модули (module) — куски кода, которые осуществляют некий функционал (например, функционирование блогов, топиков, комментов). В процессе своей работы они обращаются к Мапперам (mapper) для того, чтобы пообщаться с базой данных. Все sql-запросы пишутся именно в мапперах. Мапперы в свою очередь используют Сущности (entity), которые переводят массивы, отданные mysql в объекты, с которыми потом работает движок.

Способ модификации кода Livestreet два.

1. Через переопределение существующих функций. Меняется целиком существующая функция в модуле/маппере/сущности, или добавляется своя. Подробно: livestreet.ru/blog/dev_documentation/4499.html

2. Через хуки. При этом вставляется код в указанное место движка.
Хуки можно вставить в места, определенные конструкцией $this->HookRun(...); в движке, а также на начало и конец любого модуля, зарегистрированного в системе (не важно, системный он, или установлен каким-то плагином). Подробно про хуки в моделях: livestreet.ru/blog/dev_documentation/3991.html.

Переопределения эти делаются в плагинах. Подробнее о плагинах и их устройстве: livestreet.ru/blog/dev_documentation/3531.html

Как делать эти самые плагины — подробно поговорим во второй части.

Вторая часть

Новые возможности по переопределению/наследованию классов LiveStreet

В LS появилась новая возможность для разработчиков плагинов — наследование классов. Идея была высказана еще avadim'ом здесь.
Эта возможность позволит удобно переопределять различные методы одного класса (модуля, экшена, сущности, маппера) разными плагинами без конфликтов.
Главное отличие от делегирование — не происходит блокировки переопределения класса для других плагинов. Также есть возможность переопределения одного метода разными плагинами, но здесь разработчикам нужно быть очень осторожными и делать так, чтоб свести вероятность конфликта к минимуму.

Как использовать.
Например, нужно переопределить метод получения пути до аватара у сущности пользователя в плагине Test. В плагине необходимо объявить те классы, которые будут наследоваться. Объявление происходит в свойстве $aInherits:
<?php
class PluginTest extends Plugin {
    
    protected $aInherits=array(
       'entity'  =>array('ModuleUser_EntityUser'=>'_ModuleSide_EntityUser')
    );

    public function Activate() {        
        return true;
    }
    
    public function Init() {        
    }
}
?>

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

Разработка модулей для LiveStreet

Давайте друзья будем разбераться с модулями и их созданием. На примере стандартного модуля «Pages» (Напомню он отвечает за статические страницы на сайте).
Перейдём в директорию \plugins\ здесь располагаются все подключаемые плагины. Движок сайта анализирует содержимое здешних папок (не будем вдаваться в подробности как именно).
Далее перейдём в папку \page\. Здесь мы видим следующий список файлов и папок:
PluginPage.class.phpЗдесь описано следующее:


if (!class_exists('Plugin')) {
	die('Hacking attemp!');
}
//Перевод строк выше выглядит так если не верно что является классом Плагин страница мертва. Если верно что это плагин, продолжаем работу. 
class PluginPage extends Plugin {
	
	/**
	 * Активация плагина "Статические страницы".
	 * Создание таблицы в базе данных при ее отсутствии.
	 */
	public function Activate() {		
		if (!$this->isTableExists('prefix_page')) {
			/**
			 * При активации выполняем SQL дамп
			 */
			$this->ExportSQL(dirname(__FILE__).'/dump.sql'); // -< Здесь видно зачем нужен файл базы данных dump.sql ПРи активации модуля выполняется запрос в базу. Запрос содержится как раз в этом файле. Имя его не столь важно... просто в нашем примере это dump.sql
		}
		return true;
	}
	
	/**
	 * Инициализация плагина
	 */
	public function Init() {
	
	}
}

plugin.xmlОписание плагина для таблицы модулей по адресу localhost/admin/plugins/ В нём содержится информация об авторе, краткая инфа о модуле и прочее...
dump.sqlФайл с SQL запросом на создание таблиц в бд. Используется при выполнении запроса активации в PluginPage.class.php
templates.dirПапка для шаблона модуля
classes.dirКлассы используемые в модуле берутся отсюда
config.dirНу и конфиги… это собственно очевидно

Для того чтобы написать свой первый модуль необходимо придумать дополнения для базы данных (уже используемой движком LS).После этого вы можете сделать экспорт добавленых вами таблиц в файл dump.sql.

Далее собственно работа с классами. Что есть это ютуб вам в помощь. Введя слово классы пхп там можно найти уйму учебного материала.

Некоторое описание стандартных возможностей движка:

На всех страницах принимаюхих любое участие (в любой иерархичности) в работе движка.
Проставлены следующие строки
if (!Условие) {
	die('Hacking attemp!');
}
важно что! обозначает «не выполнение». Используется для безопасности выполнения скриптов на сайте.

$this->ExportSQL(Путь); Выполнит указаный SQL запрос в базу.
$this->isTableExists(''); Проверка наличия таблицы.

$_REQUEST['page_title']=$oPageEdit->getTitle();
$_REQUEST['page_pid']=$oPageEdit->getPid();
$_REQUEST['page_url']=$oPageEdit->getUrl();
$_REQUEST['page_text']=$oPageEdit->getText();
$_REQUEST['page_seo_keywords']=$oPageEdit->getSeoKeywords();
$_REQUEST['page_seo_description']=$oPageEdit->getSeoDescription();
$_REQUEST['page_active']=$oPageEdit->getActive();	
$_REQUEST['page_id']=$oPageEdit->getId();


Регуесты оформляются с помощью базового набора функций get.

Модуль MultiType Blogs для LS 0.3.1 – как показывать рекламу в топиках

В статье Модуль MultiType Blogs для LS 0.3.1 – наиболее полное описание я рассказал о возможностях модуля, в т.ч. и возможности включать рекламные вставки в топики сайта. Но одного перечня рекламных возможностей явно недостаточно, поэтому я решил более подробно рассказать, как можно управлять рекламными вставками в топиках.

Заранее хочу извиниться, что букв много, но раз уж подробно, так подробно.

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