View source
<?php
namespace Drupal\iframe\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Component\Utility\Random;
class IframeItem extends FieldItemBase {
public static function defaultFieldSettings() {
return [
'title' => NULL,
'class' => NULL,
'height' => NULL,
'width' => NULL,
'frameborder' => NULL,
'scrolling' => NULL,
'transparency' => NULL,
'tokensupport' => NULL,
'allowfullscreen' => NULL,
] + parent::defaultFieldSettings();
}
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['url'] = DataDefinition::create('string')
->setLabel(t('URL'));
$properties['title'] = DataDefinition::create('string')
->setLabel(t('Title text'));
$properties['width'] = DataDefinition::create('string')
->setLabel(t('Width'));
$properties['height'] = DataDefinition::create('string')
->setLabel(t('Height'));
$properties['class'] = DataDefinition::create('string')
->setLabel(t('Css class'));
$properties['frameborder'] = DataDefinition::create('string')
->setLabel(t('Frameborder'));
$properties['scrolling'] = DataDefinition::create('string')
->setLabel(t('Scrolling'));
$properties['transparency'] = DataDefinition::create('string')
->setLabel(t('Transparency'));
$properties['tokensupport'] = DataDefinition::create('string')
->setLabel(t('Token support'));
$properties['allowfullscreen'] = DataDefinition::create('string')
->setLabel(t('Allow fullscreen'));
return $properties;
}
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
'columns' => [
'url' => [
'description' => 'The URL of the iframe.',
'type' => 'varchar',
'length' => 2048,
'not null' => FALSE,
'sortable' => TRUE,
'default' => '',
],
'title' => [
'description' => 'The iframe title text.',
'type' => 'varchar',
'length' => 255,
'not null' => FALSE,
'sortable' => TRUE,
'default' => '',
],
'class' => [
'description' => 'When output, this iframe will have this CSS class attribute. Multiple classes should be separated by spaces.',
'type' => 'varchar',
'length' => '255',
'not null' => FALSE,
'default' => '',
],
'width' => [
'description' => 'The iframe width.',
'type' => 'varchar',
'length' => 4,
'not null' => FALSE,
'default' => '600',
],
'height' => [
'description' => 'The iframe height.',
'type' => 'varchar',
'length' => 4,
'not null' => FALSE,
'default' => '800',
],
'frameborder' => [
'description' => 'Frameborder is the border around the iframe. Most people want it removed, so the default value for frameborder is zero (0), or no border.',
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
],
'scrolling' => [
'description' => 'Scrollbars help the user to reach all iframe content despite the real height of the iframe content. Please disable it only if you know what you are doing.',
'type' => 'varchar',
'length' => 4,
'not null' => TRUE,
'default' => 'auto',
],
'transparency' => [
'description' => 'Allow transparency per CSS in the outer iframe tag. You have to set background-color:transparent in your iframe body tag too!',
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
],
'tokensupport' => [
'description' => 'Are tokens allowed for users to use in title or URL field?',
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
],
'allowfullscreen' => [
'description' => 'Allow fullscreen for iframe. The iframe can activate fullscreen mode by calling the requestFullscreen() method.',
'type' => 'int',
'size' => 'tiny',
'not null' => TRUE,
'default' => 0,
],
],
'indexes' => [
'url' => [
'url',
],
],
];
}
public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
$element = [];
$settings = $this
->getSettings() + self::defaultFieldSettings();
$element['class'] = [
'#type' => 'textfield',
'#title' => $this
->t('CSS Class'),
'#default_value' => $settings['class'],
];
$element['frameborder'] = [
'#type' => 'radios',
'#title' => $this
->t('Frameborder'),
'#default_value' => $settings['frameborder'],
'#options' => [
'0' => $this
->t('No frameborder'),
'1' => $this
->t('Show frameborder'),
],
];
$element['scrolling'] = [
'#type' => 'radios',
'#title' => $this
->t('Scrolling'),
'#default_value' => $settings['scrolling'],
'#options' => [
'auto' => $this
->t('Automatic'),
'no' => $this
->t('Disabled'),
'yes' => $this
->t('Enabled'),
],
];
$element['transparency'] = [
'#type' => 'radios',
'#title' => $this
->t('Transparency'),
'#default_value' => $settings['transparency'],
'#options' => [
'0' => $this
->t('No transparency'),
'1' => $this
->t('Allow transparency'),
],
'#description' => $this
->t('Allow transparency per CSS in the outer iframe tag. You have to set background-color:transparent in your iframe body tag too!'),
];
$element['allowfullscreen'] = [
'#type' => 'select',
'#title' => $this
->t('Allow fullscreen'),
'#options' => [
'0' => $this
->t('false'),
'1' => $this
->t('true'),
],
'#default_value' => $settings['allowfullscreen'],
'#description' => $this
->t('Allow fullscreen for iframe. The iframe can activate fullscreen mode by calling the requestFullscreen() method.'),
];
$element['tokensupport'] = [
'#type' => 'radios',
'#title' => $this
->t('Token Support'),
'#default_value' => $settings['tokensupport'],
'#options' => [
'0' => $this
->t('No tokens allowed'),
'1' => $this
->t('Tokens only in title field'),
'2' => $this
->t('Tokens for title and URL field'),
],
'#description' => $this
->t('Are tokens allowed for users to use in title or URL field?'),
];
if (!\Drupal::moduleHandler()
->moduleExists('token')) {
$element['tokensupport']['#description'] .= ' ' . t('Attention: Token module is not currently enabled!');
}
return $element;
}
public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
$tlds = [
'com',
'net',
'gov',
'org',
'edu',
'biz',
'info',
];
$domain_length = mt_rand(7, 15);
$random = new Random();
switch ($field_definition
->getSetting('title')) {
case DRUPAL_DISABLED:
$values['title'] = '';
break;
case DRUPAL_REQUIRED:
$values['title'] = $random
->sentences(4);
break;
case DRUPAL_OPTIONAL:
$values['title'] = mt_rand(0, 1) ? $random
->sentences(4) : '';
break;
}
$values['url'] = 'https://www.' . $random
->word($domain_length) . '.' . $tlds[mt_rand(0, count($tlds) - 1)];
return $values;
}
public function isEmpty() {
$value = $this
->get('url')
->getValue();
return $value === NULL || $value === '';
}
public static function mainPropertyName() {
return 'url';
}
public function getTokenSupport() {
$value = $this
->getSetting('tokensupport');
$value = empty($value) ? 0 : (int) $value;
return $value;
}
}