Все записи категории ‘Программирование’

Валидация полей на примере параграфа в Drupal 11 с использованием @Constraint

 1 Авг, 2026

При разработке на Drupal рутинная необходимость это — добавление кастомной валидации для полей внутри сущностей. Стандартные средства Drupal (например, валидация через hook_form_alter) не всегда подходят, особенно когда нужно, чтобы валидация работала при любом способе сохранения сущности — через форму, REST API, JSON:API или миграции. Кроме того, в hook_form_alter сложно добраться до полей вложенных сущностей, как например, параграфы, чтобы подсветить ошибку именно там, где она произошла.

В этой статье мы рассмотрим, как добавить валидацию к полю внутри параграфа с использованием системы Constraints (ограничений) Drupal 11, например, чтобы она работала при редактировании node, в которой есть поле с параграфами.

В качестве примера мы проверим, что поле field_ticketland в параграфе типа afisha содержит корректный URL на сайт ticketland.ru.

Читать далее »

Как узнать количество строк в PostgreSQL без COUNT(*)

 27 Июл, 2026

В повседневной работе с PostgreSQL иной раз возникает задача оценить или узнать точное число строк в таблице. Классический способ — SELECT COUNT(*) FROM table — работает, но для больших таблиц он может быть медленным, поскольку выполняет полное сканирование таблицы или индекса. К счастью, есть альтернативные методы, которые либо дают мгновенный результат (пусть и приблизительный), либо позволяют оценить селективность сложного запроса без его фактического выполнения.

Читать далее »

Как правильно измерить длину строки в Java: от length() до графем

 23 Июл, 2026

Строки в Java кажутся простыми, из коробки поддерживается UTF-16, но стоит вам добавить эмодзи, и привычный length() выдаёт «магические» числа. В этой статье разберём, как на самом деле устроены строки в Java, почему эмодзи занимают два char, и как корректно подсчитать количество символов, видимых глазом.

Читать далее »

Получение списка SQL-запросов через Devel: отладка в нестандартных сценариях

 22 Июл, 2026

В процессе разработки на Drupal иногда возникает необходимость проанализировать, какие SQL-запросы выполняются при обработке того или иного запроса. Стандартный интерфейс Devel (например, панель внизу страницы) отлично справляется с этой задачей для обычных HTML-страниц.

Однако, что делать, если мы имеем дело с AJAX-запросом, загрузкой файла через file_transfer() или другими нестандартными точками входа, где стандартный вывод недоступен? В этой статье мы рассмотрим программный способ получения лога запросов с помощью API модуля Devel, который работает в любом контексте.

Читать далее »

Получить список прав определенной роли

 19 Июн, 2026

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

Читать далее »

Выполнение действий после сохранения ноды – обход стандартных ограничений

 22 Май, 2026

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

Читать далее »

Шпаргалка: извлечь текст из поля bytea (binary) в PostgreSQL

 6 Май, 2026

Cитуация: поле в таблице имеет тип bytea (бинарные данные), но вы точно знаете, что внутри него хранится обычный текст (например, из-за ошибки проектирования или legacy-системы).

Читать далее »

Как обновить ветку в Git без переключения на неё

 1 Май, 2026

Предположим, вы работаете в ветке feature, а коллеги обновили master. Вам нужно подтянуть свежие изменения в локальный master, но не хочется терять контекст и переключаться туда-обратно. Стандартный git pull работает только с текущей веткой. Что делать?

Читать далее »

Как обновить базовую ветку фичи: кейс с rebase

 23 Апр, 2026

В командной разработке на Git регулярно возникает ситуация: вы работаете над фичей в ветке feature/xxx, ответвившись от master. Пока вы пишете код, коллеги успевают задеплоить в master несколько других фич, которые не пересекаются с вашей, но вносят изменения в общий код (например, исправляют баги, добавляют утилиты, меняют конфигурацию). Ваша задача — обновить свою ветку так, чтобы она включила эти “чужие” изменения, но при этом не тащила в историю лишние merge-коммиты и не смешивала логику. Идеальное решение — git pull origin master --rebase. Разберём этот кейс подробно.

Читать далее »

CSS-префиксер для изоляции стилей: добавляем класс-обёртку ко всем правилам

 20 Апр, 2026

При разработке крупных проектов или интеграции готовых UI-библиотек часто возникает проблема конфликта имён CSS-классов. Стили одной библиотеки могут неожиданно повлиять на элементы другой, даже если вы старались использовать уникальные имена. Обычно эту проблему решают через CSS Modules или Scoped CSS.

Читать далее »