#wpp example day #1

9 views
Skip to first unread message

Maxim Miroshnichenko

unread,
May 16, 2011, 9:01:22 AM5/16/11
to wp-pa...@googlegroups.com
Добрый день всем!

Example Day - начиная с сегодняшнего дня и с интервалом +4 недели будут публиковаться примеры работ с #wpp с краткими рассказами "как и чего", также ссылки на другие статьи, анонсы и туториалы.

Затрагивать можем и будем все: собственные #wpp пакеты, сторонние пакеты типа prototype, jquery, которые тоже присутствуют в репозитории #wpp.

===================
Система переводов на flamesgroup.com
===================

Основная фишка сайта в со стороны программирования - это система переводов.
Я планировал, что успею сделать специальный пакет TranslationAPI или EngineTranslate, но с ним немного не вложился по времени, поэтому сегодня решение несколько иное.

Особенности мультиязычности:

1. все URL имею вид /{engine-language}/url…

Пример:
<content id="index">
<url>/index.html</url>
<url>/{engine-language}/antrax/</url>
<filehtml>index.html</filehtml>
<filejs>index.js</filejs>
<filephp>index.php</filephp>

Примечание: Engine автоматически умеет оперировать переменной engine-language в URLах.

2. язык определяется в engine.config.php:

// задаем и настраиваем языки
$languagesArray = array('ru', 'en', 'es');
Engine::Get()->setLanguagesArray($languagesArray);
$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);
}

3. Все переводы автоматически загружаются из БД и assignятся во все контенты сразу. В случае, если на сайте авторизован админ, то в конец ко всем переводам-переменным дописывается тег-ссылка <sup>. При клике на эту ссылку выполняется переход в админку на редактирование перевода.

В engine.config.php сделан специальный TranslateProcessor:

class FlamesGroup_TransaleProcessor implements Engine_IContentProcessor {

public function processBefore(Engine_Class $contentObject) {
foreach ($this->_contentsArray as $key => $content) {
try {
if ($content['noedit'] || !$this->_user) {
throw new Exception();
}
// если есть пользователь - то добавляем везде значки редактирования
$translate = ' <sup id="translate-'.$key.'">[edit]</sup>';
} catch (Exception $e) {
$translate = '';
}

$contentObject->setValue($key, $content['content'].$translate);
}
}

public function processAfter(Engine_Class $contentObject) {

}

public function __construct() {
// загружаем все переводы в переменную contentsArray, загружаем текущего юзера в user…
$this->_contentsArray = …
$this->_user = …
}

private $_contentsArray = array();

private $_user;

}

// регистрируем контент-процессор
Engine::GetContentDriver()->addContentProcessor(new FlamesGroup_TransaleProcessor());


и кусочек JavaScript'a (на jQuery!), которым ловятся все теги <sup>:

$(document).ready(function() {
$('sup').click(function(e) {
window.open('/admin/'+e.target.id+'/' ,e.target.id, "menubar=no,width=640,height=480,toolbar=no,scrollbars=yes,statusbar=yes");

// return false to prevent normal browser submit and page navigation
return false;
});
});


===================
Баннерокрутилка на http://ramirent.ua/
(и она же на http://intermobil.webproduction.com.ua/)
===================

На практике - это очень простое решение.
Пакет #wpp - JSCarousel (зависит от JSPrototype).

Разобраться можно по коду ramirent.ua или intermobil.com.ua, или по документации http://www.victorstanciu.ro/prototype-plugin-carousel/

<script type="text/javascript">
document.observe('dom:loaded', function() {
new JSCarousel(
$('carousel'),
$('images').select('a'),
false,
{
duration: 0.4,
circular: true,
auto: true
}
);
});
</script>

где carousel - это глобальный div карусели,
$('images').select('a') - селектор, по которому должны выбраться все элементы, которые должны крутиться.

P.S.: разработчик пакета Carousel не так давно анонсировал новую версию PrototypeCarousel. На данный момент она уже есть в #wpp branches/JSPrototypeCarousel, но еще не проверена.

===================

Всем спасибо за внимание!
Буду рад услышать отзывы, критику, пожелания.

--
С уважением,
Максим Мирошниченко,
студия WebProduction.

www: http://webproduction.com.ua/
email: m...@webproduction.com.ua
office: off...@webproduction.com.ua
tel. 1: +38 (050) 447-95-30
tel. 2: +38 (0462) 61-42-61

Reply all
Reply to author
Forward
0 new messages