Микросовет банальный, про Views

Держите свои вьюхи в коде. Хук hook_views_default_views() — ваш лучший друг при работе с Views. Как только представление обрело нужные очертания — в код его, в код. Это легко, приятно и помогает от головных болей.

Так нельзя!

Топ-3 переводов, за которые уже давно пора бить.

officer — офицер
this country — эта страна

И конечно

We did it — мы сделали это

Фактически, три лакмусовые бумажки безграмотности.
Так, блин, нельзя!

AngularJS и $scope.$apply()

If you’ve written a non-trivial amount of code in AngularJS, you may have come across the $scope.$apply() method. On the surface, it may seem like just a method you call to get your bindings to update. But why does it exist? And when do you need to use it?
To really understand when to use $apply, it’s good to know exactly why we need to use it, so let’s dive in!
AngularJS and scope.$apply

Отличные разъяснения.

Laravel и AngularJS

Изучаю всякое про прогрессивные технологии. Нашел вот туториал, не сохранить невозможно — хорошо и доходчиво излагает человек.
Create a Laravel and Angular Single Page Comment Application

Почитать про Drupal 8

Drupal 8 in 2 Steps — примеры базовых вещей (создать страницу, переменную, темизировать что-то).
Changes in the Form API in Drupal 8 — об изменениях в Form API.
Drupal 8: Ajax in Forms — небольшой пример с аяксификацией формы.
Responding to Events in Drupal 8 — о событиях в Drupal 8 с шутками и Бэтменом.
Exploring the Cache API in Drupal 8 — про Cache API с простыми примерами.
Install Drush 7 for Drupal 8 without throwing away Drush 6 — памятка как поставить drush 7 рядом с drush 6.

Всё на английском.

Немного динамического раутинга в Drupal 7

В Друпале, как известно, адреса основных сущностей, таких как пользователи и материалы, имеют вид user/123 и node/123 соответственно (где 123 — это id сущности). Если мы хотим, например, сделать страницу со всеми фотографиями для каждого пользователя, то скорее всего мы сделаем ее с адресом вроде user/123/photos. Ну потому что надо же откуда-то id пользователя взять и загрузить все его фотографии. И этот адрес будет хорош всем кроме одного — пользователю непонятно, почему он, Василий Петрович Пупкин, называется «123». Пользователю конечно было бы удобнее видеть свои фотографии по адресу vasya/photos. То есть неплохо было бы решить проблему ЧПУ.

Обычно (для отдельных страниц) в Друпале эта проблема решается с помощью синонимов (path aliases), то есть каждой странице (user/123) ставится в соответствие уникальный адрес (vasya), и страница /user/123 становится доступной по адресу /vasya. А чтобы избежать дубликатов страниц (т.е. одинаковых страниц с разными адресами), делается автоматический редирект с оригинальной страницы на ее синоним: при заходе на страницу user/123 пользователя перенаправляет на страницу /vasya.

Однако в случае когда страница динамическая (все фотографии данного пользователя) — получается, что нужно для каждой страницы вида user/{uid}/photos завести свой синоним. И обновлять его, если обновится синоним для страницы пользователя. И удалять, если пользователь удалится. И добавлять, если пользователь добавится. В общем, мало того, что для каждого пользователя нам придется не один, а два синонима хранить. Так нам еще и CRUD для синонимов поддерживать понадобится. А что если мы хотим еще страницу с блогами пользователя, страницу с его друзьями? Или вообще, мы хотим страницу архива материалов адресом вида user/123/archive/2014/09?

Читать дальше про inbound/outbound_alter на NetSpark.Ru

Погонял немного OpenLucius

Всякие проекты для совместной онлайн-работы я давно люблю и изучаю. Раньше в NetSpark активно работали с OpenAtrium, потом по ряду причин перешли на Basecamp, которым по сей день и пользуемся.

Однако я периодически вижу, как появляется что-то новое коллаборационистское и мимо по-прежнему не прохожу: а ну как сделают что-то, что больше Бейзкэмпа понравится, да еще FOSS если? Сейчас вот попробовал OpenLucius. По факту могу сказать следующее:
 — Это Друпал. То есть можно доделать, улучшить и углубить всё своими руками. Это плюс.
 — Авторы явно вдохновляются удачными интерфейсными решениями Бейзкемпа. Это тоже плюс.

А главный минус — общая недоделанность. На орге в версии стоит слово beta, но чтобы полноценно работать, явно не хватает удобных мелочей. Таких например как аяксификация (которой почти нет) и уменьшение гигантских форм создания чего либо (которые бесили еще в опенатриуме). Таких как возможность создать список задач с клавиатуры, нажимая enter для добавления каждой следующей.

Итого: когда-нибудь может получиться удачный проект, особенно если судить по роадмэпу. Но сейчас желание посмотреть «а что тут еще есть хорошего» исчезает минут через 10 после установки. Продолжаем пользоваться бейзкэмпом.

Кстати, у опенатриума-то тоже много нового появилось с тех пор, как мы от него отказались. Надо посмотреть.

Лондон, январь 2015

В январе пришлось по заданию партии сгонять на недельку в Лондон. Нашлось время походить-посмотреть и немножко пофоткать. Большим фотоаппаратом решил себя не отягощать, а про существование маленького — напрочь забыл. Пришлось обходиться телефоном. К чему он, кстати, был не очень готов: одновременно фоткать все подряд, ходить в интернет и работать навигатором Samsung Galaxy Note 2 был согласен часов 8 без дозаряда. Поэтому некоторые фотокарточки пришлось и вовсе позаимствовать у товарищей.

Подробности осмотра Лондона — далее.

Entity API и пустое значение поля

Наверное, самая раздражающая вещь в Entity API изложена вот в этом комменте.

The problem is that you must set an empty value that is compatible with the data type of your field. If you do not, you will get an exception raised. Passing NULL or array() when a string is expected will therefore raise an error.
Another thing to keep in mind is that the data you pass will also depend on whether your field is a single value, a multi value field, or a field with multiple properties.

Пишешь себе, пишешь универсальный код с кучей разнородный полей, и вдруг вместо единообразного сброса поля хренак — и вылезает кучка дополнительных ветвлений.

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