#wpp example day #2

4 views
Skip to first unread message

Maxim Miroshnichenko

unread,
Jun 13, 2011, 11:15:33 AM6/13/11
to wp-pa...@googlegroups.com
===================
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

Reply all
Reply to author
Forward
0 new messages