/** * 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()}(); }
/** * 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; }