View source
<?php
class OgBehaviorHandler extends EntityReference_BehaviorHandler_Abstract {
public function access($field, $instance) {
return $field['settings']['handler'] == 'og' || strpos($field['settings']['handler'], 'og_') === 0;
}
public function load($entity_type, $entities, $field, $instances, $langcode, &$items) {
$field_name = $field['field_name'];
$target_type = $field['settings']['target_type'];
foreach ($entities as $entity) {
$wrapper = entity_metadata_wrapper($entity_type, $entity);
if (empty($wrapper->{$field_name})) {
continue;
}
$id = $wrapper
->getIdentifier();
$items[$id] = array();
$gids = og_get_entity_groups($entity_type, $entity, array(), $field_name);
if (empty($gids[$target_type])) {
continue;
}
foreach ($gids[$target_type] as $gid) {
$items[$id][] = array(
'target_id' => $gid,
);
}
}
}
public function insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
if (!empty($entity->skip_og_membership)) {
return;
}
$this
->OgMembershipCrud($entity_type, $entity, $field, $instance, $langcode, $items);
$items = array();
}
public function update($entity_type, $entity, $field, $instance, $langcode, &$items) {
if (!empty($entity->skip_og_membership)) {
return;
}
$this
->OgMembershipCrud($entity_type, $entity, $field, $instance, $langcode, $items);
$items = array();
}
public function delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
if (!empty($entity->skip_og_membership)) {
return;
}
if (!empty($entity->delete_og_membership)) {
$og_memberships = array();
foreach (og_get_entity_groups($entity_type, $entity) as $group_type => $ids) {
$og_memberships = array_merge($og_memberships, array_keys($ids));
}
if ($og_memberships) {
og_membership_delete_multiple($og_memberships);
}
}
else {
$this
->OgMembershipCrud($entity_type, $entity, $field, $instance, $langcode, $items);
}
}
public function OgMembershipCrud($entity_type, $entity, $field, $instance, $langcode, &$items) {
if (!user_access('administer group') && !field_access('edit', $field, $entity_type, $entity)) {
return;
}
if (!($diff = $this
->groupAudiencegetDiff($entity_type, $entity, $field, $instance, $langcode, $items))) {
return;
}
$field_name = $field['field_name'];
$group_type = $field['settings']['target_type'];
$diff += array(
'insert' => array(),
'delete' => array(),
);
if ($diff['delete']) {
og_membership_delete_multiple($diff['delete']);
}
if (!$diff['insert']) {
return;
}
$states = array();
foreach ($items as $item) {
$gid = $item['target_id'];
if (empty($item['state']) || !in_array($gid, $diff['insert'])) {
continue;
}
$states[$gid] = $item['state'];
}
foreach ($diff['insert'] as $gid) {
$values = array(
'entity_type' => $entity_type,
'entity' => $entity,
'field_name' => $field_name,
);
if (!empty($states[$gid])) {
$values['state'] = $states[$gid];
}
og_group($group_type, $gid, $values);
}
}
public function groupAudiencegetDiff($entity_type, $entity, $field, $instance, $langcode, $items) {
$return = FALSE;
$field_name = $field['field_name'];
$wrapper = entity_metadata_wrapper($entity_type, $entity);
$og_memberships = $wrapper->{$field_name . '__og_membership'}
->value();
$new_memberships = array();
foreach ($items as $item) {
$new_memberships[$item['target_id']] = TRUE;
}
foreach ($og_memberships as $og_membership) {
$gid = $og_membership->gid;
if (empty($new_memberships[$gid])) {
if ($og_membership->entity_type == 'user') {
$group = entity_load_single($og_membership->group_type, $og_membership->gid);
if (!empty($group->uid) && $group->uid == $og_membership->etid) {
continue;
}
}
$return['delete'][] = $og_membership->id;
unset($new_memberships[$gid]);
}
else {
unset($new_memberships[$gid]);
}
}
if ($new_memberships) {
$return['insert'] = array_keys($new_memberships);
}
return $return;
}
public function views_data_alter(&$data, $field) {
if (og_is_group_audience_field($field['field_name'])) {
$entity_types = array_keys($field['bundles']);
foreach ($entity_types as $entity_type) {
$entity_info = entity_get_info($entity_type);
$data['og_membership']['table']['join'][$entity_info['base table']] = array(
'left_field' => $entity_info['entity keys']['id'],
'field' => 'etid',
'extra' => array(
0 => array(
'field' => 'entity_type',
'value' => $entity_type,
),
),
);
$data['og_membership'][$field['field_name']] = $data['field_data_' . $field['field_name']][$field['field_name']];
$data['og_membership'][$field['field_name'] . '_target_id'] = $data['field_data_' . $field['field_name']][$field['field_name'] . '_target_id'];
foreach (array(
'filter',
'argument',
'sort',
'relationship',
) as $op) {
$data['og_membership'][$field['field_name'] . '_target_id'][$op]['field'] = 'gid';
$data['og_membership'][$field['field_name'] . '_target_id'][$op]['table'] = 'og_membership';
unset($data['og_membership'][$field['field_name'] . '_target_id'][$op]['additional fields']);
}
$data['og_membership'][$field['field_name'] . '_target_id']['relationship']['field'] = 'gid';
}
unset($data['field_data_' . $field['field_name']]);
unset($data['field_revision_' . $field['field_name']]);
}
}
public function validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
$new_errors = array();
$values = array(
'default' => array(),
'admin' => array(),
);
$item = reset($items);
if (!empty($item['field_mode'])) {
foreach ($items as $item) {
$values[$item['field_mode']][] = $item['target_id'];
}
}
else {
foreach ($items as $item) {
if (!entityreference_field_is_empty($item, $field) && $item['target_id'] !== NULL) {
$values['default'][] = $item['target_id'];
}
}
}
$field_name = $field['field_name'];
foreach ($values as $field_mode => $ids) {
if (!$ids) {
continue;
}
if ($field_mode == 'admin' && !user_access('administer group')) {
continue;
}
$instance['field_mode'] = $field_mode;
$valid_ids = entityreference_get_selection_handler($field, $instance, $entity_type, $entity)
->validateReferencableEntities($ids);
if ($invalid_entities = array_diff($ids, $valid_ids)) {
foreach ($invalid_entities as $id) {
$new_errors[$field_mode][] = array(
'error' => 'og_invalid_entity',
'message' => t('The referenced group (@type: @id) is invalid.', array(
'@type' => $field['settings']['target_type'],
'@id' => $id,
)),
);
}
}
}
if ($new_errors) {
og_field_widget_register_errors($field_name, $new_errors);
throw new FieldValidationException($new_errors);
}
unset($errors[$field_name]);
}
}