marketo_suite-1.0.x-dev/e3_marketo.module
e3_marketo.module
<?php
/**
* @file
* Contains e3_marketo module hooks.
*/
use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Render\Markup;
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Implements hook_help().
*/
function e3_marketo_help($route_name, RouteMatchInterface $route_match) {
return $route_name === 'help.page.e3_marketo' ?
check_markup(file_get_contents(dirname(__FILE__) . "/README.md")) : NULL;
}
/**
* Implements hook_entity_extra_field_info().
*/
function e3_marketo_entity_extra_field_info() {
$content_types = \Drupal::service('entity_type.bundle.info')->getBundleInfo('marketo_form');
$extra = [];
if ($content_types) {
// Create embed pseudo-field for each Marketo Bundle.
foreach (array_keys($content_types) as $bundle_id) {
$extra['marketo_form'][$bundle_id]['display']['marketo_form_embed'] = [
'label' => t('Marketo Form Embed'),
'description' => t('Embedded Marketo form'),
'weight' => 0,
'visible' => TRUE,
];
}
}
return $extra;
}
/**
* Implements hook_theme().
*/
function e3_marketo_theme() {
return [
'marketo_form' => [
'render element' => 'elements',
],
'marketo_form_embed' => [
'template' => 'marketo-form-embed',
'variables' => [
'form_attributes' => [],
'footer_html' => '',
'entity_id' => NULL,
],
],
];
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function e3_marketo_theme_suggestions_marketo_form(array $variables) {
$suggestions = [];
$marketo_form = $variables['elements']['#marketo_form'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
$suggestions[] = 'marketo_form__' . $sanitized_view_mode;
$suggestions[] = 'marketo_form__' . $marketo_form->bundle();
$suggestions[] = 'marketo_form__' . $marketo_form->bundle() . '__' . $sanitized_view_mode;
$suggestions[] = 'marketo_form__' . $marketo_form->id();
$suggestions[] = 'marketo_form__' . $marketo_form->id() . '__' . $sanitized_view_mode;
return $suggestions;
}
/**
* Prepare variables for marketo_form entity templates.
*/
function e3_marketo_preprocess_marketo_form(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
$variables['marketo_form'] = $variables['elements']['#marketo_form'];
// Override form title if specified.
if (!empty($variables['marketo_form']->_referringItem)) {
/** @var \Drupal\Core\Entity\FieldableEntityInterface $parent */
$parent = $variables['marketo_form']->_referringItem->getEntity();
if ($parent->hasField('field_marketo_form_title') && !$parent->get('field_marketo_form_title')->isEmpty()) {
$variables['title_override'] = $parent->get('field_marketo_form_title')->value;
}
}
$route_match = \Drupal::routeMatch();
if ($route_match->getRouteName() === 'entity.marketo_form.canonical') {
$marketo_form = $route_match->getParameter('marketo_form');
if ($variables['marketo_form']->id() === $marketo_form->id()) {
$variables['page'] = TRUE;
}
}
// Add nojs copy.
$no_js_message = \Drupal::config('e3_marketo.settings')->get('load_error_message.value');
if ($no_js_message) {
$variables['no_js_message'] = ['#markup' => $no_js_message];
}
// Helpful $content variable for templates.
$variables += ['content' => []];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Implements hook_library_info_alter().
*/
function e3_marketo_library_info_alter(&$libraries, $extension) {
// Set correct Marketo host for the remote marketo forms library.
if ($extension == 'e3_marketo' && isset($libraries['marketo-forms-remote'])) {
$marketo_settings = \Drupal::config('e3_marketo.settings');
$marketo_host = $marketo_settings->get('instance_host');
if ($marketo_host) {
$default_key = '//app-xxxx.marketo.com/js/forms2/js/forms2.min.js';
$libraries['marketo-forms-remote']['js']["{$marketo_host}/js/forms2/js/forms2.min.js"] = $libraries['marketo-forms-remote']['js'][$default_key];
unset($libraries['marketo-forms-remote']['js'][$default_key]);
}
}
}
/**
* Implements hook_page_attachments().
*/
function e3_marketo_page_attachments(array &$page) {
// Make sure Munchkin code is loaded on every page.
if (empty($page['#attached']['library'])) {
$page['#attached']['library'] = [];
}
if (!in_array('e3_marketo/e3-marketo-munchkin', $page['#attached']['library'])) {
$page['#attached']['library'][] = 'e3_marketo/e3-marketo-munchkin';
}
if (empty($page['#attached']['drupalSettings']['marketoForms']['munchkinId'])) {
$page['#attached']['drupalSettings']['marketoForms']['munchkinId'] = \Drupal::config('e3_marketo.settings')->get('munchkin_id');
}
// Attach Marketo Personalization script to every page if applicable.
$marketo_settings = \Drupal::config('e3_marketo.settings');
$personalization_embed_code = $marketo_settings->get('personalization_embed_code');
if ($personalization_embed_code) {
$page['#attached']['html_head'][] = [
[
'#tag' => 'script',
'#value' => Markup::create($personalization_embed_code),
'#weight' => -1,
'#attributes' => [
'type' => 'text/javascript',
],
],
'key',
];
}
}
/**
* Helper function for the GNY Reports block.
*
* Helps on generating the options dynamically for the reports selection field.
*
* @param \Drupal\Core\Field\FieldStorageDefinitionInterface $definition
* The field storage definition.
* @param \Drupal\Core\Entity\FieldableEntityInterface|null $entity
* (optional) The entity context if known, or NULL if the allowed values are
* being collected without the context of a specific entity.
* @param bool &$cacheable
* (optional) If an $entity is provided, the $cacheable parameter should be
* modified by reference and set to FALSE if the set of allowed values
* returned was specifically adjusted for that entity and cannot not be reused
* for other entities. Defaults to TRUE.
*
* @return array
* The array of allowed values.
*
* @throws \Drupal\Component\Plugin\Exception\PluginException
*/
function _e3_marketo_behavior_options(FieldStorageDefinitionInterface $definition, FieldableEntityInterface $entity = NULL, bool &$cacheable = FALSE) : array {
/** @var \Drupal\e3_marketo\Plugin\SubmissionBehaviorManager $report_manager */
$report_manager = \Drupal::service('plugin.manager.submission_behavior_manager');
return $report_manager->getBehaviorOptions();
}
