/** * Tests basic context definition and value getters and setters. */ function testContext() { $this->installEntitySchema('user'); $name = $this->randomMachineName(); $manager = new MockBlockManager(); $plugin = $manager->createInstance('user_name'); // Create a node, add it as context, catch the exception. $node = entity_create('node', array('title' => $name, 'type' => 'page')); // Try to get context that is missing its definition. try { $plugin->getContextDefinition('not_exists'); $this->fail('The user context should not yet be set.'); } catch (ContextException $e) { $this->assertEqual($e->getMessage(), 'The not_exists context is not a valid context.'); } // Test the getContextDefinitions() method. $user_context_definition = ContextDefinition::create('entity:user')->setLabel(t('User')); $this->assertEqual($plugin->getContextDefinitions()['user']->getLabel(), $user_context_definition->getLabel()); // Test the getContextDefinition() method for a valid context. $this->assertEqual($plugin->getContextDefinition('user')->getLabel(), $user_context_definition->getLabel()); // Try to get a context with valid definition. $this->assertNotNull($plugin->getContext('user'), 'Succeeded to get a context with a valid definition.'); // Try to get a value of a valid context, while this value has not been set. try { $plugin->getContextValue('user'); } catch (ContextException $e) { $this->assertIdentical("The 'entity:user' context is required and not present.", $e->getMessage(), 'Requesting a non-set value of a required context should throw a context exception.'); } // Try to pass the wrong class type as a context value. $plugin->setContextValue('user', $node); $violations = $plugin->validateContexts(); $this->assertTrue(!empty($violations), 'The provided context value does not pass validation.'); // Set an appropriate context value and check to make sure its methods work // as expected. $user = entity_create('user', array('name' => $name)); $plugin->setContextValue('user', $user); $this->assertEqual($plugin->getContextValue('user')->getUsername(), $user->getUsername()); $this->assertEqual($user->label(), $plugin->getTitle()); // Test Optional context handling. $plugin = $manager->createInstance('user_name_optional'); $this->assertNull($plugin->getContextValue('user'), 'Requesting a non-set value of a valid context should return NULL.'); // Test Complex compound context handling. $complex_plugin = $manager->createInstance('complex_context'); $complex_plugin->setContextValue('user', $user); // With only the user context set, try to get the context values. $values = $complex_plugin->getContextValues(); $this->assertNull($values['node'], 'The node context is not yet set.'); $this->assertNotNull($values['user'], 'The user context is set'); $complex_plugin->setContextValue('node', $node); $context_wrappers = $complex_plugin->getContexts(); // Make sure what came out of the wrappers is good. $this->assertEqual($context_wrappers['user']->getContextValue()->label(), $user->label()); $this->assertEqual($context_wrappers['node']->getContextValue()->label(), $node->label()); // Make sure what comes out of the context values is good. $contexts = $complex_plugin->getContextValues(); $this->assertEqual($contexts['user']->label(), $user->label()); $this->assertEqual($contexts['node']->label(), $node->label()); // Test the title method for the complex context plugin. $this->assertEqual($user->label() . ' -- ' . $node->label(), $complex_plugin->getTitle()); }
/** * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) { // Only allow content entities and ignore configuration entities. if (!$entity_type instanceof ContentEntityTypeInterface) { continue; } $this->derivatives["entity:{$entity_type_id}"] = ['label' => $this->t('Create @entity_type path alias', ['@entity_type' => $entity_type->getLowercaseLabel()]), 'category' => $this->t('Path'), 'entity_type_id' => $entity_type_id, 'context' => ['entity' => ContextDefinition::create("entity:{$entity_type_id}")->setLabel($entity_type->getLabel())->setRequired(TRUE)->setDescription($this->t('The @entity_type for which to create a path alias.', ['@entity_type' => $entity_type->getLowercaseLabel()])), 'alias' => ContextDefinition::create('string')->setLabel($this->t('Path alias'))->setRequired(TRUE)->setDescription($this->t("Specify an alternative path by which the content can be accessed. For example, 'about' for an about page. Use a relative path and do not add a trailing slash."))], 'provides' => []] + $base_plugin_definition; } return $this->derivatives; }
/** * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) { // Only allow content entities and ignore configuration entities. if (!$entity_type instanceof ContentEntityTypeInterface) { continue; } $this->derivatives["entity:{$entity_type_id}"] = ['label' => $this->t('Create a new @entity_type', ['@entity_type' => $entity_type->getLowercaseLabel()]), 'category' => $entity_type->getLabel(), 'entity_type_id' => $entity_type_id, 'context' => [], 'provides' => ['entity' => ContextDefinition::create("entity:{$entity_type_id}")->setLabel($entity_type->getLabel())->setRequired(TRUE)]] + $base_plugin_definition; // Add a required context for the bundle key, and optional contexts for // other required base fields. This matches the storage create() behavior, // where only the bundle requirement is enforced. $bundle_key = $entity_type->getKey('bundle'); $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id); foreach ($base_field_definitions as $field_name => $definition) { if ($field_name != $bundle_key && !$definition->isRequired()) { continue; } $required = $field_name == $bundle_key; $multiple = $definition->getCardinality() === 1 ? FALSE : TRUE; $this->derivatives["entity:{$entity_type_id}"]['context'][$field_name] = ContextDefinition::create($definition->getType())->setLabel($definition->getLabel())->setRequired($required)->setMultiple($multiple)->setDescription($definition->getDescription()); } } return $this->derivatives; }