суббота, 29 сентября 2012 г.

Codeigniter Bootstrap Pagination

Twitter Bootstrap стал безумно популярным фронт-энд фреймворком. Всё чаще и чаще слышу от клиентов, хочу «бутстрэп» (хотя они до конца сами не понимают что это), это больше дань моде, ну это такое. В этой статье хочу рассказать, как адаптировать стандартый pagination класс CodeIgniter-а под новомодный Bootstrap style.

Я находил много решений, вплоть до кастомного MY_Pagination класса для стилизации Bootstrap под CI, каждый ухитряется, как может. Но, я полагаю, это не лучший выход. Вы лишаетесь гибкости, перекрывая нативный класс пагинации кодигнайтера, если выходит новая версия CodeIgniter обновился класс Pagination, то прийдётся заново его адаптировать и искать что изменилось.

Гораздо более удобный способ, это через конфигурацию самого Pagination навесить все необходимые стили и изменить только «обвёртку» для стандартных элементов интерфейса. Сделать это легко. Создаём в папке application/config/ файл с именем pagination.php. В этот файл дописываем следующий конфиг для Pagination Class:

/* twitter bootstrap overrides */
$config['full_tag_open'] = '<div class="pagination pagination-centered"><ul>';
$config['full_tag_close'] = '</ul></div><!--/pagination-->';

$config['first_link'] = '&laquo; First';
$config['first_tag_open'] = '<li class="prev page">';
$config['first_tag_close'] = '</li>';

$config['last_link'] = 'Last &raquo;';
$config['last_tag_open'] = '<li class="next page">';
$config['last_tag_close'] = '</li>';

$config['next_link'] = 'Next &rarr;';
$config['next_tag_open'] = '<li class="next page">';
$config['next_tag_close'] = '</li>';

$config['prev_link'] = '&larr; Previous';
$config['prev_tag_open'] = '<li class="prev page">';
$config['prev_tag_close'] = '</li>';

$config['cur_tag_open'] = '<li class="active"><a href="">';
$config['cur_tag_close'] = '</a></li>';

$config['num_tag_open'] = '<li class="page">';
$config['num_tag_close'] = '</li>';
/* END twitter bootstrap overrides */

Ну и финальный штрих, это подгрузить наш конфигурационный файл в место, где происходит инициализация pagination в самом контроллере, например:


$this->config->load('pagination', TRUE);
$config = array_merge($this->config->item('pagination'), Array(
  'base_url'   => site_url('items/'),
  'total_rows'  => $total,
  'per_page'   => 10,
  'uri_segment'  => 2
  ));
$this->load->library('pagination');
$this->pagination->initialize($config);

Всё, теперь в любом месте, где вы будете рендерить элементы для постраничной навигации, будет выводиться Codeigniter Bootstrap Pagination. Приведеный выше пример гарантированно рабочий и отлаженный, работает на версии CodeIgniter Framework 2.1.2 и Twitter Bootstrap Version 2.1.1.

понедельник, 9 июля 2012 г.

Задержка события ready и особенности работы jQuery.holdReady()

jQuery.holdReady() появился c версии v.1.6 и позволяет отложить выполнение события ready. Наиболее часто используется для того чтобы задержать событие ready, в случае динамической загрузки скриптов (или плагинов jQuery).

Простейший пример использования:

$.holdReady(true);
$.getScript("myplugin.js", function() {
$.holdReady(false);
});

Вроде как всё лаконично и можно использовать, но не тут-то было. У него есть одна неприятная особенность: jQuery.holdReady() не будет иметь никакого эффекта, если перед этим уже произошло ready event.


Что это означает на практике? – Если мы попытаемся сделать динамическую загрузку дополнительных JavaScript файлов, к примеру ajax-ом после того как страница уже была загружена, и хотели бы придержать использование методов и объектов JS-плагинов, до полной загрузки необходимых файлов, то holdReady() не отработает вообще.

Выходом из ситуации, когда нужно подождать пока не инициализируются все объекты, а использование jQuery.holdReady() уже невозможно после наступления ready event-а может быть:
1. использование callback вызовов после успешной ajax-загрузки и только тогда использовать сами загруженные объекты;
2. Сделать периодический опрос по таймеру (setTimeout), пока объявляемая функция или объект не станут доступными.

понедельник, 28 ноября 2011 г.

Which is correct: "bare" or "bear"?

