diff --git a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php index 9e179eef8fab557de27ff8b250371cea845bdce2..64218f6345c174500edabab652acc71498af9c61 100644 --- a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php +++ b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php @@ -28,7 +28,34 @@ class MediaLibrarySelectForm extends FieldPluginBase { * {@inheritdoc} */ public function getValue(ResultRow $row, $field = NULL) { - return '<!--form-item-' . $this->options['id'] . '--' . $row->index . '-->'; + return '<!--form-item-' . $this->options['id'] . '--' . $row->mid . '-->'; + } + + /** + * Return the name of a form field. + * + * @see \Drupal\views\Form\ViewsFormMainForm + * + * @return string + * The form field name. + */ + public function form_element_name(): string { + return $this->field; + } + + /** + * Return a media entity ID from a views result row. + * + * @see \Drupal\views\Form\ViewsFormMainForm + * + * @param int $row_id + * The index of a views result row. + * + * @return string + * The ID of a media entity. + */ + public function form_element_row_id(int $row_id): string { + return $this->view->result[$row_id]->mid; } /** @@ -70,7 +97,7 @@ public function viewsForm(array &$form, FormStateInterface $form_state) { $form[$this->options['id']][$row_index] = []; continue; } - $form[$this->options['id']][$row_index] = [ + $form[$this->options['id']][$row->mid] = [ '#type' => 'checkbox', '#title' => $this->t('Select @label', [ '@label' => $entity->label(), diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php index 36e294abb77a5fdd9b651703f03ca3578b6b5854..dfe78f7419529cbabea2ab3b9ca96294b144e57e 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php @@ -7,6 +7,7 @@ use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\FunctionalJavascriptTests\WebDriverTestBase; +use Drupal\media\Entity\Media; use Drupal\Tests\TestFileCreationTrait; /** @@ -136,10 +137,13 @@ public function testInsertionAndReselection($widget) { return $wrapper->hasButton('Add media'); }); // Test reinserting the same selection. + $media_items = Media::loadMultiple(); + $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); $wrapper->pressButton('Add media'); $this->assertNotNull($assert_session->waitForText('Add or select media')); $assert_session->elementExists('xpath', "(//div[contains(@class, 'media-library-item')])[1]")->click(); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected'); $this->assertNotNull($assert_session->waitForElementVisible('xpath', $first_item_locator)); } diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php index 87d9df666a4b59e091f50bce69d32b8cfa6fe014..42cb0595121d23f0c0808b51f60e70234857d640 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php @@ -97,14 +97,15 @@ public function testWidgetOEmbed() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($youtube_title); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the created oEmbed video is correctly added to the widget. $this->pressInsertSelected('Added one media item.'); @@ -158,19 +159,20 @@ public function testWidgetOEmbed() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Custom video title'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select Custom video title"); $assert_session->checkboxChecked("Select $youtube_title"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -209,7 +211,7 @@ public function testWidgetOEmbed() { $this->waitForText('The media item has been created but has not yet been saved'); $page->fillField('Name', 'Another video'); $this->pressSaveButton(); - $page->uncheckField('media_library_select_form[1]'); + $page->uncheckField("media_library_select_form[$selected_item_id]"); $this->waitForText('1 item selected'); $this->pressInsertSelected('Added one media item.'); $this->waitForText('Another video'); @@ -283,14 +285,15 @@ public function testWidgetOEmbedAdvancedUi() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($youtube_title); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the created oEmbed video is correctly added to the widget. $this->pressInsertSelected('Added one media item.'); @@ -346,19 +349,20 @@ public function testWidgetOEmbedAdvancedUi() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Custom video title'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select Custom video title"); $assert_session->checkboxChecked("Select $youtube_title"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -409,10 +413,11 @@ public function testWidgetOEmbedAdvancedUi() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); $this->waitForText('1 item selected'); $assert_session->checkboxChecked('Select Another video'); $assert_session->checkboxNotChecked("Select $vimeo_title"); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); $this->pressInsertSelected('Added one media item.'); $this->waitForText('Another video'); diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php index 75e378c9a53bf378379a6f584c25008db78b6c2b..5afbb4f5254da0738130c19357f85eff345c47c1 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php @@ -121,7 +121,7 @@ public function testWidgetUpload() { $this->waitForText('Alternative text field is required'); $page->fillField('Alternative text', $this->randomString()); $this->pressSaveButton(); - $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[0]\']").is(":focus")'); + $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[1]\']").is(":focus")'); // The file should be permanent now. $files = $file_storage->loadMultiple(); $file = array_pop($files); @@ -129,15 +129,16 @@ public function testWidgetUpload() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($png_image->filename); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); $assert_session->pageTextContains('1 of 2 items selected'); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); // Ensure the created item is added in the widget. $this->pressInsertSelected('Added one media item.'); $this->waitForText($png_image->filename); @@ -179,19 +180,20 @@ public function testWidgetUpload() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Unlimited Cardinality Image'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -259,10 +261,11 @@ public function testWidgetUpload() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); $assert_session->pageTextContains('1 item selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxNotChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); $this->pressInsertSelected('Added one media item.'); $this->waitForText($file_system->basename($png_uri_5)); @@ -461,7 +464,7 @@ public function testWidgetUploadAdvancedUi() { $this->waitForText('Alternative text field is required'); $page->fillField('Alternative text', $this->randomString()); $this->saveAnd('select'); - $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[0]\']").is(":focus")'); + $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[1]\']").is(":focus")'); // The file should be permanent now. $files = $file_storage->loadMultiple(); $file = array_pop($files); @@ -469,15 +472,16 @@ public function testWidgetUploadAdvancedUi() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($png_image->filename); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); $assert_session->pageTextContains('1 of 2 items selected'); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); // Ensure the created item is added in the widget. $this->pressInsertSelected('Added one media item.'); $this->waitForText($png_image->filename); @@ -523,19 +527,20 @@ public function testWidgetUploadAdvancedUi() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Unlimited Cardinality Image'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -634,10 +639,11 @@ public function testWidgetUploadAdvancedUi() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); $assert_session->pageTextContains('1 item selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxNotChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); $this->pressInsertSelected('Added one media item.'); $this->waitForText($file_system->basename($png_uri_5));