view includes/entity.inc @ 3:19f75fe342eb

minor changes
author Dirk Wintergruen <dwinter@mpiwg-berlin.mpg.de>
date Mon, 12 Oct 2015 08:33:28 +0200
parents b57c7821382f
children
line wrap: on
line source

<?php

function mpiwg_geobrowser_entity_info() {
    $info['mpiwg_geobrowser'] = array(
        'label' => t('mpiwg geobrowser instance'),
        'controller class' => 'MpiwgGeoBrowserBasicController',
        'base table' => 'mpiwg_geobrowser',
        'uri callback' => 'mpiwg_geobrowser_uri',
        'fieldable' => TRUE,
        'entity keys' => array(
            'id' => 'mpiwg_geobrowser_instance_id' ,
        ),
        'static cache' => TRUE,
        'view modes' => array(
            'default' => array(
                'label' => t('Default'),
                'custom settings' =>  FALSE,
            ),
        )
  );

  return $info;
}

function mpiwg_geobrowser_load($mpiwg_geobrowser_instance_id = NULL, $reset = FALSE) {
    $mpiwg_geobrowser_instance_ids = (isset($mpiwg_geobrowser_instance_id) ? array($mpiwg_geobrowser_instance_id) : array());
    $basic = mpiwg_geobrowser_load_multiple($mpiwg_geobrowser_instance_ids, array(), $reset);
    return $basic ? reset($basic) : FALSE;
}

function mpiwg_geobrowser_load_multiple($mpiwg_geobrowser_instance_ids = FALSE, $conditions = array(), $reset = FALSE) {
    return entity_load('mpiwg_geobrowser', $mpiwg_geobrowser_instance_ids, $conditions, $reset);
}

function mpiwg_geobrowser_uri($basic) {
    return array(
        'path' => 'mpiwg_geobrowser/' . $basic->mpiwg_geobrowser_instance_id,
    );
}

function mpiwg_geobrowser_menu() {
  $items['admin/mpiwg_geobrowser/manage'] = array(
    'title' => 'mpiwg geobrowser',
    'page callback' => 'mpiwg_geobrowser_list_entities',
    'access arguments' => array('administer mpiwg_geobrowser entities'),
  );
  
  $items['admin/mpiwg_geobrowser/manage/list'] = array(
    'title' => 'list instances',
    'page callback' => 'mpiwg_geobrowser_list_entities',
    'access arguments' => array('administer mpiwg_geobrowser entities'),
  );

  $items['admin/mpiwg_geobrowser/manage/add'] = array(
    'title' => 'add instance',
    'page callback' => 'mpiwg_geobrowser_add',
    'access arguments' => array('create mpiwg_geobrowser entities'),
    'type' => MENU_LOCAL_ACTION,
  );

  $items['mpiwg_geobrowser/%mpiwg_geobrowser'] = array(
    'title callback' => 'mpiwg_geobrowser_title',
    'title arguments' => array(1),
    'page callback' => 'mpiwg_geobrowser_view',
    'page arguments' => array(1),
    'access arguments' => array('view any mpiwg_geobrowser entity'),
  );

  $items['mpiwg_geobrowser/%mpiwg_geobrowser/view'] = array(
    'title' => 'View',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -10,
  );

  $items['mpiwg_geobrowser/%mpiwg_geobrowser/edit'] = array(
    'title' => 'Edit',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('mpiwg_geobrowser_form', 1),
    'access arguments' => array('edit any mpiwg_geobrowser entity'),
    'type' => MENU_LOCAL_TASK,
  );

  $items['mpiwg_geobrowser/add'] = array(
    'title' => 'Add a mpiwg geobrowser instance',
    'page callback' => 'mpiwg_geobrowser_add',
    'access arguments' => array('create mpiwg_geobrowser entities'),
  );

  return $items;
}

function mpiwg_geobrowser_permission() {
  $permissions = array(
    'administer mpiwg_geobrowser entities' =>  array(
      'title' => t('Administer mpiwg_geobrowser entities'),
    ),
    'view any mpiwg_geobrowser entity' => array(
      'title' => t('View any mpiwg geobrowser instance'),
    ),
    'edit any mpiwg_geobrowser entity' => array(
      'title' => t('Edit any mpiwg geobrowser instance'),
    ),
    'create mpiwg_geobrowser entities' => array(
      'title' => t('Create mpiwg geobrowser instances'),
    ),
  );
  return $permissions;
}

function mpiwg_geobrowser_list_entities() {
  $content = array();
  $entities = mpiwg_geobrowser_load_multiple();
  if (!empty($entities)) {
    foreach ( $entities as $entity ) {
      $rows[] = array(
        'data' => array(
          'id' => $entity->mpiwg_geobrowser_instance_id,
          'item_description' => l($entity->item_description, 'mpiwg_geobrowser/' . $entity->mpiwg_geobrowser_instance_id),
        ),
      );
    }
    $content['entity_table'] = array(
      '#theme' => 'table',
      '#rows' => $rows,
    );
  }
  else {
    $content[] = array(
      '#type' => 'item',
      '#markup' => t('No mpiwg_geobrowser entities currently exist.'),
    );
  }
  return $content;
}

function mpiwg_geobrowser_title($entity) {
  return t('mpiwg geobrowser instance (item_description=@item_description)', array('@item_description' => $entity->item_description));
}

