View source
<?php
namespace Drupal\uc_file\Form;
use Drupal\Core\Form\ConfirmFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\Component\Serialization\Json;
class FileDeleteForm extends ConfirmFormBase {
public function getQuestion() {
return $this
->t('Delete file(s)?');
}
public function getDescription() {
return $this
->t('Deleting a file will remove all its associated file downloads and product features. Removing a directory will remove any files it contains and their associated file downloads and product features.');
}
public function getConfirmText() {
return $this
->t('Yes');
}
public function getCancelText() {
return $this
->t('No');
}
public function getCancelUrl() {
return Url::fromRoute('uc_file.downloads');
}
public function getFormId() {
return 'uc_file_deletion_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$file_ids = array_filter($form_state
->getValue('file_select'));
$form['file_ids'] = [
'#type' => 'value',
'#value' => $file_ids,
];
$form['action'] = [
'#type' => 'value',
'#value' => $form_state
->getValue([
'uc_file_action',
'action',
]),
];
$file_ids = _uc_file_sort_names(_uc_file_get_dir_file_ids($file_ids, FALSE));
$affected_list = $this
->buildJsFileDisplay($file_ids);
$has_directory = FALSE;
foreach ($file_ids as $file_id) {
$file = uc_file_get_by_id($file_id);
$filename = $file->filename;
$file_list[] = substr($filename, -1) == '/' ? $filename . ' (' . $this
->t('directory') . ')' : $filename;
$path = uc_file_qualify_file($filename);
if (is_dir($path)) {
$has_directory = TRUE;
}
}
$form['selected_files'] = [
'#theme' => 'item_list',
'#items' => $file_list,
'#attributes' => [
'class' => [
'selected-file-name',
],
],
];
if ($has_directory && $affected_list[TRUE] !== FALSE) {
$form['recurse_directories'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Delete selected directories and their sub directories'),
];
$form['affected_files'] = [
'#theme' => 'item_list',
'#items' => $affected_list[FALSE],
'#title' => $this
->t('Affected files'),
'#attributes' => [
'class' => [
'affected-file-name',
],
],
];
}
return parent::buildForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$status = TRUE;
$status = uc_file_remove_by_id($form_state
->getValue('file_ids'), !$form_state
->isValueEmpty('recurse_directories')) && $status;
if ($status) {
$this
->messenger()
->addMessage($this
->t('The selected file(s) have been deleted.'));
}
else {
$this
->messenger()
->addWarning($this
->t('One or more files could not be deleted.'));
}
$form_state
->setRedirectUrl($this
->getCancelUrl());
}
protected function displayArraysEquivalent($recur, $no_recur) {
if (count($recur) != count($no_recur)) {
return FALSE;
}
for ($i = 0; $i < count($recur); $i++) {
if ($recur[$i] != $no_recur[$i]) {
return FALSE;
}
}
return TRUE;
}
protected function buildJsFileDisplay($file_ids) {
$recursion_file_ids = _uc_file_sort_names(_uc_file_get_dir_file_ids($file_ids, TRUE));
foreach ($recursion_file_ids as $file_id) {
$file = uc_file_get_by_id($file_id);
$recursion[] = '<li>' . $file->filename . '</li>';
}
$no_recursion_file_ids = $file_ids;
foreach ($no_recursion_file_ids as $file_id) {
$file = uc_file_get_by_id($file_id);
$no_recursion[] = '<li>' . $file->filename . '</li>';
}
$equivalent = $this
->displayArraysEquivalent($recursion_file_ids, $no_recursion_file_ids);
$result[TRUE] = $equivalent ? FALSE : $recursion;
$result[FALSE] = $no_recursion;
drupal_add_js('uc_file_list[false] = ' . Json::encode('<li>' . implode('</li><li>', $no_recursion) . '</li>') . ';', 'inline');
drupal_add_js('uc_file_list[true] = ' . Json::encode('<li>' . implode('</li><li>', $recursion) . '</li>') . ';', 'inline');
return $result;
}
}