View source
<?php
namespace Drupal\imce_rename_plugin\Plugin\ImcePlugin;
use Drupal\Core\Database\Connection;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\imce\Imce;
use Drupal\imce\ImceFM;
use Drupal\imce\ImcePluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Component\Transliteration\TransliterationInterface;
class Rename extends ImcePluginBase implements ContainerFactoryPluginInterface {
protected $messenger;
protected $database;
protected $transliteration;
public function __construct(array $configuration, $plugin_id, $plugin_definition, Messenger $messenger, Connection $database, TransliterationInterface $transliteration) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->messenger = $messenger;
$this->database = $database;
$this->transliteration = $transliteration;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('messenger'), $container
->get('database'), $container
->get('transliteration'));
}
public function permissionInfo() {
return [
'rename_files' => $this
->t('Rename files'),
'rename_folders' => $this
->t('Rename folders'),
];
}
public function buildPage(array &$page, ImceFM $fm) {
$check_perm = $fm
->hasPermission('rename_files') || $fm
->hasPermission('rename_folders');
if ($check_perm) {
$page['#attached']['library'][] = 'imce_rename_plugin/drupal.imce.rename';
}
}
public function opRename(ImceFM $fm) {
$items = $fm
->getSelection();
switch ($items[0]->type) {
case 'file':
if ($this
->validateRename($fm, $items)) {
$this
->renameFile($fm, $items[0]->name);
}
else {
$this->messenger
->addMessage($this
->t('You do not have the right to rename a file "@old_item"', [
'@old_item' => utf8_encode($items[0]->name),
]), 'error');
}
break;
case 'folder':
if ($this
->validateRename($fm, $items)) {
$this
->renameFolder($fm, $items[0]->name);
}
else {
$this->messenger
->addMessage($this
->t('You do not have the right to rename a folder "@old_item"', [
'@old_item' => utf8_encode($items[0]->name),
]), 'error');
}
break;
}
}
public function validateRename(ImceFM $fm, array $items) {
return $items && $fm
->validatePermissions($items, 'rename_files', 'rename_folders') && $fm
->validatePredefinedPath($items);
}
public function renameFile(ImceFM $fm, string $old_name) {
$new_name = $this
->getNewName($fm);
$folder = $fm->activeFolder;
$uri = preg_match('/^public:\\/\\/$/', $folder
->getUri()) >= 1 ? $folder
->getUri() : $folder
->getUri() . '/';
$new_name = $new_name . '.' . pathinfo($old_name, PATHINFO_EXTENSION);
$new_uri = $uri . $new_name;
$old_uri = $uri . $old_name;
if (file_exists($new_uri)) {
$this->messenger
->addMessage($this
->t('Failed to rename file because "@old_item" already exists', [
'@old_item' => utf8_encode($old_name),
]), 'error');
return;
}
if (!is_writable($old_uri) && !chmod($old_uri, 0664)) {
$this->messenger
->addMessage($this
->t('No permissions to write file "@old_item". Please upload the file via IMCE.', [
'@old_item' => utf8_encode($old_name),
]), 'error');
return;
}
$file = Imce::getFileEntity($old_uri);
$file = empty($file) ? Imce::createFileEntity($old_uri) : $file;
$move = file_move($file, $new_uri, FileSystemInterface::EXISTS_ERROR);
$move
->setFilename($new_name);
$move
->save();
if ($move) {
$this->messenger
->addMessage($this
->t('Rename successful! Renamed "@old_item" to "@new_item"', [
'@old_item' => utf8_encode($old_name),
'@new_item' => utf8_encode($new_name),
]));
$folder
->addFile($new_name)
->addToJs();
$folder
->getItem($old_name)
->removeFromJs();
}
else {
$this->messenger
->addMessage($this
->t('Failed to rename file "@old_item" to "@new_item".', [
'@old_item' => utf8_encode($old_name),
'@new_item' => utf8_encode($new_name),
]), 'error');
}
}
public function renameFolder(ImceFM $fm, string $old_name) {
$new_name = $this
->getNewName($fm);
$folder = $fm->activeFolder;
$uri = preg_match('/^public:\\/\\/$/', $folder
->getUri()) >= 1 ? $folder
->getUri() : $folder
->getUri() . '/';
$new_uri = $uri . $new_name;
$old_uri = $uri . $old_name;
if (file_exists($new_uri)) {
$this->messenger
->addMessage($this
->t('Failed to rename folder because "@old_item" already exists', [
'@old_item' => utf8_encode($old_name),
]), 'error');
return;
}
if (rename($old_uri, $new_uri)) {
$this->messenger
->addMessage($this
->t('Rename successful! Renamed "@old_item" to "@new_item"', [
'@old_item' => utf8_encode($old_name),
'@new_item' => utf8_encode($new_name),
]));
$folder
->addSubfolder($new_name)
->addToJs();
$folder
->getItem($old_name)
->removeFromJs();
$sql_old_uri = $old_uri . "/";
$sql_new_uri = $new_uri . "/";
$query = $this->database
->select('file_managed', 'fm');
$query
->fields('fm');
$query
->condition('uri', $sql_old_uri . '%', 'LIKE');
$file_managed = $query
->execute()
->fetchAll();
if (!empty($file_managed)) {
$this->database
->update('file_managed', [])
->condition('uri', $sql_old_uri . '%', 'LIKE')
->expression('uri', "REPLACE(uri, " . "'" . $sql_old_uri . "', '" . $sql_new_uri . "')")
->execute();
$this->messenger
->addMessage($this
->t('Updated path for @items files.', [
'@items' => count($file_managed),
]));
}
}
else {
$this->messenger
->addMessage($this
->t('Sorry, but something wrong when rename a folder'), 'error');
}
}
public function getNewName(ImceFM $fm) {
$name = mb_substr($fm
->getPost('new_name'), 0, 50);
$name = $this->transliteration
->transliterate($name);
$name = str_replace(' ', '-', $name);
$name = preg_replace('/[^\\w_-]+/u', '', $name);
$name = empty($name) ? time() : $name;
return $name;
}
}