Переопределение классов Entity Drupal7

Необходимо дописать и кастомизировать базовый вывод како-то либо сущности.

Решение

Объявим схему для наших данных в бд
/**
* Implements hook_schema().
*/
function mymodule_schema() {

$schema = array();

$schema['demo_projects'] = array(
'description' => 'The base table for the Project entity',
'fields' => array(
'id' => array(
'description' => 'Primary key of the Project entity',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'name' => array(
'description' => 'Project name.',
'type' => 'varchar',
'length' => 255,
'not null' => FALSE,
),
'description' => array(
'description' => 'Project description.',
'type' => 'text',
'size' => 'big',
'not null' => FALSE,
'default' => NULL
),
'deadline' => array(
'description' => 'Project deadline.',
'type' => 'int',
'length' => 11,
'not null' => FALSE,
),
),
'primary key' => array('id'),
);

return $schema;
}

Включим модуль.

Заполним созданную таблицу тестовыми данными
INSERT INTO `demo_projects` (`id`, `name`, `description`, `deadline`)
VALUES
(1, 'Summer House', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397501105),
(2, 'Winter House', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 1397501132);

Создаем сущность

/**
* Implements hook_entity_info().
*/
function mymodule_entity_info() {

$info = array();

$info['project'] = array(
'label' => t('Project'),
'base table' => 'demo_projects',
'entity keys' => array(
'id' => 'id',
'label' => 'name',
),
'module' => 'mymodule',
);

return $info;
}

Создаем страницу для ее отображения
function mymodule_menu() {
$items['test'] = array(
'page callback' => 'test_page',
'access callback' => TRUE,
);
return $items;
}

function test_page() {
$projects = entity_load('project', array(1, 2));
debug($projects);
return 'Hello';
}

В базовом варианте нам доступна для отображения только функция entity_load()

Загрузим модуль https://www.drupal.org/project/entity

Добавим ключи в наш hook_entity_info
//'entity class' => 'Entity',
//controller class' => 'EntityAPIController',

function mymodule_entity_info() {

$info = array();

$info['project'] = array(
'label' => t('Project'),
'base table' => 'demo_projects',
entity class' => 'Entity',
controller class' => 'EntityAPIController',
'entity keys' => array(
'id' => 'id',
'label' => 'name',
),
'module' => 'mymodule',
);

return $info;
}

Теперь нам доступны все функции данного модуля . Посмотреть функции можно здесь
Entity/includes/entity.inc
Entity/includes/entity.controller.inc

Отобразим нашу сущность с помошью функции
entity_view()

function mymodule_page() {
$projects = entity_load('project', array(1, 2,3));
$list = entity_view('project', $projects);
debug($list);
return render($list);

}

pic1.png

В данном выводе не хватает данных.

Изменим его.
Для этого мы дополним функцию buildContent() из Entity/includes/entity.controller.inc

Создадим новый класс контроллер для нашей сущности, наследуем функционал класса от базового класса

/**
* Extending the EntityAPIController for the Project entity.
*/
class ProjectEntityController extends EntityAPIController {
public function buildContent($entity, $view_mode = 'full', $langcode = NULL, $content = array()) {

$build = parent::buildContent($entity, $view_mode, $langcode, $content);

// Our additions to the $build render array

return $build;

}
}

Изменим конечный вывод ,добавим данные в виде render массива drupal

/**
* Extending the EntityAPIController for the Project entity.
*/
class ProjectEntityController extends EntityAPIController {
public function buildContent($entity, $view_mode = 'full', $langcode = NULL, $content = array()) {

$build = parent::buildContent($entity, $view_mode, $langcode, $content);

// Our additions to the $build render array

$build['description'] = array(
'#type' => 'markup',
'#markup' => check_plain($entity->description),
'#prefix' => '

',
'#suffix' => '

',
);
$build['deadline'] = array(
'#type' => 'markup',
'#markup' => date('d F, Y', check_plain($entity->deadline)),
'#prefix' => '

Deadline: ',
'#suffix' => '

',
);

return $build;

}
}

Изменим контроллер класса в
function mymodule_entity_info() {

$info = array();

$info['project'] = array(
'label' => t('Project'),
'base table' => 'demo_projects',
entity class' => 'Entity',
controller class' => 'ProjectEntityController',
'entity keys' => array(
'id' => 'id',
'label' => 'name',
),
'module' => 'mymodule',
);

return $info;
}

Очистим кеш

Получим измененный вывод.

pic2.png

Категория: 
The code has been tested and works

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.