-
Notifications
You must be signed in to change notification settings - Fork 26
JavaScript Notes
В системе используется Twitter Bootstrap, который позволяет достаточно быстро разрабатывать прототипы интерфейсов, идеально подходит для интерфейсов панели администратора.
Так же в системе используется RequireJS для организации AMD
Глобальных настроек нет
В довесок к Twiter Boostrap и RequireJS в системе есть еще несколько полезных вещей, о которых стоит помнить.
Ссылка с классом confirm
запросит подтверждение перехода по указанному URL, в качестве текста будет использоваться data-confirm
атрибут (либо сообщение по умолчанию Are you sure?
):
<a class="confirm" href="/cache/clean" data-confirm="Are you want clean the cache?">Clean cache!</a>
Ссылка с классом ajax
будет стучаться по указанному URL посредством XMLHttpRequest:
<a class="ajax" href="/ping">Click Me!</a>
Так же существуют следующие возможности:
- добавить данные для передачи на заданный URL используя
data
атрибуты (т.е.data-id="2"
эквивалентно?id=2
) - указать метод доставки, используя атрибут
data-ajax-method
, по умолчанию - POST - указать тип ожидаемых данных -
data-ajax-type
, по умолчанию - JSON - совместить с классом "confirm"
События:
-
ajax.bluz.success
- при удачном завершении AJAX запроса -
ajax.bluz.error
- при ошибке в AJAX запросе
<a id="ping" class="ajax confirm" href="/ping">Click Me!</a>
<script>
$('#ping')
.on('ajax.bluz.success', function() { console.log("OK") })
.on('ajax.bluz.error', function() { console.log("KO") });
</script>
Форма с классом ajax
будет отправлена посредством XMLHttpRequest по указанному в action
URL:
<form class="ajax" action="/save/" method="post">
...
</form>
Опции:
- указать метод доставки используя атрибут
method
, по умолчанию - GET - указать тип ожидаемых данных -
data-ajax-type
, по умолчанию - JSON
События:
-
ajax.bluz.success
- при удачном завершении AJAX запроса -
ajax.bluz.error
- при ошибке в AJAX запросе -
form.bluz.success
- при удачной отправки формы -
form.bluz.error
- при ошибке в отправке формы (вернулся ответ в котором естьerrors
), это возможно при проверке данных
Клик по элементу с классом load
подгружает HTML контент со страницы указанной в атрибуте href
или data-ajax-source
в элемент по селектору указанному в атрибуте data-ajax-target
(обязательный атрибут):
<button class="load" data-source="/get/five" data-ajax-target="#load">Five!</button>
<div id="load">...</load>
Опции:
- добавить данные для передачи на заданный URL используя
data
атрибуты - указать метод доставки -
data-ajax-method
События:
-
ajax.bluz.success
- при удачном завершении AJAX запроса -
ajax.bluz.error
- при ошибке в AJAX запросе
Элемент с классом dialog
открывает модальный диалог, контент которого в формате HTML будет доставлен посредством XMLHttpRequest:
<a class="dialog" href="/dialog">Click Me!</a>
Опции:
- добавить данные для передачи на заданный URL используя
data
атрибуты - указать метод доставки -
data-ajax-method
- задать стиль модального окна -
data-modal-style
События:
-
ajax.bluz.success
- при удачном завершении AJAX запроса -
ajax.bluz.error
- при ошибке в AJAX запросе -
shown.bluz.modal
- при наступлении событияshown.bs.modal
у созданного модального окна -
hidden.bluz.modal
- при наступлении событияhidden.bs.modal
у созданного модального окна
Автоматическая инициализация Tooltips для элементов с классом bluz-tooltip
:
<a href="#" class="bluz-tooltip" data-toggle="tooltip" title="User Role">Username</a>
Для ссылок с классом bluz-preview
, где href
указывает на полноразмерную картинку реализован просмотр картинок:
<a href="/uploads/123.jpg" class="thumbnail bluz-preview">
<img src="/uploads/123-small.jpg" class="img-polaroid"/>
</a>
Для картинок для img
с классом bluz-preview
, где data-preview
указывает на полноразмерную картинку:
<img src="/uploads/123-small.jpg" class="img-polaroid bluz-preview" data-preview="/uploads/123.jpg"/>
Со стороны сервера передача данных не требует от нас чего-либо экстраординарного:
<?php
return
function() use ($view) {
$view->test = 123;
}
Ответ будет содержать JSON объект:
{"test":123}
Стоит предостеречь разработчиков при создании универсального контроллера для обычных и
XMLHTTPRequest
- не стоит в таких контроллерах закидывать информацию во view as is. Приведу пример - вы закидываете$view->user = $userObject
- в HTML вы контролируете какие поля отображаете пользователям, а используя этот же код для ajax - нет.
Как и при работе с обычными контроллерами, мы можем использовать пакет Messages:
<?php
return
function() use ($view) {
$this->getMessages()->addNotice('Notice Text');
$this->getMessages()->addSuccess('Success Text');
$this->getMessages()->addError('Error Text');
}
В данном случае в ответ сервера будут добавлен заголовок Bluz-Notify
и все сообщения в JSON формате:
Bluz-Notify: {"error":["Error Text"],"success":["Success Text"],"notice":["Notice Text","Method POST"]}
Можно принудительно перезагрузить текущую страницу:
<?php
return
function() {
$this->reload():
}
За это будет отвечать заголовок Bluz-Reload
:
Bluz-Reload: true
Или отправить куда-нибудь:
<?php
return
function() {
$this->redirect("http://google.com"):
}
Заголовок Bluz-Redirect
:
Bluz-Redirect: http://google.com
Есть мысль перевесить управление с классов на data-spy
(по аналогии с Twitter Bootstrap)? Но тут я вижу сразу два недостатка, которые есть в самом Bootstrap:
- обработчики вешаются независимо на data-spy[scroll] и data-spy[affix]
- нет возможности использовать их одновременно для одного элемента
Думаю было бы правильно, чтобы был следующий функционал (где-то должен быть уже реализован, нутром чую), начну с HTML:
<div data-helper="ajax confirm"></div>
Далее должна быть регистрация хэлперов в JavaScript:
$.helper.register('ajax', { 'click': function(element){/*click logic*/} } );
$.helper.register('confirm', { 'click': function(element){/*click logic*/} } );
И собственно инициализация обработчика:
$(body).on('click.bluz.helper', '[data-bluz-helper]', function(){
var helpers = $(this).data('bluz-helper').split(' ');
var chain = null;
for (helperName in helpers) {
if ($.helper.isRegistered(helperName )) {
var helper = $.helper.get(helperName);
if (helper.click) {
chain = helper.click(this, chain); // or use apply?
if (false === chain) return;
}
}
}
});
Database standards
Requirements
Server
Notes
— HTML and CSS
— JavaScript
— Database
Modules
— ACL
— API
— Cache
— Categories
— Comments
— Media
— Options
— Pages
— System
— Tests
— Twitter
— Users