Забавная переписка была недавно с англоговорящим клиентом. Из-за очередной задержки со стороны клиента, он мне приносил извинения и прозвучала фраза наподобие:

... We are finalizing a UI person and hence the delay. Please bare with us ...

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

Так вот, как же всё-таки правильно надо было написать "bare" или "bear"? У обоих слов совершенно разные значения:
1. у слова bare значение "неприкрытый", "голый";
2. а слово bear – переносить/перевозить, выдерживать нагрузку, терпеть.

Таким образом, оборот вида "Bear with me" будет означать "потерпите немного", в то время как "Bare with me" будет к кому-то просьбой раздеться :-)

Правильным примером употребления, в нашем случае, могло бы стать предложение вида:

Please bear with us while we remodel our store.

конечно, если вы не преследуете цель предложить клиенту полностью раздеться и смотреть как вы работаете.

воскресенье, 23 октября 2011 г.

MySQL Replace Substring with Another String

В последнее время, часто начали задавать вопрос, как заменить подстроку в строке в MySQL во всей таблице и напрочь отказываются посмотреть в мануал.
Для того чтобы найти часть оригинальной строки и заменить её другой подстрокой в SQL запросах в MySQL применяется функция REPLACE(). Простейший запрос на поиск и обновление записей во всей таблице примет вид:

UPDATE [table_name] SET [field_name] = REPLACE([field_name],'[string_to_find]','[string_to_replace]');

Например, если ваш блог на WordPress переместился в директорию на уровень ниже или на другой домен, то для замены/обновления permalinks в WordPress нужен простой MySQL запрос на update:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.oldsite.com/blog', 'http://newsite.com');

вторник, 26 апреля 2011 г.

Disabling arrow keys at Fancybox (отменить перехват курсорных клавиш в Fancybox)

Используя замечательный плагин Fancybox для jQuery, натолкнулся на один очень неприятный момент. При использовании его, например, в совокупности с элементами формы input или textarea невозможно было перемещаться внутри этих элементов влево и вправо, используя курсорные клавиши. Происходило это по причине перехвата событий от клавиш-стрелок (keycodes 37 и 39) функцией навигации в плагине Fancybox. Оказалось, что простой опции отключить навигацию курсорными клавишами в этом плагине нет, пришлось хучить.

Чтобы обойти дефолтное поведение, решил создать дополнительную переменную в конфиге, и подправить функцию навигации плагина.

Для начала я добавил новую переменную в файл, где хранились дефолтные значения оцпий для Fancybox, назвал её disableNavButtons:

$.fn.fancybox.defaults = {
 ...
 disableNavButtons : true,
 ...
};

Затем, пропатчил функцию fancybox_set_navigation, в условных выражениях добавил обработчики на проверку равен ли e.keycode 37 или 39 и при этом currentOpts.disableNavButtons выставлено в false. И если условие выполняется, то переназначить действия для левой и правой курсорных клавиш.

