Как использовать:
Создаем новый плагин с именем TransliterateFileNames
копируем в плагин код с Github
назначаем на событие OnFileManagerUpload.
Источник: community.modx-cms.ru/blog/2478.html
Здесь добавлю уже от себя. Лично я пользуюсь этой версией плагина:
<?php switch ($modx->event->name) { case 'OnFileManagerUpload': $generator = $modx->newObject('modResource'); $bases = $source->getBases($directory); $fullPath = $bases['pathAbsolute'].ltrim($directory,'/'); $directory = $source->fileHandler->make($fullPath); foreach ($files as $file) { $ext = @pathinfo($file['name'],PATHINFO_EXTENSION); rename($directory->getPath().$file['name'], $directory->getPath() . str_replace($ext, '.'.$ext, $generator->cleanAlias($file['name']))); } break; default: break; } return true;
Дело в том, что в MODX уже заложены основы для реализации автоматических транслитераций или переводов для псевдонимов страниц. Например, можно установить плагин Translit, который будет автоматически транслитерировать адреса страниц. Или плагин yTranslit, который будет переводить адреса на английский с помощью сервиса Яндекс-переводов.
Так вот эта версия плагина позволяет использовать принятую на сайте систему транслитерации/перевода и загружаемые файлы будут легко вписываться в общую картину сайта.
Объектная
Если убрать эту точку из str_replace($ext, '.'.$ext ничего страшного не произойдет? Не силен в php, к сожалению.
<?php switch ($modx->event->name) { case 'OnFileManagerUpload': $generator = $modx->newObject('modResource'); $bases = $source->getBases($directory); $fullPath = $bases['pathAbsolute'].ltrim($directory,'/'); $directory = $source->fileHandler->make($fullPath); foreach ($files as $file) { $ext = @pathinfo($file['name'],PATHINFO_EXTENSION); rename($directory->getPath().$file['name'], $directory->getPath() . $generator->cleanAlias($file['name'])); } break; default: break; } return true;Подскажите, пожалуйста как убрать вот это лишнее тире перед форматом *-.jpg
gist.github.com/govza/5136346
$generator->cleanAlias($file['name'] . '-' . date('d-m-Y'))$ext = @pathinfo($file['name'],PATHINFO_EXTENSION); $name = str_replace($ext,'',$file['name']) . '-' . date('d-m-Y'); rename($directory->getPath().$file['name'], $directory->getPath() . $generator->cleanAlias($name));<?php switch ($modx->event->name) { case 'OnFileManagerUpload': $generator = $modx->newObject('modResource'); $bases = $source->getBases($directory); $fullPath = $bases['pathAbsolute'].ltrim($directory,'/'); $directory = $source->fileHandler->make($fullPath); foreach ($files as $file) { $ext = @pathinfo($file['name'],PATHINFO_EXTENSION); $name = str_replace($ext,'',$file['name']) . '-' . date('d-m-Y').'.'.$ext; rename($directory->getPath().$file['name'], $directory->getPath() . $generator->cleanAlias($name)); } break; default: break; }как правильно будет? напишите пожалуйста. Спасибо.
был включен этот символ для вырезания., теперь, после имени он почему то точку вставляет, и получается вот такой вид типа: file.-27-10-2016.jpg
<?php switch ($modx->event->name) { case 'OnFileManagerUpload': $generator = $modx->newObject('modResource'); $bases = $source->getBases($directory); $fullPath = $bases['pathAbsolute'].ltrim($directory,'/'); $directory = $source->fileHandler->make($fullPath); foreach ($files as $file) { $ext = @pathinfo($file['name'],PATHINFO_EXTENSION); $name = str_replace('.'.$ext,'',$file['name']) . '-' . date('d-m-Y-H-i-s').'.'.$ext; rename($directory->getPath().$file['name'], $directory->getPath() . $generator->cleanAlias($name)); } break; default: break; }/[\,\$\*\№\;\*\?\»\.\.\«\!\0\(\)\x0B\t\n\r\f\a&=+%#<>"~:`@\?\[\]\{\}\|\^'\\]/
поэтому вот модифицированный код.
<?php switch ($modx->event->name) { case 'OnFileManagerUpload': $generator = $modx->newObject('modResource'); $bases = $source->getBases($directory); $fullPath = $bases['pathAbsolute'].ltrim($directory,'/'); $directory = $source->fileHandler->make($fullPath); foreach ($files as $file) { $ext = @pathinfo($file['name'],PATHINFO_EXTENSION); rename($directory->getPath().$file['name'], $directory->getPath() . str_replace($ext, '-' . date('d-m-Y-H-i-s').'.'.$ext, $generator->cleanAlias($file['name']))); } break; default: break; } return true;Подскажи пожалуйста, если знаешь.
В общем, плагин выдаёт такую ошибку если грузить файлы на облако через компонент Swift, может посоветуешь, что-нибудь попробовать?
<?php switch ($modx->event->name) { case 'OnFileManagerUpload': $generator = $modx->newObject('modResource'); $bases = $source->getBases($directory); $fullPath = $bases['pathAbsolute'].ltrim($directory,'/'); $directory = $source->fileHandler->make($fullPath); foreach ($files as $file) { $ext = @pathinfo($file['name'],PATHINFO_EXTENSION); $name = str_replace($ext,'',$file['name']) . '-' . date('d-m-Y').'.'.$ext; rename($directory->getPath().$file['name'], $directory->getPath() . $generator->cleanAlias($name)); } break; default: break; }$source->renameObject($oldFile,$this->getProperty('name'));Ну или вообще, использовать процессор browser/file/renameНо проблема тут не в дополнении, а в «облачности» — просто rename не сработает, так как файлы не на сервере находятся, а в облаке. Поэтому надо облаку передать команду на переименование.
Получаются файлы типа: file-27-10-2016jpg
спасибо.
Заметил что плагин неправильно понимает букву «й», пишет i с двумя точками сверху. Подскажи пожалуйста как это поправить.
Импорт — PHPExcel
файл импорта — excel
В бекенде работает translit нормально
— ниже код импорта —
<?php // Функции работы со строками require_once 'assets/libs/strings/strings.php'; //Массив для ошибок $errors = []; if (isset($_FILES['input-images'])) { //Грузим ZIP-файл с картинками, распаковываем в папку /images/ $upload_dir = './import_temp/'; $upload_zipfile = $upload_dir.basename($_FILES['input-images']['name']); copy($_FILES['input-images']['tmp_name'], $upload_zipfile); $zip = new ZipArchive; $zip->open($upload_zipfile); mkdir($_SERVER['DOCUMENT_ROOT'] . "/images/", 0700); $zip->extractTo($_SERVER['DOCUMENT_ROOT'] . "/images"); $zip->close(); unlink($upload_zipfile); if (isset($_FILES['input-file'])) { $upload_dir = './import_temp/'; $upload_file = $upload_dir.basename($_FILES['input-file']['name']); copy($_FILES['input-file']['tmp_name'], $upload_file); require_once 'assets/libs/PHPExcel.php'; $pExcel = new PHPExcel(); $pExcel = PHPExcel_IOFactory::load($upload_file); $Start = 2; $Res = array(); for ($i= $Start; $i <= 1000; $i++) { $Row = new stdClass(); $Row->id = $i; $Row->title = $pExcel->getActiveSheet()->getCell('A'.$i )->getValue(); $Row->category = $pExcel->getActiveSheet()->getCell('B'.$i )->getValue(); $Row->keyword = $pExcel->getActiveSheet()->getCell('C'.$i )->getValue(); $Row->articul = $pExcel->getActiveSheet()->getCell('D'.$i )->getValue(); $Row->brand = $pExcel->getActiveSheet()->getCell('E'.$i )->getValue(); $Row->picture = $pExcel->getActiveSheet()->getCell('F'.$i )->getValue(); $Row->price = $pExcel->getActiveSheet()->getCell('G'.$i )->getValue(); $Row->price_old = $pExcel->getActiveSheet()->getCell('H'.$i )->getValue(); $Row->non_auto_price_rub = $pExcel->getActiveSheet()->getCell('I'.$i )->getValue(); $Row->old_non_auto_rub = $pExcel->getActiveSheet()->getCell('J'.$i )->getValue(); $Row->introtext = $pExcel->getActiveSheet()->getCell('K'.$i )->getValue(); $Row->content = $pExcel->getActiveSheet()->getCell('L'.$i )->getValue(); $Row->stock = $pExcel->getActiveSheet()->getCell('M'.$i )->getValue(); $Row->tobest = $pExcel->getActiveSheet()->getCell('N'.$i )->getValue(); $Row->description = $pExcel->getActiveSheet()->getCell('O'.$i )->getValue(); $Row->tech_char = $pExcel->getActiveSheet()->getCell('P'.$i )->getValue(); $Row->garantiya = $pExcel->getActiveSheet()->getCell('Q'.$i )->getValue(); $Row->tovar_new = $pExcel->getActiveSheet()->getCell('R'.$i )->getValue(); $Row->to_xml = $pExcel->getActiveSheet()->getCell('S'.$i )->getValue(); if($Row->keyword == null) continue; $Res[] = $Row; } $idx = 0; $err_row = 2; foreach ($Res as $card) { $title = $card->title; $category = $card->category; $keyword = $card->keyword; $articul = $card->articul; $brand = $card->brand; $picture = $card->picture; $price = $card->price; $price_old = $card->price_old; $non_auto_price_rub = $card->non_auto_price_rub; $old_non_auto_rub = $card->old_non_auto_rub; $introtext = $card->introtext; $content = $card->content; $stock = $card->stock; $tobest = $card->tobest; $description = $card->description; $tech_char = $card->tech_char; $garantiya = $card->garantiya; $tovar_new = $card->tovar_new; $to_xml = $card->to_xml; if (!strpos($picture, '.jpg') && !strpos($picture, '.jpeg') && !strpos($picture, '.png') && !strpos($picture, '.gif')) { if (file_exists('images/' . $picture . '.jpg')) { $picture_tv = 'images/' . $picture . '.jpg'; } else if (file_exists('images/' . $picture . '.png')) { $picture_tv = 'images/' . $picture . '.png'; } else if (file_exists('images/' . $picture . '.gif')) { $picture_tv = 'images/' . $picture . '.gif'; } else if (file_exists('images/' . $picture . '.jpeg')) { $picture_tv = 'images/' . $picture . '.jpeg'; } } else { $picture_tv = 'images/' . $picture; } if ($picture_tv != "") { if ($title != '' && $keyword != '' && $picture != '') { $keyword_check = $modx->getObject('modResource',array('link_attributes' => $keyword)); if ($keyword_check == "") { $parent = $modx->getObject('modResource', $category); $parent->set('class_key', 'CollectionContainer'); $parent->save(); $newpage = $modx->newObject('modDocument'); $newpage->set('pagetitle', $title); $newpage->set('alias', str2url($title)); $newpage->set('longtitle', ''); $newpage->set('parent', $category); $newpage->set('published', '1'); $newpage->set('isfolder', '0'); $newpage->set('template', '4'); $newpage->set('content', $content); $newpage->set('introtext', $introtext); $newpage->set('link_attributes', $keyword); $newpage->save(); $newpage->setTVValue('product_articul', $articul); $newpage->setTVValue('product_brand', $brand); $newpage->setTVValue('product_img', $picture_tv); $newpage->setTVValue('price', $price); $newpage->setTVValue('price_old', $price_old); $newpage->setTVValue('non_auto_price_rub', $non_auto_price_rub); $newpage->setTVValue('old_non_auto_rub', $old_non_auto_rub); $newpage->setTVValue('product_stock', $stock); $newpage->setTVValue('product_tobest', $tobest); $newpage->setTVValue('tab-description', $description); $newpage->setTVValue('tab-features', $tech_char); $newpage->setTVValue('garantiya', $garantiya); $newpage->setTVValue('product_new', $tovar_new); $newpage->setTVValue('to_xml', $to_xml); $idx++; } else { array_push($errors, " <strong>Карточка не загружена</strong> → дубликат keyword: " . $keyword . " <strong>Карточка:</strong> " . $title ." / <strong>keyword</strong> карточки: " . $keyword ); } } else { array_push($errors, " <strong>Карточка не загружена</strong> → отсутствует назавание picture и/или keyword. <strong>Карточка:</strong> " . $title ." / <strong>keyword</strong> карточки: " . $keyword ); } } else { array_push($errors, " <strong>Карточка не загружена</strong> → отсутствует изображение или неправильно задано имя файла (" . $picture . ") <strong>Карточка:</strong> " . $title ." / <strong>keyword</strong> карточки: " . $keyword ); } $err_row++; } $modx->cacheManager->refresh(); echo "<p>Импорт завершён. Импортировано карточек: <b>" . $idx . "</b></p>"; unlink($upload_file); } else { array_push($errors, "Импорт прерван. Отсутствует файл импорта XLS, или выбран некорректный файл."); } } else { array_push($errors, "Импорт прерван. Отсутствует ZIP-архив с изображениями, или выбран некорректный файл."); } if ($errors && $_FILES['input-file']) { echo "Во время импорта произошли следующие ошибки: "; echo "<ul>"; foreach ($errors as $err) { echo "<li>" . $err . "</li>"; } echo "</ul>"; };— strings.php который подключается в самом начале —<?php function rus2translit($string) { $converter = array( 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '\'', 'ы' => 'y', 'ъ' => '\'', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '\'', 'Ы' => 'Y', 'Ъ' => '\'', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',); return strtr($string, $converter); } function str2url($strin) { $str=$strin; $str = rus2translit($str); // переводим в транслит $str = strtolower($str); // в нижний регистр $str = preg_replace('~[^-a-z0-9_]+~u', '-', $str); // заменям все ненужное нам на "-" $str = trim($str, "-"); // удаляем начальные и конечные '-' return $str; } function rustolower($string) { $converter = array( 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ё' => 'ё', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ь' => 'ь', 'Ы' => 'ы', 'Ъ' => 'ъ', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я',); return $string[0].strtr(substr($string, 1), $converter); } ?>Спасибо
Замени строчку
На
$fileniz = mb_strtolower($file['name']); $ext = @pathinfo($fileniz,PATHINFO_EXTENSION);Или плагин для этих версий не актуален? Спасибо.