You are here

public function field_validation_field_collection_unique_validator::validate in Field Validation 7.2

Validate field.

Overrides field_validation_validator::validate

File

field_validation_extras/plugins/validator/field_validation_field_collection_unique_validator.inc, line 21

Class

field_validation_field_collection_unique_validator

Code

public function validate() {
  $flag = TRUE;
  $count = 0;
  foreach ($this->items as $delta1 => $item1) {
    if ($this->delta != $delta1) {
      if ($this->value == $item1[$this->rule->col]) {
        $flag = FALSE;
        break;
      }
    }
  }
  if ($flag) {
    $count = 0;
    $query = new EntityFieldQuery();
    $query
      ->entityCondition('entity_type', 'field_collection_item');
    $query
      ->entityCondition('bundle', $this->entity->field_name);

    // Always bypass all access checkings.
    $query
      ->addMetaData('account', user_load(1));
    if (isset($this->entity->hostEntity)) {
      $hostEntity = $this->entity->hostEntity;
    }
    list($id, $vid, $bundle) = entity_extract_ids($this->rule->entity_type, $this->entity);

    // Add field collection item.
    if (arg(0) == 'field-collection' && arg(1) == strtr($bundle, array(
      '_' => '-',
    )) && arg(2) == 'add') {
      $hostEntityType = arg(3);
      $hostEntityId = arg(4);
      $result = entity_load($hostEntityType, array(
        $hostEntityId,
      ));
      $hostEntity = reset($result);
    }

    // Edit field collection item.
    if (arg(0) == 'field-collection' && arg(1) == strtr($bundle, array(
      '_' => '-',
    )) && arg(3) == 'edit' && empty($id)) {
      $id = arg(2);
      $field_collection_item = field_collection_item_load($id);
      $hostEntity = $field_collection_item
        ->hostEntity();
    }
    if (!empty($hostEntity)) {
      $items = isset($hostEntity->{$this->entity->field_name}[LANGUAGE_NONE]) ? $hostEntity->{$this->entity->field_name}[LANGUAGE_NONE] : array();

      // $ids = field_collection_field_item_to_ids($items);
      $ids = array();
      foreach ($items as $item) {
        if (!empty($item['value']) && $item['value'] != $id) {
          $ids[] = $item['value'];
        }
      }
      $query
        ->entityCondition('entity_id', $ids, 'IN');
      $query
        ->fieldCondition($this->rule->field_name, $this->rule->col, $this->value);
      $count = $query
        ->count()
        ->execute();
    }
    if ($count) {
      $flag = FALSE;
    }
  }
  if (!$flag) {
    $this
      ->set_error();
  }
}