Category Archives: Programming
Новое в PHP 5.4 — трейты (traits)
Вкратце: трейт (аналог mixin в Ruby) — возможность в классе использовать функционал нескольких классов в обход традиционного наследования (по-моему, костыль, чтобы не реализовывать множественное наследование). Всё сводится к новой инструкции use внутри класса, при этом класс, функциональность которого нужно подмешивать. объявляется инструкцией trait.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
trait Singleton { public static function getInstance() { ... } } class A { use Singleton; // ... } class B extends ArrayObject { use Singleton; // ... } // Singleton method is now available for both classes A::getInstance(); B::getInstance(); |
Подробнее: New to PHP 5.4: Traits
Паттерны проектирования на PHP
http://css.dzone.com/books/practical-php-patterns
Использование Twitter-API в PHP
Есть такая библиотека — twitter-async (лицензия — свободное распространение и использование). Из неё нужно включить в проект файлы EpiCurl EpiOAuth EpiSequence EpiTwitter Далее на twitter.com нужно завести приложение. После успешной регистрации Twitter выдаст полезные данные для oAuth-авторизации, нужны из них два: Consumer key и Consumer secret — это авторизационные данные приложения, их нужно сохранить где-нибудь, …
Локализация javascript в django
Продолжение записи Интернационализация и локализация django. Для перевода яваскрипта нужно В urls.py добавить урл для подгрузки функций интернационализации
1 |
url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', {'packages': ('my_project',),}) |
словарь packages должен содержать один из пакетов, указанных в INSTALLED_APPS. Добавить в шаблон подгрузку это скрипта
1 |
<script type="text/javascript" src="/jsi18n/"></script> |
В нужных местах воспользоваться функциями gettext, ngettext или interpolate Создаём файл с переводами для js командой
1 |
django-admin makemessages -d djangojs -l ru |
Добавляем перевод …
Интернационализация и локализация django
На примере русского языка.
Factory-метод модели Django
Никак не мог придумать, как озаглавить статью). Просто есть две вещи, которые хотел упомянуть. Создаём метод класса, возвращающий модели класса, который может вернуть и только указанные поля всех удовлетворяющих условиям моделей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from django.db import models from django.contrib.auth.models import User from django.db.models import Q class Exercise( models.Model ): name = models.CharField( max_length = 255 ) is_paired = models.BooleanField( default = False ) user = models.ForeignKey( User, blank = True, null = True ) @classmethod def getExercisesForUser(cls, User, Fields = ()): query = cls.objects.filter(Q(user = None) | Q(user = User)) if Fields: query = query.only(*Fields) return query |
Здесь нужно выделить два важных момента:
1 |
cls.objects.filter(Q(user = None) | Q(user = User)) |
Здесь создаётся фильтр моделей, созданных конкретным пользователем или не относящимся ни к какому пользователю. Подробнее о …
jQuery — обработка событий с использованием Namespaced Events
Часто события навешиваются на элементы так:
1 |
$('.class').bind('click', function(){}); |
А когда нужно снять обработчик события с элемента, то делается это так:
1 |
$('.class').unbind('click'); |
При этом слетят все обработчики события click с элемента. Можно снимать только конкретный обработчик, но это не очень удобно. Гораздо удобнее группировать обработчики в неймспэйсы по функциональности, а потом снимать обработчики всего неймспэйса:
1 2 3 4 |
$('.class').bind('click.namespace', function(){}); $('.class').bind('click.namespace', function(){}); $('.class').trigger('click.namespace'); $('.class').unbind('click.namespace'); |
При …
Передача параметров с сервера к jQuery. Продвинутый способ.
Старый способ передачи параметров с сервер-сайда на клиент-сайд для jQuery обычно выглядел так:
1 |
<div class="my-class" property1="prop1-value" property2="prop2-value">текст</div> |
Потом в скрипте можно было обращаться к свойствам DOM-элемента
1 |
var property1Initial = $( ".my-class" ).attr( "property1" ); |
Есть более интересный способ, использующий jQuery data:
1 |
<div class="my-class" data-property1="prop1-value" data-property2="prop2-value">текст</div> |
В скрипте можно обратиться к этим свойствам так:
1 |
var property1Initial = $( ".my-class" ).data().property1; |
Сброс очереди анимации на элементе в jquery
Если нужно срочно прекратить анимацию (к примеру, как результат выполнения ajax-запроса), а она всё продолжается, то нужно сделать так:
1 |
$el.queue("fx", []); |
Такое может быть, когда на элементе есть сложная анимация, связанная с отображением элемента, а по результату ajax-запроса элемент нужно скрыть. Подробно об очередях — на сайте jquery
Вложенные формсеты в Django
Задача стояла следующая: сделать карточку создания-редактирования тренировки, которое состоит из упражнений, каждое из которых состоит из подходов. При этом должна быть возможность создавать тренировку по шаблону, при этом должны выводиться формы упражнений с предзаполненными данными, а также пустые определённого количества форм для ввода подходов (количество задаётся в шаблоне). Также должна сохраниться валидация всех форм, невозможность …