Commit ac31f29d authored by webchick's avatar webchick

Issue #2257769 by tstoeckler | sun: Adding an Entity Reference field in the...

Issue #2257769 by tstoeckler | sun: Adding an Entity Reference field in the Field UI throws a PHP notice; fails to add field.
parent 39edc270
......@@ -477,8 +477,12 @@ public function getSchema() {
$definition = \Drupal::service('plugin.manager.field.field_type')->getDefinition($this->getType());
$class = $definition['class'];
$schema = $class::schema($this);
// Fill in default values for optional entries.
$schema += array('indexes' => array(), 'foreign keys' => array());
// Fill in default values.
$schema += array(
'columns' => array(),
'indexes' => array(),
'foreign keys' => array(),
);
// Check that the schema does not include forbidden column names.
if (array_intersect(array_keys($schema['columns']), static::getReservedColumns())) {
......
......@@ -10,7 +10,7 @@
use Drupal\Component\Plugin\Factory\DefaultFactory;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Language\LanguageManager;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
/**
......@@ -26,12 +26,12 @@ class FieldTypePluginManager extends DefaultPluginManager implements FieldTypePl
* keyed by the corresponding namespace to look for plugin implementations.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
* Cache backend instance to use.
* @param \Drupal\Core\Language\LanguageManager $language_manager
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Extension\ModuleHandlerInterface
* The module handler.
*/
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, LanguageManager $language_manager, ModuleHandlerInterface $module_handler) {
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, LanguageManagerInterface $language_manager, ModuleHandlerInterface $module_handler) {
parent::__construct('Plugin/Field/FieldType', $namespaces, $module_handler, 'Drupal\Core\Field\Annotation\FieldType');
$this->alterInfo('field_info');
$this->setCacheBackend($cache_backend, $language_manager, 'field_types_plugins');
......
......@@ -75,7 +75,7 @@ protected function getAnnotationReader() {
$reader = parent::getAnnotationReader();
// Add the Core annotation classes like @Translation.
$reader->addNamespace('Drupal\Core\Annotation', array(DRUPAL_ROOT . '/core/lib/Drupal/Core/Annotation'));
$reader->addNamespace('Drupal\Core\Annotation', array(dirname(dirname(__DIR__)) . '/Annotation'));
$this->annotationReader = $reader;
}
return $this->annotationReader;
......
......@@ -17,9 +17,12 @@ class EntityReferenceAdminTest extends WebTestBase {
/**
* Modules to enable.
*
* Enable path module to ensure that the selection handler does not fail for
* entities with a path field.
*
* @var array
*/
public static $modules = array('node', 'field_ui', 'entity_reference');
public static $modules = array('node', 'field_ui', 'entity_reference', 'path');
/**
* {@inheritdoc}
......
<?php
/**
* @file
* Contains \Drupal\path\Tests\Plugin\Field\FieldType\PathFieldDefinitionTest
*/
namespace Drupal\path\Tests\Field;
use Drupal\Tests\Core\Field\FieldDefinitionTestBase;
/**
* Tests a field definition for a 'path' field.
*
* @see \Drupal\Core\Field\FieldDefinition
* @see \Drupal\path\Plugin\Field\FieldType\PathItem
*
* @group Drupal
* @group path
*/
class PathFieldDefinitionTest extends FieldDefinitionTestBase {
/**
* {@inheritdoc}
*/
public static function getInfo() {
return array(
'name' => 'Path field definitions',
'description' => 'Tests that field definitions for path fields work correctly.',
'group' => 'Path',
);
}
/**
* {@inheritdoc}
*/
protected function getPluginId() {
return 'path';
}
/**
* {@inheritdoc}
*/
protected function getNamespacePath() {
return dirname(dirname(dirname(__DIR__))) . '/lib/Drupal/path';
}
/**
* Tests FieldDefinition::getColumns().
*
* @covers \Drupal\Core\Field\FieldDefinition::getColumns
* @covers \Drupal\path\Plugin\Field\FieldType\PathItem::getSchema
*/
public function testGetColumns() {
$this->assertSame(array(), $this->definition->getColumns());
}
}
<?php
/**
* @file
* Contains \Drupal\Tests\Core\Fied\FieldDefinitionTestBase.
*/
namespace Drupal\Tests\Core\Field;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Field\FieldDefinition;
use Drupal\Core\Field\FieldTypePluginManager;
use Drupal\Core\Language\Language;
use Drupal\Tests\UnitTestCase;
/**
* Provides a test base class for testing field definitions.
*/
abstract class FieldDefinitionTestBase extends UnitTestCase {
/**
* The field definition used in this test.
*
* @var \Drupal\Core\Field\FieldDefinition
*/
protected $definition;
/**
* {@inheritdoc}
*/
public function setUp() {
$namespace_path = $this->getNamespacePath();
// Suppport both PSR-0 and PSR-4 directory layouts.
$module_name = basename($namespace_path);
if ($module_name == 'src') {
$module_name = basename($module_name);
}
$namespaces = new \ArrayObject(array(
'Drupal\\' . $module_name => $namespace_path,
));
$language_manager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
$language_manager->expects($this->once())
->method('getCurrentLanguage')
->will($this->returnValue(new Language(array('id' => 'en'))));
$module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
$module_handler->expects($this->once())
->method('moduleExists')
->with($module_name)
->will($this->returnValue(TRUE));
$plugin_manager = new FieldTypePluginManager(
$namespaces,
$this->getMock('Drupal\Core\Cache\CacheBackendInterface'),
$language_manager,
$module_handler
);
$container = new ContainerBuilder();
$container->set('plugin.manager.field.field_type', $plugin_manager);
// The 'string_translation' service is used by the @Translation annotation.
$container->set('string_translation', $this->getStringTranslationStub());
\Drupal::setContainer($container);
$this->definition = FieldDefinition::create($this->getPluginId());
}
/**
* Returns the plugin ID of the tested field type.
*
* @return string
* The plugin ID.
*/
abstract protected function getPluginId();
/**
* Returns the path to the module's classes.
*
* Depending on whether the module follows the PSR-0 or PSR-4 directory layout
* this should be either /path/to/module/lib/Drupal/mymodule or
* /path/to/module/src.
*
* @return string
* The path to the module's classes.
*/
abstract protected function getNamespacePath();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment