+20.14
Рейтинг
47.18
Сила

Александр Зинчук

Прямой доступ к свойствам модели

Это здорово, что в версии 0.4.* появилась возможность автоматического доступа к полям модели из записи в БД, без постоянного прописывания get- и set-методов в файле *.entity.php.

Однако при попытке воспользоваться новым функционалом сразу столкнулся с проблемой:
Т.к. по логике, принятой в LS, все поля записываются в базе данных с префиксом (имя модели), то и автоматические геттеры теперь требуют имени модели.
Иначе говоря, если у нас есть модуль Test с таблицей prefix_test и полем в таблице test_name, то чтобы получить к нему доступ, нам нужно писать $oTest->getTestName() вместо привычного способа $oTest->getName(), который является логичным и удобным.

Я считаю, что необходимо ввести поддержку обоих вариантов, не только по причине неудобства варианта, который возможен сейчас, а еще и по более важной причине — совместимости.
Исторически в самом LiveStreet все методы были прописаны в *.entity.php и указывались без имени модели, например для блога — getDescription(), getTitle() и т.д., а никак не getBlogDescription() и getBlogTitle().

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

Предлагаю простой вариант, как исправить эту ошибку:
в /engine/classes/Entity.class.php, в методе __call()
после блока
if (isset($this->_aData[$sKey])) {					
  return $this->_aData[$sKey];
}
добавить блок
else {
  preg_match('/Entity([^_]+)/', get_class($this), $sModulePrefix);
  $sModulePrefix = strtolower($sModulePrefix[1]) .'_';
  if (isset($this->_aData[$sModulePrefix . $sKey])) {					
    return $this->_aData[$sModulePrefix . $sKey];
  }
}


На мой взгляд, это намного упростит и упорядочит работу с свойствами моделей.

Плагин "Афиша: События и Каталог мест" для LiveStreet 0.4.*

Друзья!

Наконец-то наступил долгожданный момент релиза нового плагина "Афиша: События и Каталог мест" для LS 4G :)

Для тех кто не в курсе, плагин реализован на основе одноименного модуля для LS 0.3.1.

Здесь вы можете изучить подробное описание функционала модуля, а тут — Демо-версия нового плагина.

Стоимость плагина на настоящий момент — 3400 руб., приобрести можно в каталоге LS.

Принимаются любые пожелания и предложения!

Модуль Афиша 2.0 для LiveStreet 0.3.1

В основном нововведения коснулись карт. А именно:

— Добавлена поддержка Яндекс.Карт, они же теперь используются по умолчанию
— Переход на новую версию Google Maps API v.3 (прошлая получила статус «deprecated»)
— На обоих API реализована поддержка геокодинга* (Geocoding), теперь точки на карте определяются автоматически, с использованием информации об адресах мест и событий
— Основные настройки перенесены из модуля Event в модуль Place, а функциональная часть из event.js в place.js
— Исправлен баг с картой при прокрутке страницы
— Во вкладке Новые Каталога мест теперь выводятся 10 последних добавленных мест с сортировкой по дате добавления.
— Избавились от необходимости изменений в некоторых системных файлах за счет использования хуков. Теперь установка стала проще.
— Почищен лишний код, оптимизированы межмодульные связи.
— Переписаны инструкция по установке и readme-файл
— Добавлено подробное описание всех config-параметров
— Добавлен diff-файл changeset.htm для ручной установки
— Полностью обновлен демо-сайт модуля «Афиша»

Все обновления, как всегда, бесплатны и доступны в svn для наших клиентов :)
Совсем скоро ждите релиз плагина Афиши для LS 0.4.1!


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

Аддон "Расписания" для модуля "Афиша"

Спустя больше полугода наконец-то дошли руки до разработки этого аддона, представляю Вашему вниманию бета-версию модуля "Расписания":

ls.ajaxy.ru

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


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

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

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

Итак, по порядку, что уже было:
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 — также с нетерпением ждем описания функционала кастомных модулей.

Новогодние сюрпризы: до 20.01.10 модуль "Афиша" по 2400 руб.

1) Объявляется предновогодняя акция на модуль «Афиша: События и Каталог мест» — до 13 января цена снижается с 3500 руб. до 2400 руб. Покупайте себе и дарите близким :))
2) Развитие модуля: в последнее время появилось большое количество ревизий в svn, в частности — модуль оптимизирован для поисковиков
— добавлена поддержка RSS
— возможность задания фильтрации по дате вида ?date=today|tomorrow|nextmonth и т.п.
— несколько мини багфиксов
В настоящее время продолжается развитие функционала.
3) В скором времени начнется работа над версией модуля для LiveStreet 0.4

«Афиша»:
livestreet.ru/addons/1
livestreet.ru/blog/pay/1906.html

Поздравляю всех с наступающим новым годом! :)

UPD:
Хорошая новость!
Акция продлевается ещё на 1 неделю, до 20.01.10
Спешите успеть ;)

у сервера отключена set_include_path. что можно сделать?

Столкнулся с такой проблемой — у хостера стоит Suhosin-patch, который, похоже, блокирует любые пути изменения значения include_path (set_include_path(), ini_set(), php_value в .htaccess).

Хостер предложил на уровне Апача прописать необходимые пути заранее.
Так как в LiveStreet этот метод используется повсеместно, не хотелось бы идти таким путём.
Есть ли какие-нибудь более универсальные методы решить проблему?

Префикс "Ls" у классов

Заметил, что в версии 0.3 появился префикс Ls у некоторых классов.

Это очень хорошо, т.к. например, в своем проекте я создал некое подобие API для интеграции базы LiveStreet с авторизацией в MediaWiki. В версии 0.2 мне приходилось задавать такой префикс для классов User, Block и Database. В 0.3 меня приятно порадовало наличие префикса у двух из них, однако класс Block по прежнему конфликтует с аналогичным у MediaWiki.

Мне кажется есть смысл добавить префиксы ко всем классам (а в идеале и к константам и т.п.).

установка в директорию (не в корень)

Возможно проблема уже поднималась, но LiveStreet не работает, если он установлен не в корне, а в какой либо директории сайта. Проблема в том, что Router.class.php считывает лишние данные (директорию движка) в качестве URL-запроса. По крайней мере у меня было так.

Мне кажется, надо заменить 78 строку в файле /classes/engine/Router.class.php на этот код:


    $aURLData = explode($_SERVER['HTTP_HOST'], DIR_WEB_ROOT);
    $sReqURI = str_replace($aURLData[1], '', $_SERVER['REQUEST_URI']);
    
    $sReq=preg_replace("/\/+/",'/',$sReqURI);


он вырезает из $_SERVER['REQUEST_URI'] путь к директории с движком.

Использование short tag в livestreet.

Добрый день.

Спасибо за движок.

Хотелось бы поинтересоваться, чем обусловлено использование short tags в движке?
Мне пришлось включать эту опцию в php.ini для сервера LightTPD…

Тем более разработчики PHP предлагают отказаться от этого метода.