/**
  * Builds a metadata item for a field value.
  *
  * It will add information about the referenced entity.
  *
  * @param \EntityMetadataWrapper $wrapper
  *   The wrapper for the referenced file array.
  *
  * @return array
  *   The metadata array item.
  */
 protected function buildResourceMetadataItem($wrapper)
 {
     $file_array = $wrapper->value();
     /* @var \EntityDrupalWrapper $wrapper */
     $wrapper = entity_metadata_wrapper('file', $file_array['fid']);
     return parent::buildResourceMetadataItem($wrapper);
 }
 /**
  * Overrides \RestfulEntityBase::checkPropertyAccess().
  *
  * Allow user to create a label for the unsaved term, even if the user doesn't
  * have access to update existing terms, as required by the entity metadata
  * wrapper's access check.
  */
 protected function checkPropertyAccess($op, $public_field_name, EntityMetadataWrapper $property, EntityMetadataWrapper $wrapper) {
   $info = $property->info();
   $term = $wrapper->value();
   if (!empty($info['name']) && $info['name'] == 'name' && empty($term->tid) && $op == 'edit') {
     return TRUE;
   }
   return parent::checkPropertyAccess($op, $public_field_name, $property, $wrapper);
 }
 /**
  * Overrides RestfulEntityBase::entityPreSave().
  *
  * Set the node author and other defaults.
  */
 public function entityPreSave(\EntityMetadataWrapper $wrapper) {
   $node = $wrapper->value();
   if (!empty($node->nid)) {
     // Node is already saved.
     return;
   }
   node_object_prepare($node);
   $node->uid = $this->getAccount()->uid;
 }
 /**
  * Get value from a property.
  *
  * @param \EntityMetadataWrapper $property_wrapper
  *   The property wrapper. Either \EntityDrupalWrapper or \EntityListWrapper.
  *
  * @return mixed
  *   A single or multiple values.
  */
 protected function fieldValue(\EntityMetadataWrapper $property_wrapper)
 {
     if ($this->getSubProperty() && $property_wrapper->value()) {
         $property_wrapper = $property_wrapper->{$this->getSubProperty()};
     }
     // Wrapper method.
     return $property_wrapper->{$this->getWrapperMethod()}();
 }
Beispiel #5
0
  /**
   * Validate an entity before it is saved.
   *
   * @param \EntityMetadataWrapper $wrapper
   *   The wrapped entity.
   *
   * @throws \RestfulBadRequestException
   */
  public function entityValidate(\EntityMetadataWrapper $wrapper) {
    if (!module_exists('entity_validator')) {
      // Entity validator doesn't exist.
      return;
    }

    if (!$handler = entity_validator_get_validator_handler($wrapper->type(), $wrapper->getBundle())) {
      // Entity validator handler doesn't exist for the entity.
      return;
    }

    if ($handler->validate($wrapper->value(), TRUE)) {
      // Entity is valid.
      return;
    }

    $errors = $handler->getErrors(FALSE);

    $map = array();
    foreach ($this->getPublicFields() as $field_name => $value) {
      if (empty($value['property'])) {
        continue;
      }

      if (empty($errors[$value['property']])) {
        // Field validated.
        continue;
      }

      $map[$value['property']] = $field_name;
      $params['@fields'][] = $field_name;
    }

    if (empty($params['@fields'])) {
      // There was a validation error, but on non-public fields, so we need to
      // throw an exception, but can't say on which fields it occurred.
      throw new \RestfulBadRequestException('Invalid value(s) sent with the request.');
    }

    $params['@fields'] = implode(',', $params['@fields']);
    $e = new \RestfulBadRequestException(format_plural(count($map), 'Invalid value in field @fields.', 'Invalid values in fields @fields.', $params));
    foreach ($errors as $property_name => $messages) {
      if (empty($map[$property_name])) {
        // Entity is not valid, but on a field not public.
        continue;
      }

      $field_name = $map[$property_name];

      foreach ($messages as $message) {

        $message['params']['@field'] = $field_name;
        $output = format_string($message['message'], $message['params']);

        $e->addFieldError($field_name, $output);
      }
    }

    // Throw the exception.
    throw $e;
  }