カスタムモジュールでEntityの定義と作成
- シリーズ記事でEntityの定義、管理を説明しました
- 定義されたEntityが拡張フィールドの使用はできません
- そのEntityのバンドル(Bundle)の定義がしなかったからです
カスタムモジュール(entity_room.zip)でEntityとそのBundleを定義し、拡張フィールドの使用ができるようにします
- 拡張フィールドがEntityオブジェクトが作成後に必要に応じ追加することができます(柔軟性を高める)
- カスタムモジュール(entity_room.zip)をダウンロードして、参考にしてください
- 定義されたRoom EntityにRoomバンドル(Bundle)を指定します
/** * Implements hook_entity_info(). */ function entity_room_entity_info() { $room_info['room'] = array( 'label' => t('Room'), 'controller class' => 'RoomController', 'base table' => 'room', 'uri callback' => 'room_uri', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'rid', 'label' => 'room_number', ), 'static cache' => TRUE, 'bundles' => array( // バンドルの指定 'room'=> array( // バンドル名: room 'label' => 'Room', 'admin' => array( 'path' => 'admin/structure/room/manage', // バンドルの管理URI 'access arguments' => array('administer rooms'), ), ), ), 'view modes' => array( 'full' => array( 'label' => t('Full Room'), 'custom settings' => FALSE, ), ) ); return $room_info; }
- 管理画面(/admin/stracture/room/manage)でRoomEntityの拡張フィールドの追加ができるようになります
Entity作成時に追加された拡張フィールドが現れます
- Roomエンティティを作成(/room/add)画面に、Roomエンティティのプロパティ(room_number)と拡張フィールド(room type)が現れます
- エンティティ表示画面(/room/[rid])にも拡張フィールドの内容が表示されます
- エンティティ追加、表示のコードは以下のよう
/** * Implements hook_menu(). */ function entity_room_menu() { // 管理が面にメッセージ表示のみ $items['admin/structure/room/manage'] = array( 'title' => 'Room Admin', 'description' => 'Manage Room structure', 'page callback' => 'room_info', 'access arguments' => array('administer rooms'), ); // 個別Room表示 $items['room/%entity_room'] = array( 'title callback' => 'room_page_title', 'title arguments' => array(1), 'page callback' => 'room_page_view', 'page arguments' => array(1), 'access arguments' => array('view rooms'), 'type' => MENU_CALLBACK, ); // 新規Room作成 $items['room/add'] = array( 'title' => t('Add Room'), 'page callback' => 'room_add', 'access arguments' => array('create room'), ); return $items; } /** * Implements hook_permission(). */ function entity_room_permission() { return array( 'administer rooms' => array( 'title' => t('Administer rooms'), 'restrict access' => TRUE, ), 'create room' => array( 'title' => t('Create room'), ), 'view rooms' => array( 'title' => t('View Rooms'), ) ); } /** * create "add room" form */ function room_add() { $room = (object) array ( 'rid' => '', 'type' => 'room', 'room_number' => '', ); return drupal_get_form('room_add_form', $room); } function room_add_form($form, &$form_state, $room) { $form['room_number'] = array( '#type' => 'textfield', '#title' => t('Room Number'), '#required' => TRUE, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save'), ); field_attach_form('room', $room, $form, $form_state); return $form; } function room_add_form_validate($form, &$form_state) { $room_submisttion = (object) $form_state['values']; field_attach_form_validate('room', $room_submisttion, $form, $form_state); } function room_add_form_submit($form, &$form_state) { $room_submission = (object) $form_state['values']; field_attach_submit('room', $room_submission, $form, $form_state); $room = room_save($room_submission); $form_state['redirect'] = "room/$room->rid"; } function room_save(&$room) { return entity_get_controller('room')->save($room); } function room_info() { return t('Welcome to the administration page for your rooms!'); } function room_page_title($room){ return $room->room_number; } function room_page_view($room, $view_mode = 'full'){ $room->content = array(); // Build fields content. field_attach_prepare_view('room', array($room->rid => $room), $view_mode); entity_prepare_view('room', array($room->rid => $room)); $room->content += field_attach_view('room', $room, $view_mode); return $room->content; } /** * Implements hook_field_extra_fields(). * Field管理にRoomのプロパティ項目を追加(編集不可) */ function entity_room_field_extra_fields() { $return = array(); $return['room']['room'] = array( 'form' => array( 'room_number' => array( 'label' => t('Room Number'), 'description' => t('The number of the room'), 'weight' => 1, ), ), ); return $return; } function room_uri( $room ){ return array( 'path' => 'room/' . $room->rid, ); } class RoomController extends DrupalDefaultEntityController{ public function __construct($entityType) { parent::__construct($entityType); } // Entityオブジェクト保存 public function save($room) { drupal_write_record('room', $room); field_attach_insert('room', $room); return $room; } } /** * Implements hook_load(). */ function entity_room_load($rid = NULL, $reset = FALSE){ $rids = (isset ($rid) ? array($rid) : array()); $room = room_load_multiple($rids, $reset); return $room ? reset ($room) : FALSE; } function room_load_multiple($rids = array(), $conditions = array(), $reset = FALSE){ return entity_load('room', $rids, $conditions, $reset); }