Для выгрузки в Яндекс.Маркет адреса картинок должны иметь адрес без пробелов и кириллических символов, и мало ли еще чего. Можно сказать, что допустимыми являются .-_0-9a-Z. Но вот у нас есть магазин на ~50 тысяч товаров, у которых много где оказались пробелы в именах папок, и кое-где кириллица в именах папок.
Пояснения скрипта: Подключаем конфиг и vqmod. Далее есть несколько блоков кода, которые активируются при наличии GET-запроса:
- scriptname.php?my_scandir=1
Просто выводит список папок - scriptname.php?debug_monitor=1
Выводит список файлов, для которых нет соответствия в базе - scriptname.php?rename_folders=1
Вырезает пробелы из папок (заменяет на "_") - scriptname.php?rename_files=1
Транслитизирует кириллицу
Нюанс - У меня в некоторых ситуациях почему-то возвращалось false при попытки переименовать файпку, при этом папка все таки была переименована. При такой ситуации просто выводится запрос MYSQL, который можно вручную активировать в phpmyadmin, убедившись, что папки переименованы.
echo "<pre>";
require_once('config.php');
// VirtualQMOD
require_once('./vqmod/vqmod.php');
VQMod::bootup();
// VQMODDED Startup
require_once(VQMod::modCheck(DIR_SYSTEM . 'startup.php'));
// Application Classes
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/customer.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/affiliate.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/currency.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/tax.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/weight.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/length.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/cart.php'));
// Database
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
function rus2translit($str) {
$rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
$lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
return str_replace($rus, $lat, $str);
}
function str2url($str) {
$ch = mb_detect_encoding($str);
$str = iconv ( $ch , "UTF-8" , $str );
$str = rus2translit($str);
$str = mb_strtolower($str);
$str = preg_replace('~[^.\-a-z0-9_]+~u', '_', $str);
// удаляем начальные и конечные '-'
//$str = trim($str, "__");
return $str;
}
if(!empty($_GET['debug_monitor'])){
$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image like '% %'");
foreach($request->rows as $v){
if(!file_exists(DIR_IMAGE.$v['image'])){
echo $v['image']."\r\n";
}
}
$request = $db->query("SELECT image from ".DB_PREFIX."product_image where image like '% %'");
foreach($request->rows as $v){
if(!file_exists(DIR_IMAGE.$v['image'])){
echo $v['image']."\r\n";
}
}
}
if(!empty($_GET['rename_folders'])){
$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image like '% %'");
$folders = array();
foreach($request->rows as $v){
$pi = pathinfo($v['image']);
$folder_hash = md5($pi['dirname']);
if(empty($folders[$folder_hash]) AND strpos($pi['dirname']," ") !== false){
$folders[$folder_hash] = $pi['dirname'];
}
//echo $pi['dirname']."\r\n";
}
//echo count($folders);
print_r($folders);
function renameInDB($dirname_old, $dirname_new){
global $db;
$update_product_str = "UPDATE ".DB_PREFIX."product SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%'";
$update_product_image_str = "UPDATE ".DB_PREFIX."product_image SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%'";
$db->query($update_product_str);
$db->query($update_product_image_str);
}
foreach($folders as $v){
$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image like '".$v."%'");
foreach($request->rows as $r){
//echo $r['product_id'].",";
}
$dirname_to_rename = array();
foreach(explode("/", $v) as $dir){
$dirname_to_rename[] = $dir;
if(strpos($dir," ") !== false){
break;
}
}
$dirname_old = implode("/",$dirname_to_rename);
$dirname_new = str_replace(" ", "_", $dirname_old);
if(rename(DIR_IMAGE.$dirname_old, DIR_IMAGE.$dirname_new)){
echo "+++".$dirname_old."\r\n";
echo "+++".$dirname_new."\r\n";
renameInDB($dirname_old, $dirname_new);
}else{
$update_product_str = "UPDATE ".DB_PREFIX."product SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%';";
$update_product_image_str = "UPDATE ".DB_PREFIX."product_image SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%';";
echo $update_product_str."\r\n";
echo $update_product_image_str."\r\n";
}
}
}
if(!empty($_GET['rename_files'])){
$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image != ''");
foreach($request->rows as $v){
$pi = pathinfo($v['image']);
if(!empty($pi['extension'])){
$validname = preg_replace("/[^,.\-_0-9a-Z]/", '_', $pi['basename']);
if($validname !== $pi['basename']){
$old_filename = $v['image'];
$new_filename = $pi['dirname']."/".str2url($pi['filename']).".".$pi['extension'];
//echo $pi['filename'].".".$pi['extension'].str2url($pi['filename']).".".$pi['extension']."\r\n";
$postfix = 1;
if(file_exists(DIR_IMAGE.$new_filename)){
$new_filename = $pi['dirname']."/".str2url($pi['filename'])."-".$postfix.".".$pi['extension'];
$postfix++;
}
if(rename(DIR_IMAGE.$old_filename, DIR_IMAGE.$new_filename)){
$update_product_str = "UPDATE ".DB_PREFIX."product SET image = REPLACE(image, '".$db->escape($old_filename)."', '".$db->escape($new_filename)."') WHERE image = '".$old_filename."'";
$update_product_image_str = "UPDATE ".DB_PREFIX."product_image SET image = REPLACE(image, '".$db->escape($old_filename)."', '".$db->escape($new_filename)."') WHERE image = '".$old_filename."'";
$db->query($update_product_str);
$db->query($update_product_image_str);
echo "+++".$old_filename."\r\n";
echo "+++".$new_filename."\r\n\r\n";
usleep(2000);
}else{
echo "---".$old_filename."\r\n";
echo "---".$new_filename."\r\n";
}
//echo $validname."\r\n\r\n";
}else{
//echo "2-";
}
}else{
echo "1-";
}
}
}
if(!empty($_GET['my_scandir'])){
function my_scandir($dir){
$files = scandir($dir);
foreach($files as $file){
if($file != "." AND $file != ".."){
if(is_dir($dir."/".$file)){
if(strpos($file," ") !== false){
echo $dir."/".$file."\r\n";
}
my_scandir($dir."/".$file);
}
}
}
}
my_scandir(DIR_IMAGE."data");
}
echo "</pre>";
Комментарии (0)
Не писать ответ