diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/UriWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/UriWidget.php new file mode 100644 index 0000000000000000000000000000000000000000..39606c6cc90db34b85c0a5f11e7a127b93d0bf47 --- /dev/null +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/UriWidget.php @@ -0,0 +1,85 @@ + 60, + 'placeholder' => '', + ) + parent::defaultSettings(); + } + + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, array &$form_state) { + $element['size'] = array( + '#type' => 'number', + '#title' => $this->t('Size of URI field'), + '#default_value' => $this->getSetting('size'), + '#required' => TRUE, + '#min' => 1, + ); + $element['placeholder'] = array( + '#type' => 'textfield', + '#title' => $this->t('Placeholder'), + '#default_value' => $this->getSetting('placeholder'), + '#description' => $this->t('Text that will be shown inside the field until a value is entered. This hint is usually a sample value or a brief description of the expected format.'), + ); + return $element; + } + + /** + * {@inheritdoc} + */ + public function settingsSummary() { + $summary = array(); + + $summary[] = $this->t('URI field size: !size', array('!size' => $this->getSetting('size'))); + $placeholder = $this->getSetting('placeholder'); + if (!empty($placeholder)) { + $summary[] = $this->t('Placeholder: @placeholder', array('@placeholder' => $placeholder)); + } + + return $summary; + } + + /** + * {@inheritdoc} + */ + public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, array &$form_state) { + $element['value'] = $element + array( + '#type' => 'url', + '#default_value' => isset($items[$delta]->value) ? $items[$delta]->value : NULL, + '#size' => $this->getSetting('size'), + '#placeholder' => $this->getSetting('placeholder'), + '#maxlength' => $this->getFieldSetting('max_length'), + ); + return $element; + } + +} diff --git a/core/modules/aggregator/aggregator.info.yml b/core/modules/aggregator/aggregator.info.yml index 1a690eeb0ffd64307599ec3adc1374808ba41811..af55280a6e010ce4e3e8f67892ccd9fd92b65711 100644 --- a/core/modules/aggregator/aggregator.info.yml +++ b/core/modules/aggregator/aggregator.info.yml @@ -7,3 +7,4 @@ core: 8.x configure: aggregator.admin_settings dependencies: - file + - options diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Entity/Feed.php b/core/modules/aggregator/lib/Drupal/aggregator/Entity/Feed.php index ff93c30d72fc6fbef1d48cbcccb3d53c294e7c1b..daa3fba7bdac6f6c9214c1ccf60779daeab98fea 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Entity/Feed.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Entity/Feed.php @@ -144,7 +144,13 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields['title'] = FieldDefinition::create('string') ->setLabel(t('Title')) - ->setDescription(t('The title of the feed.')); + ->setDescription(t('The name of the feed (or the name of the website providing the feed).')) + ->setRequired(TRUE) + ->setSetting('max_length', 255) + ->setDisplayOptions('form', array( + 'type' => 'string', + 'weight' => -5, + )); $fields['langcode'] = FieldDefinition::create('language') ->setLabel(t('Language code')) @@ -152,12 +158,28 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields['url'] = FieldDefinition::create('uri') ->setLabel(t('URL')) - ->setDescription(t('The URL to the feed.')); - - $fields['refresh'] = FieldDefinition::create('integer') - ->setLabel(t('Refresh')) - ->setDescription(t('How often to check for new feed items, in seconds.')) - ->setSetting('unsigned', TRUE); + ->setDescription(t('The fully-qualified URL of the feed.')) + ->setRequired(TRUE) + ->setSetting('max_length', NULL) + ->setDisplayOptions('form', array( + 'type' => 'uri', + 'weight' => -3, + )); + + $intervals = array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200); + $period = array_map('format_interval', array_combine($intervals, $intervals)); + $period[AGGREGATOR_CLEAR_NEVER] = t('Never'); + + $fields['refresh'] = FieldDefinition::create('list_integer') + ->setLabel(t('Update interval')) + ->setDescription(t('The length of time between feed updates. Requires a correctly configured cron maintenance task.', array('@cron' => url('admin/reports/status')))) + ->setSetting('unsigned', TRUE) + ->setRequired(TRUE) + ->setSetting('allowed_values', $period) + ->setDisplayOptions('form', array( + 'type' => 'options_select', + 'weight' => -2, + )); $fields['checked'] = FieldDefinition::create('timestamp') ->setLabel(t('Checked')) diff --git a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php index e80a1d3b66c04144a247394a92ebd154a3719f2e..51fdc8f33d02db37ebe79a49a31b6875ce2fc93b 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/FeedFormController.php @@ -23,39 +23,16 @@ class FeedFormController extends ContentEntityFormController { */ public function form(array $form, array &$form_state) { $feed = $this->entity; - $intervals = array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200); - $period = array_map('format_interval', array_combine($intervals, $intervals)); - $period[AGGREGATOR_CLEAR_NEVER] = $this->t('Never'); - - $form['title'] = array( - '#type' => 'textfield', - '#title' => $this->t('Title'), - '#default_value' => $feed->label(), - '#maxlength' => 255, - '#description' => $this->t('The name of the feed (or the name of the website providing the feed).'), - '#required' => TRUE, - ); + // @todo: convert to a language selection widget defined in the base field. + // Blocked on https://drupal.org/node/2226493 which adds a generic + // language widget. $form['langcode'] = array( '#title' => $this->t('Language'), '#type' => 'language_select', '#default_value' => $feed->language()->id, '#languages' => Language::STATE_ALL, - ); - - $form['url'] = array( - '#type' => 'url', - '#title' => $this->t('URL'), - '#default_value' => $feed->getUrl(), - '#maxlength' => NULL, - '#description' => $this->t('The fully-qualified URL of the feed.'), - '#required' => TRUE, - ); - $form['refresh'] = array('#type' => 'select', - '#title' => $this->t('Update interval'), - '#default_value' => $feed->getRefreshRate(), - '#options' => $period, - '#description' => $this->t('The length of time between feed updates. Requires a correctly configured cron maintenance task.', array('@cron' => url('admin/reports/status'))), + '#weight' => -4, ); return parent::form($form, $form_state, $feed); diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php index e900025f5222e05d3bb9b687997edf19669eef4a..6a85657bc46f083c3e4c7d2bed7fc4a36d8c7cd1 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php @@ -54,9 +54,9 @@ function setUp() { function createFeed($feed_url = NULL, array $edit = array()) { $edit = $this->getFeedEditArray($feed_url, $edit); $this->drupalPostForm('aggregator/sources/add', $edit, t('Save')); - $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), format_string('The feed !name has been added.', array('!name' => $edit['title']))); + $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title[0][value]'])), format_string('The feed !name has been added.', array('!name' => $edit['title[0][value]']))); - $fid = db_query("SELECT fid FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $edit['title'], ':url' => $edit['url']))->fetchField(); + $fid = db_query("SELECT fid FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $edit['title[0][value]'], ':url' => $edit['url[0][value]']))->fetchField(); $this->assertTrue(!empty($fid), 'The feed found in database.'); return aggregator_feed_load($fid); } @@ -93,8 +93,8 @@ function getFeedEditArray($feed_url = NULL, array $edit = array()) { )); } $edit += array( - 'title' => $feed_name, - 'url' => $feed_url, + 'title[0][value]' => $feed_name, + 'url[0][value]' => $feed_url, 'refresh' => '900', ); return $edit; @@ -233,7 +233,7 @@ function uniqueFeed($feed_name, $feed_url) { function getValidOpml($feeds) { // Properly escape URLs so that XML parsers don't choke on them. foreach ($feeds as &$feed) { - $feed['url'] = htmlspecialchars($feed['url']); + $feed['url[0][value]'] = htmlspecialchars($feed['url[0][value]']); } /** * Does not have an XML declaration, must pass the parser. @@ -243,18 +243,18 @@ function getValidOpml($feeds) {
-