function fancybox_set_navigation() {
  $(document).unbind('keydown.fb').bind('keydown.fb', function(e) {
    if (e.keyCode == 27 && currentOpts.enableEscapeButton) {
      e.preventDefault();
      $.fancybox.close();
    
    } else if (e.keyCode == 37 && !currentOpts.disableNavButtons) {
      e.preventDefault();
      $.fancybox.prev();
    
    } else if (e.keyCode == 39 && !currentOpts.disableNavButtons) {
      e.preventDefault();
      $.fancybox.next();
    }
    ...

вторник, 29 марта 2011 г.

Про что директора не говорят своим менеджерам

Что-то, меня, уже в какой раз, потянуло на чтение мыслей по управлению процессами, проходящими в IT-компаниях...  Попались на глаза, и решил перепечатать у себя в блоге, тезисы из книги "Чёрная книга менеджера" Панкратова В.

В первую очередь это отличный личный мотиватор, я нарочно не привожу никаких линков на его ресурс, так как это не реклама, кому нужно — сможет найти самостоятельно.

  1. Работа. Если ты сказал, что что-то невозможно, а потом сделал – кого волнует, что ты скажешь в следующий раз? Дела не делаются у одних и тех же людей, независимо от компании или проекта. Когда понимаешь, что ошибся, нормальному человеку хочется делать ещё и ещё. “Сделал или не сделал” не имеет никакого отношения к “знал или не знал”.
  2. Опыт. Ты чего-то стоишь, пока ты в этой конторе, а за ее пределами ты снова идешь искать работу, чтобы продать свои навыки и продолжать верить в иллюзию, что твои навыки ценны сами по себе. Твой навык не самостоятелен, на рынке он будет конвертироваться в бабло, только если кто-то даст тебе проект, заказчика и людей.
  3. Деньги. Если тебя от бизнеса нужны только бабки и в голове у тебя только “дай”, то откуда у меня будет по отношению к тебе хоть полграмма уважения? С чего ты тогда удивляешься, что получая прибавку к зарплате, ты автоматически продвигаешься в очереди на увольнение? Если человек самостоятельно делает хотя бы 80% поставленных ему задач, значит мы ему платим среднюю ЗП по рынку. Если около 100% – то платим выше рынка и думаем, как его голову приложить еще. Если человек делает все на автомате, его надо заменить кем-то попроще и включить его голову туда, где не хватает головы.
  4. Люди. У твоего сотрудника есть вещи поважнее тебя и твоих планов.
  5. Мотивация. Как твои люди будут относиться к делу, к компании, к Заказчику и друг-другу если ты им талдычишь что вокруг все плохо и все полные урюки? Откуда у твоих людей возьмется мотивация что-то делать, если ты сам этого не хочешь? Если человек не делает, его надо учить, если не помогает – тогда лечить, если все равно не помогает – тогда мочить. Увольнять и идти дальше, даже урезанным составом. Пусть работает трое, чем не работает четверо.
  6. Время. Приходить вовремя – это такой знак уважения. Уважения, к которому ты не привык, потому что еще сам не стоишь ничего, а демонстрируя неуважение, ты дешевеешь прямо на глазах. Как менеджер, трать время на управление людьми, а не на исследование технологий и т.п., ибо: а) тебе платят не за это; б) ты всё равно не станешь лучше своих подчинённых, которые занимаются работой в режиме нон-стоп.
  7. Опоздания. Перезванивай, если опаздываешь. Предупреждай, если сроки проекта сдвигаются. У заказчика тоже могут быть планы, он может терять реальные деньги или с трудом построенную репутацию, которая может стоить дороже, чем весь твой отдел с потрохами.
  8. Уважение. Если ты не уважаешь, значит ты еще сам не заработал и не испытал уважения. С такими не договариваются, таким просто говорят что надо делать. Нервный, это тот, кто кричит на своего шефа, а тот кто кричит на подчиненных, тот просто хам. Самые серьезные вещи говорятся тихо и спокойно. Да, иногда не теми словами, но очень спокойно. Уважение к заказчику строится на том простом факте, что нам он платит бабки, которые уже успел заработать сам.
  9. Проблемы. Решая вопрос, решай проблему, а не человека. Любая задача решается множеством способов, если только ты не дотянул ее до проблемы и не решаешь свои комплексы, вместо того, чтобы делать дело с помощью тех умных и талантливых людей, которые тебе доверил бизнес, надеясь что ты сможешь или научишся делать дело.
     

Такая словесная шоковая терапия, в первую очередь неплохо прочищает мысли и чакры. Как сказал автор в предисловии, "Эта книга — неприятная прививка от заносчивости и звезд в глазах, которыми иногда болеем мы как ИТ-шники...".

True

четверг, 3 марта 2011 г.

Совещения - реальная альтернатива работе

Совещания - реальная альтернатива работе... наверно, так лучше начинать все рассказы о всякого рода гибких методологиях разработки программного обеспечения, а не со слов:

Гибкая методология разработки (англ. Agile software development) — это концептуальный каркас, в рамках которого выполняется разработка программного обеспечения...

Основные идеи, которые продвигает agile методология, можно свести к следующим пунктам:

  • Личности и их взаимодействия важнее, чем процессы и инструменты;
  • Работающее программное обеспечение важнее, чем полная документация;
  • Сотрудничество с заказчиком важнее, чем контрактные обязательства;
  • Реакция на изменения важнее, чем следование плану.

Ну как такое может работать в типичной команде разработчиков?! Где каждый ленится написать строчку кода, добавить комментарий к функции или задокументировать сложную логику, продумать тест-кейсы... Сразу хочется распечатать и повесить весёлый плакат, замечательно иллюстрирующий это:

Сильный тимлид, профессиональная команда разработчиков, жёсткая система менеджмента, адекватное планирование и тщательное QA - вот залог качественного программного продукта на выходе.

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting