===================
PgSQL in SQLObject2Pg
===================
Наиболее интересным событием стала адаптация SQLObject2 для работы с
СУБД PostrgeSQL.
К сожалению, сделать универсальный SQLObject, который бы понимал PgSQL и MySQL
одновременно - пока-что не удалось (хотя со временем это получится). Поэтому,
был сделан fork SQLObject'a и назван SQLObject2Pg.
К сожалению, NDA не разрешает упоминать проект, в котором используется
SQLObject2Pg, но тем не менее, реальные примеры кода показать можно.
В первую очередь, нужно рассказать про особенности базы PostgreSQL. Из
принципиальных отличий (с точки зрения SQLObject) можно назвать:
1. нет понятия auto_increment для первичных ключей
2. соответственно, нет понятия LAST INSERT ID
Но в PgSQL есть фишка, которая после запроса INSERT позволяет сразу вернуть
данные полностью вставленной строки. То есть, у INSERT уже есть результат SELECT'a.
На данный момент SQLObjectSync для SQLObject2Pg не работает, поэтому
X-классы строятся только на основе уже существующих таблиц. Пример:
SQLObjectConfig::Initialize(dirname(__FILE__).'/db/');
// описываем структуру таблицы users
$table = SQLObjectConfig::Get()->addTable('core_users', 'XUser');
$table->addKey('user_id', 'primary');
// группы юзеров
$table = SQLObjectConfig::Get()->addTable('core_accesstypes', 'XUserGroup');
$table->addKey('accesstype_id', 'primary');
// ...
SQLObjectConfig::Get()->sync();
А дальше все как обычно, ничего не отличается :-)
===================
Способы организации системы переводов (v2)
===================
Внимание! Это частичный повтор с #wpp example day #1. Но в Engine поменялись
понятия ContentProcessor, поэтому привожу пример уже по новому стилю.
Существует много способов сделать проект мультиязычным: начиная от банальных
if-ов, и заканчивая более изощренными средствами типа gettext.
В большинстве случаев, все мультиязычие сводиться к такому:
1. определить "какой сейчас язык"
2. в зависимости от языка отправить во все шаблоны переведенные фразы.
На данный момент в Engine нет своего Translate Manager'a (хотя он
разрабатывается как отдельный пакет), и отправка фраз-переводов в контенты
выполняется на основе события beforeContentProcess или afterContentProcess в
Engine Events.
Пример задания и определения текущего языка (engine.config.php):
// задаем и настраиваем языки
$languagesArray = array('ru', 'en', 'es');
Engine::Get()->setLanguagesArray($languagesArray);
// по началу URL'a определяем язык
$url = Engine::GetURLParser()->getTotalURL();
foreach ($languagesArray as $language) {
if (preg_match("/^\/{$language}\//uis", $url)) {
Engine::Get()->setLanguage($language);
break;
}
}
// если язык не определен, то определяем его по браузеру
if (!Engine::Get()->getLanguage()) {
$language = @explode('-', $_SERVER['HTTP_ACCEPT_LANGUAGE'], 2);
$language = strtolower($language[0]);
if ($language != 'ru') {
$language = 'en';
}
Engine::Get()->setLanguage($language);
}
// система переводов (слушатель события)
class MyTransaleProcessor implements Engine_IEventObserver {
public function notify(Engine_Event $event) {
$contentObject = $event->getContent();
// в контент передаем все необходимые переводы
// можно загрузить их из базы/файла/т.д.
$contentObject->setValue($key, $value);
$contentObject->setValue($key, $value);
$contentObject->setValue($key, $value);
}
}
// подключаем слушатель события
Engine::GetEvents()->observe(
'beforeContentProcess',
new MyTransaleProcessor());
===================
JSPrototypeCalendar
===================
Календарики в UI - это вечная проблема для всех front-end разработчиков.
Сейчас в #wpp есть несколько пакетов, позволяющий очень быстро к существующему
input'у прицепить выпадающий календарик.
Один из самых простых и безглючных календариков - JSPrototypeCalendar.
Второй вариант - JSCalendarView (тоже на основе prototype).
Например, чтобы подключить JSPrototypeCalendar:
// локаль определяет язык календаря
PackageLoader::Get()->import('DateJS', 'ru-RU');
PackageLoader::Get()->import('JSPrototypeCalendar');
и дальше в html-коде:
<input type="text" id="id-cdate-from" ... />
<script type="text/javascript">
new Calendar('id-cdate-from');
</script>
Более подробные примеры подключения можно посмотреть в документации по
каждому пакету отдельно.
--
With best regards,
Maxim Miroshnichenko,
WebProduction, co-founder & technical director
http://webproduction.com.ua/
m...@webproduction.com.ua
Office:
off...@webproduction.com.ua
+38 (050) 447-95-30
+38 (0462) 61-42-61