function mpiwg_geobrowser_view($entity, $view_mode = 'default') {
  
  $entity_type = 'mpiwg_geobrowser';
  $entity->content = array(
    '#view_mode' => $view_mode,
  );
  field_attach_prepare_view($entity_type, array($entity->mpiwg_geobrowser_instance_id => $entity), $view_mode);
  entity_prepare_view($entity_type, array($entity->mpiwg_geobrowser_instance_id => $entity));
  $entity->content += field_attach_view($entity_type, $entity, $view_mode);

  $entity->content['item_description'] = array(
    '#type' => 'item',
    '#title' => t('Item Description'),
    '#markup' => $entity->item_description,
  );
  
  global $language;
  $langcode = $language->language;
  module_invoke_all('entity_view', $entity, $entity_type, $view_mode, $langcode);
  drupal_alter(array('mpiwg_geobrowser_view', 'entity_view'), $entity->content, $entity_type);

  return $entity->content;
}

function mpiwg_geobrowser_field_extra_fields() {
  $form_elements['item_description'] = array(
    'label' => t('Item Description'),
    'description' => t('Item Description (an extra form field)'),
    'weight' => -5,
  );
  
  $display_elements['item_description'] = array(
    'label' => t('Item Description'),
    'description' => t('Just like title, but trying to point out that it is a separate property'),
    'weight' => 0,
  );

  $extra_fields['mpiwg_geobrowser']['default_bundle']['form'] = $form_elements;
  $extra_fields['mpiwg_geobrowser']['default_bundle']['display'] = $display_elements;

  return $extra_fields;
}

function mpiwg_geobrowser_add() {
  $entity = entity_get_controller('mpiwg_geobrowser')->create();
  return drupal_get_form('mpiwg_geobrowser_form', $entity);
}

function mpiwg_geobrowser_form($form, &$form_state, $entity) {
  $form['item_description'] = array(
    '#type' => 'textfield',
    '#title' => t('Item Description'),
    '#required' => TRUE,
    '#default_value' => $entity->item_description,
  );

  $form['basic_entity'] = array(
    '#type' => 'value',
    '#value' => $entity,
  );

  field_attach_form('mpiwg_geobrowser', $entity, $form, $form_state);

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
    '#weight' => 100,
  );
  $form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#submit' => array('mpiwg_geobrowser_edit_delete'),
    '#weight' => 200,
  );

  return $form;
}

function mpiwg_geobrowser_form_validate($form, &$form_state) {
  field_attach_form_validate('mpiwg_geobrowser', $form_state['values']['basic_entity'], $form, $form_state);
}

function mpiwg_geobrowser_form_submit($form, &$form_state) {
  $entity = $form_state['values']['basic_entity'];
  $entity->item_description = $form_state['values']['item_description'];
  field_attach_submit('mpiwg_geobrowser', $entity, $form, $form_state);
  $entity = mpiwg_geobrowser_save($entity);
  $form_state['redirect'] = 'mpiwg_geobrowser/' . $entity->mpiwg_geobrowser_instance_id;
}

function mpiwg_geobrowser_edit_delete( $form , &$form_state ) {
  $entity = $form_state['values']['basic_entity'];
  mpiwg_geobrowser_delete($entity);
  drupal_set_message(t('The mpiwg geobrowser instance %item_description (ID %id) has been deleted',
    array('%item_description' => $entity->item_description, '%id' => $entity->mpiwg_geobrowser_instance_id))
  );
  $form_state['redirect'] = 'mpiwg_geobrowser';
}

function mpiwg_geobrowser_save(&$entity) {
  return entity_get_controller('mpiwg_geobrowser')->save($entity);
}

function mpiwg_geobrowser_delete($entity) {
  entity_get_controller('mpiwg_geobrowser')->delete($entity);
}

interface MpiwgGeobrowserBasicControllerInterface
  extends DrupalEntityControllerInterface {
  public function create();
  public function save($entity);
  public function delete($entity);
}

class MpiwgGeobrowserBasicController
  extends DrupalDefaultEntityController
  implements MpiwgGeobrowserBasicControllerInterface {

  public function create() {
    $entity = new stdClass();
    $entity->type = 'mpiwg_geobrowser';
    $entity->mpiwg_geobrowser_instance_id = 0;
    $entity->item_description = '';
    return $entity;
  }

  public function save($entity) {
    module_invoke_all('entity_presave', $entity, 'mpiwg_geobrowser');
    $primary_keys = $entity->mpiwg_geobrowser_instance_id ? 'mpiwg_geobrowser_instance_id' : array();
    drupal_write_record('mpiwg_geobrowser', $entity, $primary_keys);
    $invocation = 'entity_insert';
    if (empty($primary_keys)) {
      field_attach_insert('mpiwg_geobrowser', $entity);
    }
    else {
      field_attach_update('mpiwg_geobrowser', $entity);
      $invocation = 'entity_update';
    }
    module_invoke_all($invocation, $entity, 'mpiwg_geobrowser');
    return $entity;
  }

  public function delete($entity) {
    $this->delete_multiple(array($entity));
  }

  public function delete_multiple($entities) {
    $mpiwg_geobrowser_instance_ids = array();
    if (!empty($entities)) {
      $transaction = db_transaction();
      try {
        foreach ($entities as $entity) {
          module_invoke_all('entity_delete', $entity, 'mpiwg_geobrowser');
          field_attach_delete('mpiwg_geobrowser', $entity);
          $mpiwg_geobrowser_instance_ids[] = $entity->mpiwg_geobrowser_instance_id;
        }
        db_delete('mpiwg_geobrowser')
          ->condition('mpiwg_geobrowser_instance_id', $mpiwg_geobrowser_instance_ids, 'IN')
          ->execute();
      }
      catch (Exception $e) {
        $transaction->rollback();
        watchdog_exception('mpiwg_geobrowser', $e);
        throw $e;
      }
    }
  }
}