class FormAssemblyEntityViewBuilder in FormAssembly 8
Prepares the FormAssembly entity for display.
@author Shawn P. Duncan <code@sd.shawnduncan.org>
Copyright 2018 by Shawn P. Duncan. This code is released under the GNU General Public License. Which means that it is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. http://www.gnu.org/licenses/gpl.html @package Drupal\formassembly
Hierarchy
- class \Drupal\Core\Entity\EntityHandlerBase uses DependencySerializationTrait, StringTranslationTrait
- class \Drupal\Core\Entity\EntityViewBuilder implements EntityHandlerInterface, EntityViewBuilderInterface, TrustedCallbackInterface uses DeprecatedServicePropertyTrait
- class \Drupal\formassembly\Entity\FormAssemblyEntityViewBuilder
- class \Drupal\Core\Entity\EntityViewBuilder implements EntityHandlerInterface, EntityViewBuilderInterface, TrustedCallbackInterface uses DeprecatedServicePropertyTrait
Expanded class hierarchy of FormAssemblyEntityViewBuilder
File
- src/
Entity/ FormAssemblyEntityViewBuilder.php, line 26
Namespace
Drupal\formassembly\EntityView source
class FormAssemblyEntityViewBuilder extends EntityViewBuilder {
/**
* Formassembly markup service.
*
* @var \Drupal\formassembly\ApiMarkup
*/
protected $markup;
/**
* Default logger channel.
*
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
/**
* Injected service.
*
* @var \Drupal\Core\PageCache\ResponsePolicy\KillSwitch
*/
protected $killSwitch;
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
$instance = parent::createInstance($container, $entity_type);
$instance->markup = $container
->get('formassembly.markup');
$instance->logger = $container
->get('logger.channel.default');
$instance->killSwitch = $container
->get('page_cache_kill_switch');
return $instance;
}
/**
* {@inheritdoc}
*/
public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
// The interface does not allow type hinting to an entity type.
if (!$entity instanceof FormAssemblyEntity) {
return [];
}
if (empty($_GET['tfa_next'])) {
$markup = $this->markup
->getFormMarkup($entity);
}
else {
$markup = $this->markup
->getNextForm($_GET['tfa_next']);
}
list($attached, $bodyMarkup) = $this
->splitMarkup($markup);
$content['fa_markup'] = [
'#type' => 'markup',
'#markup' => new FormBodyUnescapedMarkup($bodyMarkup),
'#cache' => [
'max-age' => 0,
],
'#attached' => [
'fa_form_attachments' => $attached,
],
];
// No bubbling of max age:
// @see https://www.drupal.org/project/drupal/issues/2352009.
$this->killSwitch
->trigger();
return $content;
}
/**
* Helper method to parse the markup into head and body.
*
* @param string $markup
* The markup returned from formassembly.
*
* @return array
* An array with 'head' and 'body' for expansion via list().
*/
protected function splitMarkup($markup) {
// Now, per FormAssembly support, we'll try to find a <div> element with
// the class name "wFormContainer".
$crawler = new Crawler();
$crawler
->addContent($markup);
// Symfony's crawler will get the html inside the filtered tag.
$innerBody = $crawler
->filter('.wFormContainer')
->html();
// If we found the body wrapper div:
if (!empty($innerBody)) {
// Grab the raw html of the header.
// Just in case there's another wrapper, we get the HTML before the first
// <div>, which is probably the same <div> we just found.
$headMarkup = substr($markup, 0, stripos($markup, '<div'));
$headMarkup = trim($headMarkup);
// Process and extract attachable items from this raw markup.
$attached = $this
->attachedHead($headMarkup);
// Re-assemble the form wrapper filtered above.
$bodyMarkup = "<div class=\"wFormContainer\">{$innerBody}</div>";
}
else {
// Fall back to using the entire markup in the body.
$attached = [];
$bodyMarkup = trim($markup);
}
return [
$attached,
$bodyMarkup,
];
}
/**
* Helper method to take raw header from FormAssembly and prep for render.
*
* @param string $rawHeadMarkup
* The extracted head hmtl.
*
* @return array
* Array prepared for #attached.
*/
protected function attachedHead($rawHeadMarkup) {
$attached = [];
$crawler = new Crawler();
$crawler
->addContent($rawHeadMarkup);
libxml_use_internal_errors(TRUE);
foreach ($crawler
->filter('script, link[type="text/css"]') as $index => $node) {
switch ($node->tagName) {
case 'script':
if ($node
->hasAttribute('src')) {
$attached[] = [
'#type' => 'fa_form_external_js',
'#src' => $node
->getAttribute('src'),
'#weight' => $index,
];
}
else {
$attached[] = [
'#type' => 'fa_form_inline_js',
'#value' => $node->textContent,
'#weight' => $index,
];
}
break;
case 'link':
$attached[] = [
'#type' => 'fa_form_external_css',
'#rel' => $node
->getAttribute('rel'),
'#href' => $node
->getAttribute('href'),
'#weight' => $index,
];
break;
}
}
return $attached;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
DeprecatedServicePropertyTrait:: |
public | function | Allows to access deprecated/removed properties. | |
EntityHandlerBase:: |
protected | property | The module handler to invoke hooks on. | 2 |
EntityHandlerBase:: |
protected | function | Gets the module handler. | 2 |
EntityHandlerBase:: |
public | function | Sets the module handler for this handler. | |
EntityViewBuilder:: |
protected | property | The cache bin used to store the render cache. | |
EntityViewBuilder:: |
protected | property | ||
EntityViewBuilder:: |
protected | property | The entity display repository. | |
EntityViewBuilder:: |
protected | property | The entity repository service. | |
EntityViewBuilder:: |
protected | property | Information about the entity type. | |
EntityViewBuilder:: |
protected | property | The type of entities for which this view builder is instantiated. | |
EntityViewBuilder:: |
protected | property | The language manager. | |
EntityViewBuilder:: |
protected | property | The EntityViewDisplay objects created for individual field rendering. | |
EntityViewBuilder:: |
protected | property | The theme registry. | |
EntityViewBuilder:: |
protected | function | Add contextual links. | |
EntityViewBuilder:: |
protected | function | Specific per-entity building. | 1 |
EntityViewBuilder:: |
public | function | Builds an entity's view; augments entity defaults. | |
EntityViewBuilder:: |
public | function |
Builds the component fields and properties of a set of entities. Overrides EntityViewBuilderInterface:: |
6 |
EntityViewBuilder:: |
public | function | Builds multiple entities' views; augments entity defaults. | |
EntityViewBuilder:: |
protected | function | Provides entity-specific defaults to the build process. | 4 |
EntityViewBuilder:: |
public | function |
The cache tag associated with this entity view builder. Overrides EntityViewBuilderInterface:: |
|
EntityViewBuilder:: |
protected | function | Gets an EntityViewDisplay for rendering an individual field. | |
EntityViewBuilder:: |
protected | function | Determines whether the view mode is cacheable. | |
EntityViewBuilder:: |
public | function |
Resets the entity render cache. Overrides EntityViewBuilderInterface:: |
|
EntityViewBuilder:: |
public static | function |
Lists the trusted callbacks provided by the implementing class. Overrides TrustedCallbackInterface:: |
2 |
EntityViewBuilder:: |
public | function |
Builds a renderable array for the value of a single field in an entity. Overrides EntityViewBuilderInterface:: |
|
EntityViewBuilder:: |
public | function |
Builds a renderable array for a single field item. Overrides EntityViewBuilderInterface:: |
|
EntityViewBuilder:: |
public | function |
Builds the render array for the provided entities. Overrides EntityViewBuilderInterface:: |
4 |
EntityViewBuilder:: |
public | function | Constructs a new EntityViewBuilder. | 2 |
FormAssemblyEntityViewBuilder:: |
protected | property | Injected service. | |
FormAssemblyEntityViewBuilder:: |
protected | property | Default logger channel. | |
FormAssemblyEntityViewBuilder:: |
protected | property | Formassembly markup service. | |
FormAssemblyEntityViewBuilder:: |
protected | function | Helper method to take raw header from FormAssembly and prep for render. | |
FormAssemblyEntityViewBuilder:: |
public static | function |
Instantiates a new instance of this entity handler. Overrides EntityViewBuilder:: |
|
FormAssemblyEntityViewBuilder:: |
protected | function | Helper method to parse the markup into head and body. | |
FormAssemblyEntityViewBuilder:: |
public | function |
Builds the render array for the provided entity. Overrides EntityViewBuilder:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
TrustedCallbackInterface:: |
constant | Untrusted callbacks throw exceptions. | ||
TrustedCallbackInterface:: |
constant | Untrusted callbacks trigger silenced E_USER_DEPRECATION errors. | ||
TrustedCallbackInterface:: |
constant | Untrusted callbacks trigger E_USER_WARNING errors. |