View source
<?php
namespace Drupal\media_directories_ui\Controller;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Ajax\OpenDialogCommand;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Form\FormBuilder;
use Drupal\Core\Form\FormState;
use Drupal\Core\Render\RendererInterface;
use Drupal\media_directories_ui\Form\MediaEditForm;
use Drupal\media_directories_ui\MediaDirectoriesLibraryState;
use Drupal\taxonomy\Entity\Term;
use Drupal\media_directories_ui\Ajax\RefreshDirectoryTree;
use Drupal\media_directories_ui\Form\DirectoryDeleteForm;
use Drupal\media_directories_ui\Form\MediaDeleteForm;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
class MediaDirectoriesController extends ControllerBase {
protected $termStorage;
protected $formBuilder;
protected $renderer;
protected $vocabulary_id;
public function __construct(FormBuilder $formBuilder, RendererInterface $renderer) {
$this->formBuilder = $formBuilder;
$this->renderer = $renderer;
$config = $this
->config('media_directories.settings');
$this->vocabulary_id = $config
->get('directory_taxonomy');
}
public static function create(ContainerInterface $container) {
return new static($container
->get('form_builder'), $container
->get('renderer'));
}
public function directoryTree() {
$treeBuilder = \Drupal::service('media_directories_ui.tree_builder');
$tree = $treeBuilder
->tree();
return new JsonResponse($tree);
}
public function directoryAdd(Request $request) {
$directory_id = (int) $request->request
->get('parent_id');
$directory_id = $directory_id === MEDIA_DIRECTORY_ROOT ? 0 : $directory_id;
$name = $request->request
->get('name');
$directory = Term::create([
'name' => $name,
'vid' => $this->vocabulary_id,
'parent' => [
$directory_id,
],
]);
$directory
->save();
$data = [
'id' => 'dir-' . $directory
->id(),
'a_attr' => (object) [
'data-tid' => $directory
->id(),
],
'text' => $directory
->getName(),
];
return new JsonResponse($data);
}
public function directoryRename(Request $request) {
$directory_id = (int) $request->request
->get('directory_id');
$new_name = $request->request
->get('directory_new_name');
$directory = Term::load($directory_id);
$directory
->setName($new_name);
$directory
->save();
$response = new AjaxResponse();
return $response;
}
public function directoryMove(Request $request) {
$response = new AjaxResponse();
$move_directory_id = (int) $request->request
->get('move_directory_id');
$to_directory_id = (int) $request->request
->get('directory_id');
$response
->addCommand(new RefreshDirectoryTree($to_directory_id));
if ($move_directory_id === $to_directory_id) {
return $response;
}
$directory = $this
->entityTypeManager()
->getStorage('taxonomy_term')
->load($move_directory_id);
$directory
->get('parent')
->setValue($to_directory_id === MEDIA_DIRECTORY_ROOT ? NULL : $to_directory_id);
$directory
->save();
return $response;
}
public function directoryDelete(Request $request) {
$response = new AjaxResponse();
$directory_id = (int) $request->request
->get('directory_id');
$target_bundles = $request->request
->get('target_bundles');
$directory = Term::load($directory_id);
if ($directory === NULL) {
return $response;
}
$context = [
'directory' => $directory,
'target_bundles' => $target_bundles,
];
$form = $this->formBuilder
->getForm(DirectoryDeleteForm::class, $context);
$response
->addCommand(new OpenDialogCommand('#media-dialog', $this
->t('Delete directory @name', [
'@name' => $directory
->getName(),
]), $form, [
'width' => '500',
'modal' => TRUE,
]));
return $response;
}
public function mediaAdd(Request $request) {
$response = new AjaxResponse();
$state = MediaDirectoriesLibraryState::fromRequest($request);
$library_ui = \Drupal::service('media_directories_ui.ui_builder');
$response
->addCommand(new ReplaceCommand('#media-library-wrapper', $library_ui
->buildUploadUi($state)));
return $response;
}
public function mediaEdit(Request $request) {
$response = new AjaxResponse();
$media_items = $request->request
->get('media_items', []);
$active_directory = (int) $request->request
->get('active_directory', MEDIA_DIRECTORY_ROOT);
$media_entities = $this
->entityTypeManager()
->getStorage('media')
->loadMultiple($media_items);
$form_state = new FormState();
$form_state
->set('media', $media_entities);
$form_state
->set('active_directory', $active_directory);
$media_form = $this
->formBuilder()
->buildForm(MediaEditForm::class, $form_state);
$response
->addCommand(new OpenModalDialogCommand($this
->t('Edit media'), $media_form, [
'width' => '800',
]));
return $response;
}
public function mediaMove(Request $request) {
$response = new AjaxResponse();
$media_items = $request->request
->get('media_items', []);
$directory_id = (int) $request->request
->get('directory_id');
$media_entities = $this
->entityTypeManager()
->getStorage('media')
->loadMultiple($media_items);
foreach ($media_entities as $media_entity) {
if ($media_entity
->hasField('directory')) {
$media_entity
->get('directory')
->setValue($directory_id === MEDIA_DIRECTORY_ROOT ? NULL : $directory_id);
$media_entity
->save();
}
}
$response
->addCommand(new InvokeCommand('.js-media-library-view', 'trigger', [
'RefreshView',
]));
return $response;
}
public function mediaDelete(Request $request) {
$response = new AjaxResponse();
$media_items = $request->request
->get('media_items', []);
if (empty($media_items)) {
return $response;
}
$media_entities = $this
->entityTypeManager()
->getStorage('media')
->loadMultiple($media_items);
$context = [
'media_items' => $media_entities,
];
$form = $this->formBuilder
->getForm(MediaDeleteForm::class, $context);
$response
->addCommand(new OpenModalDialogCommand($this
->t('Delete media'), $form, [
'width' => '500',
]));
return $response;
}
}