Удалить дефолтный блок sonata.admin.block.admin_list у SonataAdminBundle

При использовании SonataAdminBundle и SonataBlockBundle захотелось удалить дефолтный блок. 

Толку от него мало, он просто дублирует функционал бокового меню на дашборде.

При установке SonataBlockBundle, если мы просто напишем у конфигурации:

sonata_block:
    default_contexts: [sonata_page_bundle]
    blocks: []

(в будущем будем добавлять свои блоки, но для начала просто ставим пустой массив), то отловим ошибку.

Использование php-генераторов

Несмотря на то, что php-генераторы доступны с php 5.5.0, они все еще почти не используются. Более того, большинство разработчиков, которых я знаю, понимают, как работают генераторы, но не видят, когда они могут быть полезны в реальной жизни.

Да, генераторы определенно смотрятся хорошо, но знаете...  Я не понимаю, где они могут быть полезными для меня, разве что для расчета последовательности Фибоначчи.

И они не ошибаются, ведь даже примеры в php-документации слишком упрощены. Они только объясняют, как эффективно реализовать range или итерировать по строкам файла.

Но даже с этих простых пример мы можем понять ключевые преимущества использования генераторов: они просто упрощают итераторы.

Symfony Blog Bundle

HarentiusBlogBundle - бандл для  блога/простого портала (Или сложного, если с  наследованием бандлов и расширением). Движок этого сайта.

В качестве бэкенда используется SonataAdminBundle. Реализовано:

1. Админка (WYSIWYG, ckeditor), загрузка картинок, аудио, плеер.

2. Теги, категории, архивы, облако тегов

3. Статистика

4. RSS-feed (требует доработки)

5. "Умное" кэширование всего и вся, контент отдается очень быстро

Для "успокоения души" осталось:

1. Тесты

Итерация по периоду времени в php

Неоднократно приходилось работать на php со списком дат (по дням, к примеру) если есть начало и конец периода ($dateStart, $dateEnd). Например, для того, чтобы синхронизировать с бекендом рабочие/выходные дни для DatePicker из jQueryUi. Или, если нужно выводить отчеты по дням.

Предлагаю несколько вариантов решения этой задачи, как наиболее очевидным способом, так и более изящным (как мне показалось).

ru en

Symfony Widgets Bundle

Widgets Bundle - бандл для легкого управления виджетами, для отображения которых нужна только клиентская часть. Включает в себя функционал как клиентской, так и админ части (добавляет админ классы для SonataAdminBundle и зависим от нее). Можно использовать (к примеру) для добавления счетчиков, баннеров, кодов различных рекламных сетей (adsense и т.д.), при этом управляем всем в одном месте (админ панель).

Был написан во время разработки этого блога.

ru en

Caching Symfony controller

При разработке этого блога пришлось изобрести очередной велосипед - Caching Symfony controller. Но сначала о том, как вообще возникла подобная задача.

Например, у меня на сайдбаре есть список категорий, список архивов и теги. Если последние получить относительно просто (одна выборка), то категории и архивы сложнее. Для получения категорий нужно выбрать деревья (категории могут быть вложенными) и подзапросами получить количество заметок в категориях (довольно монстроузно получилось, посмотреть можно здесь). Для архивов нужно пройтись по всем заметкам и составить список годов/месяцев. Действия не слишком сложные, но все равно можно избавится от их выполнения на каждом запросе.

Pencil

Pencil - удобный open-source бесплатный инструмент прототипирования для создания mockup'ов. Подходит для создания любых пользовательских интерфейсов, но мы будем рассматривать создание веб интерфейсов.

Может быть установлен как плагин до firefox, либо как standalone приложение (в таком случае firefox у меня все равно поставился по зависимостях).

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

Разберемся с установкой и покажем пример использования.

Локализация числовых/денежных данных

При разработке более-менее крупного проекта возникает проблема с локализацией числовых/денежных данных. В этой заметке расскажу о мучениях при использовании Symfony framework, Sonata Admin Bundle и клиентской части. Но сначала о сути проблемы, так как на первый взгляд она не очень очевидная.

Итак, допустим у нас есть проект, который на стороне сервера (php/шаблонизатор) рендерит числовые/денежные данные. Они должны отображаться в соответствии с установленной локаллю. Пользователь может вводить данные (в своем представлении). При этом данные могут обрабатываться еще и на клиентской части (javascript). К примеру, в большинстве стран Европы, кроме Великобритании и Ирландии десятичный разделитель запятая, в Великобритании и Ирландии - точка. Естественно, что пользователь с Германии будет вводить данные с раздилителем - запятою.

Паттерны проектирования (Design patterns). Часть 1: Порождающие и структурные

О паттернах проектирования слышали все программисты. Хотя... Исходя из количества стебов над php-разработчиками и видя некоторые куски кода, возможно некоторые из них (php-шников) понятия не имеют, что это такое.

Поворот изображения на html5 canvas

Возможно, вы уже знаете что есть удобный метод canvas context drawImage:

context.drawImage(image, x, y);
где image - это DOM изображение (или другой canvas), x, y - левый верхний край изображения. Также там есть несколько опциональных параметров, но мы не будем их сегодня использовать.

Кастомизация формы входа (на примере FOSUserBundle)

Самый проcтой способ кастомизации формы входа FOSUserBundle - использовать механизм наследования бандлов. (С предположением, что в будущем придется модифицировать не только форму входа). Покажем пример такой кастомизации с использованием bootstrap.

Фикстуры. AliceBundle

В предыдущей заметке мы познакомились с фикстурами в Symfony framework, а также с DoctrineFixturesBundle. Хотелось бы сделать обзор еще одного полезного бандла для работы с фикстурами - AliceBundle (обертка вокруг компонента alice).

Фикстуры. DoctrineFixturesBundle

Фикстуры (англ. fixtures) - очень полезный инструмент для разработки. По сути, это просто набор тестовых данных, которые используются в dev-режиме. Для prod режима обычно не используются (для прода обычно используют Data Migrations).

Для работы с фикстурами в Symfony существует несколько удобных бандлов. Первый, базовый - DoctrineFixturesBundle, которому и посвящена эта заметка.

Configuration

При создании бандла,  который будет использоваться как библиотека (и не только), полезно будет его конфигурировать.

Конечно, можно все вынести в параметры, обойтись таким образом без конфигурации, но это будет некошерно. =)

Правильная практика описывать конфигурацию в config.yml, а часть необходимых параметров выносить в parameters.yml: