View source
<?php
namespace Drupal\feeds;
use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\feeds\Plugin\PluginFormFactory;
use Drupal\feeds\Plugin\Type\FeedsPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class FeedForm extends ContentEntityForm {
protected $formFactory;
public static function create(ContainerInterface $container) {
$instance = parent::create($container);
$instance
->setPluginFormFactory($container
->get('feeds_plugin_form_factory'));
return $instance;
}
protected function setPluginFormFactory(PluginFormFactory $factory) {
$this->formFactory = $factory;
}
public function form(array $form, FormStateInterface $form_state) {
$feed = $this->entity;
$feed_type = $feed
->getType();
$form['advanced'] = [
'#type' => 'vertical_tabs',
'#attributes' => [
'class' => [
'entity-meta',
],
],
'#weight' => 99,
];
$form = parent::form($form, $form_state);
$form['plugin']['#tree'] = TRUE;
foreach ($feed_type
->getPlugins() as $type => $plugin) {
if ($this
->pluginHasForm($plugin, 'feed')) {
$feed_form = $this->formFactory
->createInstance($plugin, 'feed');
$plugin_state = (new FormState())
->setValues($form_state
->getValue([
'plugin',
$type,
], []));
$form['plugin'][$type] = $feed_form
->buildConfigurationForm([], $plugin_state, $feed);
$form['plugin'][$type]['#tree'] = TRUE;
$form_state
->setValue([
'plugin',
$type,
], $plugin_state
->getValues());
}
}
$form['author'] = [
'#type' => 'details',
'#title' => $this
->t('Authoring information'),
'#group' => 'advanced',
'#attributes' => [
'class' => [
'feeds-feed-form-author',
],
],
'#weight' => 90,
'#optional' => TRUE,
];
if (isset($form['uid'])) {
$form['uid']['#group'] = 'author';
}
if (isset($form['created'])) {
$form['created']['#group'] = 'author';
}
$form['options'] = [
'#type' => 'details',
'#access' => $this
->currentUser()
->hasPermission('administer feeds'),
'#title' => $this
->t('Import options'),
'#collapsed' => TRUE,
'#group' => 'advanced',
];
$form['options']['status'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Active'),
'#default_value' => $feed
->isActive(),
'#description' => $this
->t('Uncheck the above checkbox to disable periodic import for this feed.'),
];
return $form;
}
protected function actions(array $form, FormStateInterface $form_state) {
$element = parent::actions($form, $form_state);
if ($this->entity
->access('import')) {
$element['submit']['#dropbutton'] = 'save';
$element['import'] = $element['submit'];
$element['import']['#dropbutton'] = 'save';
$element['import']['#value'] = $this
->t('Save and import');
$element['import']['#weight'] = 0;
$element['import']['#submit'][] = '::import';
}
$element['delete']['#access'] = $this->entity
->access('delete');
return $element;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
if ($form_state
->getErrors()) {
return;
}
$feed = $this
->buildEntity($form, $form_state);
foreach ($feed
->getType()
->getPlugins() as $type => $plugin) {
if (!$this
->pluginHasForm($plugin, 'feed')) {
continue;
}
$feed_form = $this->formFactory
->createInstance($plugin, 'feed');
$plugin_state = (new FormState())
->setValues($form_state
->getValue([
'plugin',
$type,
], []));
$feed_form
->validateConfigurationForm($form['plugin'][$type], $plugin_state, $feed);
$form_state
->setValue([
'plugin',
$type,
], $plugin_state
->getValues());
foreach ($plugin_state
->getErrors() as $name => $error) {
if (!empty($_SESSION['messages']['error'])) {
foreach ($_SESSION['messages']['error'] as $delta => $message) {
if ($message['message'] === $error) {
unset($_SESSION['messages']['error'][$delta]);
break;
}
}
}
$form_state
->setErrorByName($name, $error);
}
}
parent::validateForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$feed = $this->entity;
foreach ($feed
->getType()
->getPlugins() as $type => $plugin) {
if ($this
->pluginHasForm($plugin, 'feed')) {
$feed_form = $this->formFactory
->createInstance($plugin, 'feed');
$plugin_state = (new FormState())
->setValues($form_state
->getValue([
'plugin',
$type,
], []));
$feed_form
->submitConfigurationForm($form['plugin'][$type], $plugin_state, $feed);
$form_state
->setValue([
'plugin',
$type,
], $plugin_state
->getValues());
}
}
}
public function save(array $form, FormStateInterface $form_state) {
$feed = $this->entity;
$insert = $feed
->isNew();
$feed
->save();
$context = [
'@type' => $feed
->bundle(),
'%title' => $feed
->label(),
];
$t_args = [
'@type' => $feed
->getType()
->label(),
'%title' => $feed
->label(),
];
if ($insert) {
$this
->logger('feeds')
->notice('@type: added %title.', $context);
$this
->messenger()
->addMessage($this
->t('%title has been created.', $t_args));
}
else {
$this
->logger('feeds')
->notice('@type: updated %title.', $context);
$this
->messenger()
->addMessage($this
->t('%title has been updated.', $t_args));
}
if (!$feed
->id()) {
$this
->messenger()
->addError($this
->t('The feed could not be saved.'));
$form_state
->setRebuild();
return;
}
if ($feed
->access('view')) {
$form_state
->setRedirect('entity.feeds_feed.canonical', [
'feeds_feed' => $feed
->id(),
]);
}
else {
$form_state
->setRedirect('<front>');
}
}
public function import(array $form, FormStateInterface $form_state) {
$feed = $this->entity;
$feed
->startBatchImport();
return $feed;
}
protected function pluginHasForm(FeedsPluginInterface $plugin, $operation) {
return $this->formFactory
->hasForm($plugin, $operation);
}
}