From 648a5985945b8ee151188a3c8b7df16596d556ce Mon Sep 17 00:00:00 2001 From: Adam Vessey <adam@discoverygarden.ca> Date: Mon, 8 Aug 2022 11:53:08 -0300 Subject: [PATCH] More worky. ... as in, basically functional. Still needs coding standards pass, and testing with more/all types of content. --- .../AddChildrenWizard/FileSelectionForm.php | 64 ++++++++++++++----- src/Form/AddChildrenWizard/Form.php | 6 ++ 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/Form/AddChildrenWizard/FileSelectionForm.php b/src/Form/AddChildrenWizard/FileSelectionForm.php index f056d7d6..5fb29c43 100644 --- a/src/Form/AddChildrenWizard/FileSelectionForm.php +++ b/src/Form/AddChildrenWizard/FileSelectionForm.php @@ -19,8 +19,10 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Queue\QueueFactory; use Drupal\Core\Queue\QueueInterface; use Drupal\Core\Session\AccountProxyInterface; +use Drupal\Core\Url; use Drupal\file\FileInterface; use Drupal\islandora\IslandoraUtils; +use Drupal\media\MediaInterface; use Drupal\media\MediaSourceInterface; use Drupal\media\MediaTypeInterface; use Drupal\node\NodeInterface; @@ -45,7 +47,7 @@ class FileSelectionForm extends FormBase { protected ?AccountProxyInterface $currentUser; - public static function create(ContainerInterface $container) { + public static function create(ContainerInterface $container): self { $instance = parent::create($container); $instance->entityTypeManager = $container->get('entity_type.manager'); @@ -92,8 +94,12 @@ class FileSelectionForm extends FormBase { } protected function getWidget(FormStateInterface $form_state) : WidgetInterface { + return $this->doGetWidget($this->getField($form_state)); + } + + protected function doGetWidget(FieldDefinitionInterface $field) : WidgetInterface { return $this->widgetPluginManager->getInstance([ - 'field_definition' => $this->getField($form_state), + 'field_definition' => $field, 'form_mode' => 'default', 'prepare' => TRUE, ]); @@ -125,26 +131,37 @@ class FileSelectionForm extends FormBase { public function submitForm(array &$form, FormStateInterface $form_state) { $cached_values = $form_state->getTemporaryValue('wizard'); + dsm($form); dsm($form_state); + dsm($this->doGetField($cached_values)); + dsm($this->doGetField($cached_values)->getName()); + $widget = $this->getWidget($form_state); $builder = (new BatchBuilder()) ->setTitle($this->t('Creating children...')) ->setInitMessage($this->t('Initializing...')) ->setFinishCallback([$this, 'batchProcessFinished']); - foreach ($form_state->getValue($this->doGetField($cached_values)->getName()) as $file) { - $builder->addOperation([$this, 'batchProcess'], [$file, $cached_values]); + $values = $form_state->getValue($this->doGetField($cached_values)->getName()); + $massaged_values = $widget->massageFormValues($values, $form, $form_state); + dsm($values); + dsm($massaged_values); + foreach ($massaged_values as $delta => $file) { + dsm($file); + $builder->addOperation([$this, 'batchProcess'], [$delta, $file, $form, $form_state, $cached_values]); } batch_set($builder->toArray()); + $form_state->setRedirectUrl(Url::fromUri("internal:/node/{$cached_values['node']}/members")); } - public function batchProcess($fid, array $values, &$context) { + public function batchProcess($delta, $info, array $form, FormStateInterface $form_state, array $values, &$context) { $transaction = \Drupal::database()->startTransaction(); try { $taxonomy_term_storage = $this->entityTypeManager->getStorage('taxonomy_term'); + dsm(func_get_args()); /** @var FileInterface $file */ - $file = $this->entityTypeManager->getStorage('file')->load($fid); + $file = $this->entityTypeManager->getStorage('file')->load($info['target_id']); $file->setPermanent(); if ($file->save() !== SAVED_UPDATED) { throw new \Exception("Failed to update file '{$file->id()}' to be permanent."); @@ -169,15 +186,32 @@ class FileSelectionForm extends FormBase { } // Create a media with the file attached and also pointing at the node. - $media = $this->entityTypeManager->getStorage('media')->create([ - 'bundle' => $values['media_type'], - 'name' => $file->getFilename(), - IslandoraUtils::MEDIA_OF_FIELD => $node, - IslandoraUtils::MEDIA_USAGE_FIELD => $values['use'] ? - $taxonomy_term_storage->loadMultiple($values['use']) : - NULL, - $this->doGetField($values)->getName() => $file->id(), - ]); + $field = $this->doGetField($values); + $widget = $this->doGetWidget($field); + $items = FieldItemList::createInstance($field, $field->getName(), $this->getMediaType($form_state)->getTypedData()); + $items->setValue([0 => $info]); + //$items->setValue([$delta => $info]); + + $media_values = array_merge( + [ + 'bundle' => $values['media_type'], + 'name' => $file->getFilename(), + IslandoraUtils::MEDIA_OF_FIELD => $node, + IslandoraUtils::MEDIA_USAGE_FIELD => $values['use'] ? + $taxonomy_term_storage->loadMultiple($values['use']) : + NULL, + 'uid' => $this->currentUser->id(), + // XXX: Published... no constant? + 'status' => 1, + ], + [ + $field->getName() => [ + $info, + ], + ] + ); + dsm($media_values); + $media = $this->entityTypeManager->getStorage('media')->create($media_values); if ($media->save() !== SAVED_NEW) { throw new \Exception("Failed to create media for file '{$file->id()}."); } diff --git a/src/Form/AddChildrenWizard/Form.php b/src/Form/AddChildrenWizard/Form.php index d689fd37..bd2b92ae 100644 --- a/src/Form/AddChildrenWizard/Form.php +++ b/src/Form/AddChildrenWizard/Form.php @@ -83,10 +83,16 @@ class Form extends FormWizardBase { 'child_type' => [ 'title' => $this->t('Type of children'), 'form' => TypeSelectionForm::class, + 'values' => [ + 'node' => $this->nodeId, + ] ], 'child_files' => [ 'title' => $this->t('Files for children'), 'form' => FileSelectionForm::class, + 'values' => [ + 'node' => $this->nodeId, + ] ] ]; }