Browse Source
* Sprint Sept 2016 Huge Pull Request, Highlights: * removed rdf_type from fedora_source_type entity, better to handle this via rdfmapping based on bundle rdf assignment * Added inline form support * Added default rdf namespace register * Added test rdf.map config entity (have to check if it’s working, probably some typo? * Added experimental UUID Entity Solver(service, route and @annotation link * Made jsonld serialiser (github.com/diegopino/claw-jsonld) a requirement * Some route cleanups * Updated to correct Branch * Bad cherry picked Double method declaration after cherry picking, fixed.pull/756/head
Diego Pino Navarro
8 years ago
committed by
dannylamb
23 changed files with 576 additions and 77 deletions
@ -1 +1,25 @@ |
|||||||
# claw-drupal8 |
# Islandora |
||||||
|
[![Build Status](https://travis-ci.org/Islandora-CLAW/islandora.png?branch=8.x-1.x)](https://travis-ci.org/Islandora-CLAW/islandora) |
||||||
|
[![Contribution Guidelines](http://img.shields.io/badge/CONTRIBUTING-Guidelines-blue.svg)](./CONTRIBUTING.md) |
||||||
|
[![LICENSE](https://img.shields.io/badge/license-GPLv2-blue.svg?style=flat-square)](./LICENSE) |
||||||
|
|
||||||
|
## Introduction |
||||||
|
|
||||||
|
Islandora Fedora 4 Repository Module for Drupal 8.1.x |
||||||
|
|
||||||
|
## Maintainers |
||||||
|
|
||||||
|
Current maintainers: |
||||||
|
|
||||||
|
* [Diego Pino](https://github.com/diegopino) |
||||||
|
* [Jared Whiklo](https://github.com/whikloj) |
||||||
|
|
||||||
|
## Development |
||||||
|
|
||||||
|
If you would like to contribute, please get involved by attending our weekly [Tech Call](https://github.com/Islandora-CLAW/CLAW/wiki). We love to hear from you! |
||||||
|
|
||||||
|
If you would like to contribute code to the project, you need to be covered by an Islandora Foundation [Contributor License Agreement](http://islandora.ca/sites/default/files/islandora_cla.pdf) or [Corporate Contributor Licencse Agreement](http://islandora.ca/sites/default/files/islandora_ccla.pdf). Please see the [Contributors](http://islandora.ca/resources/contributors) pages on Islandora.ca for more information. |
||||||
|
|
||||||
|
## License |
||||||
|
|
||||||
|
[GPLv2](http://www.gnu.org/licenses/gpl-2.0.txt) |
@ -1,4 +1,3 @@ |
|||||||
langcode: en |
langcode: en |
||||||
id: non_rdf_source |
id: non_rdf_source |
||||||
label: 'Non RDF Source' |
label: 'Non RDF Source' |
||||||
rdf_type: fedora:Binary |
|
@ -1,4 +1,3 @@ |
|||||||
langcode: en |
langcode: en |
||||||
id: rdf_source |
id: rdf_source |
||||||
label: 'RDF Source' |
label: 'RDF Source' |
||||||
rdf_type: fedora:Resource |
|
@ -0,0 +1,36 @@ |
|||||||
|
langcode: en |
||||||
|
status: true |
||||||
|
dependencies: |
||||||
|
config: |
||||||
|
- islandora.fedora_resource_type.rdf_source |
||||||
|
module: |
||||||
|
- islandora |
||||||
|
id: fedora_resource_type.rdf_source |
||||||
|
targetEntityType: fedora_resource_type |
||||||
|
bundle: rdf_source |
||||||
|
types: |
||||||
|
- 'schema:Thing' |
||||||
|
- 'ldp:RDFSource' |
||||||
|
- 'ldp:Container' |
||||||
|
fieldMappings: |
||||||
|
title: |
||||||
|
properties: |
||||||
|
- 'dc11:title' |
||||||
|
- 'rdf:label' |
||||||
|
created: |
||||||
|
properties: |
||||||
|
- 'schema:dateCreated' |
||||||
|
datatype_callback: |
||||||
|
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value' |
||||||
|
changed: |
||||||
|
properties: |
||||||
|
- 'schema:dateModified' |
||||||
|
datatype_callback: |
||||||
|
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value' |
||||||
|
rdf_type: |
||||||
|
properties: |
||||||
|
- 'rdf:type' |
||||||
|
uid: |
||||||
|
properties: |
||||||
|
- 'schema:author' |
||||||
|
mapping_type: rel |
@ -1,19 +1,12 @@ |
|||||||
entity.fedora_resource.collection: |
# Islandora Routing definition |
||||||
path: '/admin/structure/fedora_resource' |
entity.fedora_resource_type.rdftest: |
||||||
|
path: '/fedora_resource/{fedora_resource}/rdf' |
||||||
defaults: |
defaults: |
||||||
_entity_list: 'fedora_resource' |
_controller: '\Drupal\node\Controller\NodePreviewController::view' |
||||||
_title: 'Fedora Resource' |
_title_callback: '\Drupal\node\Controller\NodePreviewController::title' |
||||||
requirements: |
requirements: |
||||||
_permission: 'administer fedora resource entities' |
_node_preview_access: '{node_preview}' |
||||||
options: |
options: |
||||||
_admin_route: true |
parameters: |
||||||
|
node_preview: |
||||||
entity.fedora_resource_type.collection: |
type: 'node_preview' |
||||||
path: '/admin/structure/fedora_resource_type' |
|
||||||
defaults: |
|
||||||
_entity_list: 'fedora_resource_type' |
|
||||||
_title: 'Fedora Resource Type' |
|
||||||
requirements: |
|
||||||
_permission: 'administer fedora resource type entities' |
|
||||||
options: |
|
||||||
_admin_route: true |
|
@ -0,0 +1,8 @@ |
|||||||
|
# Islandora Services |
||||||
|
# islandora.services.yml: |
||||||
|
services: |
||||||
|
islandora.paramconverter.entity: |
||||||
|
class: Drupal\islandora\ParamConverter\UuidEntityConverter |
||||||
|
tags: |
||||||
|
- { name: paramconverter } |
||||||
|
arguments: ['@entity.manager'] |
@ -0,0 +1,26 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* Created by PhpStorm. |
||||||
|
* User: dpino |
||||||
|
* Date: 8/16/16 |
||||||
|
* Time: 11:49 PM |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace Drupal\islandora; |
||||||
|
|
||||||
|
|
||||||
|
use Drupal\node\NodeViewBuilder; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class FedoraResourceViewBuilder |
||||||
|
* view builder handler. |
||||||
|
* |
||||||
|
* @TODO this should manage how fedora_resource are build to be viewed. |
||||||
|
* |
||||||
|
* Right now we are just using Drupal\Core\Entity\EntityViewBuilder |
||||||
|
* @ingroup islandora |
||||||
|
*/ |
||||||
|
class FedoraResourceViewBuilder extends NodeViewBuilder { |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,279 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Drupal\islandora\Form; |
||||||
|
|
||||||
|
use Drupal\Core\Entity\ContentEntityInterface; |
||||||
|
use Drupal\Core\Entity\Entity\EntityFormDisplay; |
||||||
|
use Drupal\Core\Entity\EntityInterface; |
||||||
|
use Drupal\Core\Entity\EntityFieldManagerInterface; |
||||||
|
use Drupal\Core\Entity\EntityTypeInterface; |
||||||
|
use Drupal\Core\Entity\EntityTypeManagerInterface; |
||||||
|
use Drupal\Core\Extension\ModuleHandlerInterface; |
||||||
|
use Drupal\Core\Field\WidgetBase; |
||||||
|
use Drupal\Core\Form\FormStateInterface; |
||||||
|
use Drupal\inline_entity_form\Form\EntityInlineForm; |
||||||
|
use Drupal\inline_entity_form\InlineFormInterface; |
||||||
|
use Symfony\Component\DependencyInjection\ContainerInterface; |
||||||
|
|
||||||
|
/** |
||||||
|
* Generic entity inline form handler. |
||||||
|
*/ |
||||||
|
class FedoraResourceEntityInlineForm extends EntityInlineForm implements InlineFormInterface { |
||||||
|
|
||||||
|
/** |
||||||
|
* The entity field manager. |
||||||
|
* |
||||||
|
* @var \Drupal\Core\Entity\EntityFieldManagerInterface |
||||||
|
*/ |
||||||
|
protected $entityFieldManager; |
||||||
|
|
||||||
|
/** |
||||||
|
* The entity type manager. |
||||||
|
* |
||||||
|
* @var \Drupal\Core\Entity\EntityTypeManagerInterface |
||||||
|
*/ |
||||||
|
protected $entityTypeManager; |
||||||
|
|
||||||
|
/** |
||||||
|
* The entity type managed by this handler. |
||||||
|
* |
||||||
|
* @var \Drupal\Core\Entity\EntityTypeInterface |
||||||
|
*/ |
||||||
|
protected $entityType; |
||||||
|
|
||||||
|
/** |
||||||
|
* Module handler service. |
||||||
|
* |
||||||
|
* @var \Drupal\Core\Extension\ModuleHandlerInterface |
||||||
|
*/ |
||||||
|
protected $moduleHandler; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs the inline entity form controller. |
||||||
|
* |
||||||
|
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager |
||||||
|
* The entity field manager. |
||||||
|
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager |
||||||
|
* The entity type manager. |
||||||
|
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler |
||||||
|
* The module handler. |
||||||
|
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type |
||||||
|
* The entity type. |
||||||
|
*/ |
||||||
|
public function __construct(EntityFieldManagerInterface $entity_field_manager, EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, EntityTypeInterface $entity_type) { |
||||||
|
$this->entityFieldManager = $entity_field_manager; |
||||||
|
$this->entityTypeManager = $entity_type_manager; |
||||||
|
$this->moduleHandler = $module_handler; |
||||||
|
$this->entityType = $entity_type; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { |
||||||
|
return new static( |
||||||
|
$container->get('entity_field.manager'), |
||||||
|
$container->get('entity_type.manager'), |
||||||
|
$container->get('module_handler'), |
||||||
|
$entity_type |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function getEntityType() { |
||||||
|
return $this->entityType; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function getEntityTypeLabels() { |
||||||
|
$lowercase_label = $this->entityType->getLowercaseLabel(); |
||||||
|
return [ |
||||||
|
'singular' => $lowercase_label, |
||||||
|
'plural' => t('@entity_type entities', ['@entity_type' => $lowercase_label]), |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function getEntityLabel(EntityInterface $entity) { |
||||||
|
return $entity->label(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function getTableFields($bundles) { |
||||||
|
$definitions = $this->entityFieldManager->getBaseFieldDefinitions($this->entityType->id()); |
||||||
|
$label_key = $this->entityType->getKey('label'); |
||||||
|
$label_field_label = t('Label'); |
||||||
|
if ($label_key && isset($definitions[$label_key])) { |
||||||
|
$label_field_label = $definitions[$label_key]->getLabel(); |
||||||
|
} |
||||||
|
$bundle_key = $this->entityType->getKey('bundle'); |
||||||
|
$bundle_field_label = t('Type'); |
||||||
|
if ($bundle_key && isset($definitions[$bundle_key])) { |
||||||
|
$bundle_field_label = $definitions[$bundle_key]->getLabel(); |
||||||
|
} |
||||||
|
|
||||||
|
$fields = []; |
||||||
|
$fields['label'] = [ |
||||||
|
'type' => 'label', |
||||||
|
'label' => $label_field_label, |
||||||
|
'weight' => 1, |
||||||
|
]; |
||||||
|
if (count($bundles) > 1) { |
||||||
|
$fields[$bundle_key] = [ |
||||||
|
'type' => 'field', |
||||||
|
'label' => $bundle_field_label, |
||||||
|
'weight' => 2, |
||||||
|
'display_options' => [ |
||||||
|
'type' => 'entity_reference_label', |
||||||
|
'settings' => ['link' => FALSE], |
||||||
|
], |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
return $fields; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function entityForm(array $entity_form, FormStateInterface $form_state) { |
||||||
|
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ |
||||||
|
$entity = $entity_form['#entity']; |
||||||
|
$form_display = $this->getFormDisplay($entity, $entity_form['#form_mode']); |
||||||
|
$form_display->buildForm($entity, $entity_form, $form_state); |
||||||
|
$entity_form['#ief_element_submit'][] = [get_class($this), 'submitCleanFormState']; |
||||||
|
// Allow other modules to alter the form. |
||||||
|
$this->moduleHandler->alter('inline_entity_form_entity_form', $entity_form, $form_state); |
||||||
|
|
||||||
|
return $entity_form; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function entityFormValidate(array &$entity_form, FormStateInterface $form_state) { |
||||||
|
// Perform entity validation only if the inline form was submitted, |
||||||
|
// skipping other requests such as file uploads. |
||||||
|
$triggering_element = $form_state->getTriggeringElement(); |
||||||
|
if (!empty($triggering_element['#ief_submit_trigger'])) { |
||||||
|
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ |
||||||
|
$entity = $entity_form['#entity']; |
||||||
|
$this->buildEntity($entity_form, $entity, $form_state); |
||||||
|
$form_display = $this->getFormDisplay($entity, $entity_form['#form_mode']); |
||||||
|
$form_display->validateFormValues($entity, $entity_form, $form_state); |
||||||
|
$entity->setValidationRequired(FALSE); |
||||||
|
|
||||||
|
foreach($form_state->getErrors() as $name => $message) { |
||||||
|
// $name may be unknown in $form_state and |
||||||
|
// $form_state->setErrorByName($name, $message) may suppress the error message. |
||||||
|
$form_state->setError($triggering_element, $message); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function entityFormSubmit(array &$entity_form, FormStateInterface $form_state) { |
||||||
|
$form_state->cleanValues(); |
||||||
|
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ |
||||||
|
$entity = $entity_form['#entity']; |
||||||
|
$this->buildEntity($entity_form, $entity, $form_state); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function save(EntityInterface $entity) { |
||||||
|
$entity->save(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* {@inheritdoc} |
||||||
|
*/ |
||||||
|
public function delete($ids, $context) { |
||||||
|
$storage_handler = $this->entityTypeManager->getStorage($this->entityType->id()); |
||||||
|
$entities = $storage_handler->loadMultiple($ids); |
||||||
|
$storage_handler->delete($entities); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Builds an updated entity object based upon the submitted form values. |
||||||
|
* |
||||||
|
* @param array $entity_form |
||||||
|
* The entity form. |
||||||
|
* @param \Drupal\Core\Entity\ContentEntityInterface $entity |
||||||
|
* The entity. |
||||||
|
* @param \Drupal\Core\Form\FormStateInterface $form_state |
||||||
|
* The current state of the form. |
||||||
|
*/ |
||||||
|
protected function buildEntity(array $entity_form, ContentEntityInterface $entity, FormStateInterface $form_state) { |
||||||
|
$form_display = $this->getFormDisplay($entity, $entity_form['#form_mode']); |
||||||
|
$form_display->extractFormValues($entity, $entity_form, $form_state); |
||||||
|
// Invoke all specified builders for copying form values to entity fields. |
||||||
|
if (isset($entity_form['#entity_builders'])) { |
||||||
|
foreach ($entity_form['#entity_builders'] as $function) { |
||||||
|
call_user_func_array($function, [$entity->getEntityTypeId(), $entity, &$entity_form, &$form_state]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Cleans up the form state for a submitted entity form. |
||||||
|
* |
||||||
|
* After field_attach_submit() has run and the form has been closed, the form |
||||||
|
* state still contains field data in $form_state->get('field'). Unless that |
||||||
|
* data is removed, the next form with the same #parents (reopened add form, |
||||||
|
* for example) will contain data (i.e. uploaded files) from the previous form. |
||||||
|
* |
||||||
|
* @param $entity_form |
||||||
|
* The entity form. |
||||||
|
* @param $form_state |
||||||
|
* The form state of the parent form. |
||||||
|
*/ |
||||||
|
public static function submitCleanFormState(&$entity_form, FormStateInterface $form_state) { |
||||||
|
$info = \Drupal::entityTypeManager()->getDefinition($entity_form['#entity_type']); |
||||||
|
if (!$info->get('field_ui_base_route')) { |
||||||
|
// The entity type is not fieldable, nothing to cleanup. |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
$bundle = $entity_form['#entity']->bundle(); |
||||||
|
$instances = \Drupal::service('entity_field.manager')->getFieldDefinitions($entity_form['#entity_type'], $bundle); |
||||||
|
foreach ($instances as $instance) { |
||||||
|
$field_name = $instance->getName(); |
||||||
|
if (!empty($entity_form[$field_name]['#parents'])) { |
||||||
|
$parents = $entity_form[$field_name]['#parents']; |
||||||
|
array_pop($parents); |
||||||
|
if (!empty($parents)) { |
||||||
|
$field_state = array(); |
||||||
|
WidgetBase::setWidgetState($parents, $field_name, $form_state, $field_state); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Gets the form display for the given entity. |
||||||
|
* |
||||||
|
* @param \Drupal\Core\Entity\ContentEntityInterface $entity |
||||||
|
* The entity. |
||||||
|
* @param string $form_mode |
||||||
|
* The form mode. |
||||||
|
* |
||||||
|
* @return \Drupal\Core\Entity\Display\EntityFormDisplayInterface |
||||||
|
* The form display. |
||||||
|
*/ |
||||||
|
protected function getFormDisplay(ContentEntityInterface $entity, $form_mode) { |
||||||
|
return EntityFormDisplay::collectRenderDisplay($entity, $form_mode); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @file |
||||||
|
* Contains UuidEntityConverter.php |
||||||
|
* |
||||||
|
* This file is part of the Islandora Project. |
||||||
|
* |
||||||
|
* (c) Islandora Foundation |
||||||
|
* |
||||||
|
* For the full copyright and license information, please view the LICENSE |
||||||
|
* file that was distributed with this source code. |
||||||
|
* |
||||||
|
* @author Diego Pino Navarro <dpino@metro.org> https://github.com/diegopino |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace Drupal\islandora\ParamConverter; |
||||||
|
|
||||||
|
|
||||||
|
use Drupal\Core\ParamConverter\EntityConverter; |
||||||
|
use Drupal\Core\ParamConverter\ParamConverterInterface; |
||||||
|
use Drupal\Component\Uuid\Uuid; |
||||||
|
use Symfony\Component\Routing\Route; |
||||||
|
/** |
||||||
|
* Converts an UUID param (route) into an Entity. |
||||||
|
* |
||||||
|
* @ingroup islandora |
||||||
|
*/ |
||||||
|
class UuidEntityConverter extends EntityConverter implements ParamConverterInterface { |
||||||
|
/** |
||||||
|
* @inheritDoc |
||||||
|
*/ |
||||||
|
public function convert($value, $definition, $name, array $defaults) { |
||||||
|
|
||||||
|
$entity_type_id = $this->getEntityTypeFromDefaults($definition, $name, $defaults); |
||||||
|
if ($storage = $this->entityManager->getStorage($entity_type_id)) { |
||||||
|
|
||||||
|
// Try to load fedora entity by UUID or ID depending on $value. |
||||||
|
if (!(is_int($value) || ctype_digit((string) $value)) && Uuid::isValid($value)) { |
||||||
|
$entities = $storage->loadByProperties(['uuid' => $value]); |
||||||
|
$entity = ($entities) ? reset($entities) : NULL; |
||||||
|
|
||||||
|
} |
||||||
|
else { |
||||||
|
$entity = parent::convert($value, $definition, $name, $defaults); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $entity; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @inheritDoc |
||||||
|
*/ |
||||||
|
public function applies($definition, $name, Route $route) { |
||||||
|
/*if (!empty($definition['type']) && strpos($definition['type'], 'entity:') === 0) { |
||||||
|
$entity_type_id = substr($definition['type'], strlen('entity:')); |
||||||
|
if (strpos($definition['type'], '{') !== FALSE) { |
||||||
|
$entity_type_slug = substr($entity_type_id, 1, -1); |
||||||
|
return $name != $entity_type_slug && in_array($entity_type_slug, $route->compile()->getVariables(), TRUE); |
||||||
|
} |
||||||
|
return $this->entityManager->hasDefinition($entity_type_id); |
||||||
|
} |
||||||
|
return FALSE;*/ |
||||||
|
|
||||||
|
return parent::applies($definition, $name, $route); // TODO: Change the autogenerated stub |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue