Поддержка токенов для своей сущности в Drupal

Сегодня мы поговорим о том, как сделать поддержку токенов для своей сущности. Как и в случае с предыдущим уроком, в котором я рассказывал как связать свою сущность с Views, у нас будет два способа решения данной задачи, один - с помощью модуля Entity API, второй - самописный код.

Способ 1

Данный способ очень прост, включаем модуль Entity tokens, который входит в комплект Entity API и поддержка токенов обеспечена.

Способ 2

Первым делом имплементируем хук hook_token_info():

/**
 * Implements hook_token_info().
 */
function product_token_info() {
  // Описываем новый тип токена.
  $...
Benya

Как связать сущность с модулем Views в Drupal

В предыдущем уроке я рассказал как создать свою сущность. Сегодня я покажу, как связать сущность с модулем Views. Не забываем скачать его, если еще не сделали этого. Для решения данной задачи существует два способа и сейчас мы их рассмотрим.

Способ 1

Сразу отмечу, что данный способ подходит только если сущность была создана с помощью модуля Entity API. В хуке hook_entity_info() для нашей сущности устанавливаем views controller class:

'views controller class' => 'EntityDefaultViewsController'

Хук стал выглядеть следующим образом:

/**
 * Implements hook_entity_info().
 */
function...
Benya

Как создать сущность в Drupal

В сегодняшнем уроке я расскажу, как написать свою сущность. Писать мы будем с применением модуля Entity API, поэтому нам необходимо скачать и установить этот модуль. Для примера, создадим сущность product. Файловая структура модуля у меня получилась такая:

  • product
    • product.info
    • product.install
    • product.module
    • product.pages.inc
    • product.admin.inc
    • js
      • product-fieldset-summaries.js
    • templates
      • product.tpl.php

1. Создаем информацию об модуле в product.info:

name = Product
description = Defines the product entity and associated features.
core = 7.x
dependencies[] = entity

2. В product....

Benya

Как использовать db_merge в Drupal

В Drupal, db_merge представляет собой сочетание Insert запроса и Update запроса. Если в таблице существует запись с заданным первичным ключом, то выполняется Update запрос, если нет - Insert запрос.

Простое слияние

db_merge('example')
  ->key(array('id' => $id))
  ->fields(array(
    'field_1' => $value_1,
    'field_2' => $value_2,
  ))
  ->execute();

В этом примере, мы выполняем запрос на примере таблицы "example". Мы указываем ключевое поле "id" со значением $id (->key(array('id' => $id))). Затем мы указываем массив со значениями полей:

->fields(array(
  'field_1' => $value_1...
Benya

Как загрузить сущность по значениям ее полей

В Drupal существует класс EntityFieldQuery, который позволяет получить сущность по значениям ее полей.

Пример использования

$query = new EntityFieldQuery();
// В качестве первого параметра допустимо передавать следующие значения:
// 'entity_type', 'bundle', 'revision_id' или 'entity_id'.
$query->entityCondition('entity_type', 'node');
// В качестве первого параметра допустимо передавать название колонки таблицы, 
// которая описана в hook_schema() в базовой таблице сущности.
$query->propertyCondition('type', 'article');
// В качестве первого параметра передаем название филда, в...
Benya

DrupalCampCIS'13 Drupal Commerce + ЯндексМаркет

Мой первый доклад, с которым я выступал на Друпал Кемп СНГ, прошедшим 24-25 августа. В своем докладе я попытался охватить и рассказать о возможностях Drupal Comemrce.

Benya

Как закрыть на обслуживание только часть сайта

Пример, как закрыть на обслуживание только часть сайта, например ноды определенного типа. Создаем свой модуль, и внутри файла module_name.module имплементируем хук hook_menu_site_status_alter:

/**
 * Implements hook_menu_site_status_alter()
 */
function example_menu_site_status_alter(&$menu_site_status, $path) {
  if ($node = menu_get_object()) {
    if ($node->type == 'article') {
      // Если пользователь имеет разрешение использовать сайт в режиме обслуживания,
      // то показываем ему сообщение, что сайт в режиме обсуживания, иначе меняем статус на "оффлайн".
      if (...
Benya

Большие цены в Drupal Commerce

В Drupal Commerce имеется одна неприятная особенность, с которой может столкнуться каждый. Проблема заключается в том, что в базе данных у цен размер равен int(11). Но существует ряд стран, например Беларусь, где цена 30 000 000.00 и больше - вполне нормальное явление. И тут начинаются проблемы, при попытке оформить заказ с такой ценой - система безотказно будет информировать нас о том, что цена выходит за границы размера поля.

Чтобы исправить эту проблему, имплементируем хук hook_field_create_field():

<?php

/**
 * Implements hook_field_create_field().
 */
function...
Benya