Здравствуйте, уважаемые!
Решил не отправлять более в небытие нужные функции, как делаю обычно, а подслушав совет некоторых мастеров, таки отвравлю в архивы, может кому сэкономит времени, а может и себе пригодится, чтобы не писать по новой.
Итак, ситуация: парсинг нескольких сайтов и картинки в одном каталоге (товаров over 5К, а рисунков ещё больше, так как доп. рисунки тоже), при необходимости изменить контент, на сервере долго висел каталог, при открытии стольких рисунков, в общем проблема в том, что в одном каталоге - много рисунков в опенкарте решаю несколькими методами:
алгоритм следующий:
формируем из нужного контроллера (это расписывать не буду) метод в модель, на выборку всех:
[так как таблицы с рисунками у нас 2-ве (одна основная и 2-я с дополнительными]
примерно такого вида:
где первый аргумент - язык, согласно которому, будет выборка названия категории
второй - если в true - то прогон будет по таблице с доп. рисунками, а если в false или без него, то по основной таблице товара.
а теперь по порядку... в метод: $this->seo($rename[0]) - я передал первое вхождение в названии категории (например "Золотые слитки", будет передано "Золотые"), где будет произведена транслитерация на латинский алфавит, а все лишние символы - заменены на "-" (тире), а в конце, разбивка по тире (так как бывает, что попадали на транслитерацию словоформы типа: "красно-черный"), в общем, вот сам метод транслитерации:
далее, по коду, уникальный метод, который накидал на коленке и он сработал аж с 3-го раза, суть которого заключается в том, чтобы из вытянутого рисунка из базы, взять последниее звено в адресе, подставить в него транслитерированное название каталога, проверить, создан ли такой каталог и если нет - создать, ну и передислоцировать рисунок:
ну а в конце - апдейтим таблицу по product_id новым адресом рисунка. :cool:
Решил не отправлять более в небытие нужные функции, как делаю обычно, а подслушав совет некоторых мастеров, таки отвравлю в архивы, может кому сэкономит времени, а может и себе пригодится, чтобы не писать по новой.
Итак, ситуация: парсинг нескольких сайтов и картинки в одном каталоге (товаров over 5К, а рисунков ещё больше, так как доп. рисунки тоже), при необходимости изменить контент, на сервере долго висел каталог, при открытии стольких рисунков, в общем проблема в том, что в одном каталоге - много рисунков в опенкарте решаю несколькими методами:
алгоритм следующий:
формируем из нужного контроллера (это расписывать не буду) метод в модель, на выборку всех:
- product_id (для последующего обновления таблицы товара с новым адресом рисунка)
- image (собственно сам рисунок, с которым производим корректировку)
- category_name (выбираем для разбиения каталогов по названию категории)
[так как таблицы с рисунками у нас 2-ве (одна основная и 2-я с дополнительными]
примерно такого вида:
$this->model_tool_rellocate->reLocateImg($this->config->get('config_language_id'), true);где первый аргумент - язык, согласно которому, будет выборка названия категории
второй - если в true - то прогон будет по таблице с доп. рисунками, а если в false или без него, то по основной таблице товара.
public function reLocateImg($language_id = 3, $is_dop = false) {
$dop_table = '';
if ($is_dop) {
$dop_table = '_image';
}
$query = $this->db->query("SELECT DISTINCT p.product_id, p.image, cd.name
FROM " . DB_PREFIX . "product" . $dop_table . " p
LEFT JOIN `" . DB_PREFIX . "product_to_category` p2c ON (p2c.product_id = p.product_id)
LEFT JOIN `" . DB_PREFIX . "category_description` cd ON (cd.category_id = p2c.category_id)
WHERE cd.language_id = '" . (int)$language_id . "'");
if ($query->num_rows) {
foreach ($query->rows as $result) {
if ($result['image']) {
$rename = explode(" ", $result['name']);
$new_way = $this->img2local($result['image'], $this->seo($rename[0]));
$this->db->query("UPDATE " . DB_PREFIX . "product" . $dop_table . " SET image = '" . $this->db->escape($new_way) . "' WHERE product_id = '" . (int)$result['product_id'] . "'");
}
}
}
}а теперь по порядку... в метод: $this->seo($rename[0]) - я передал первое вхождение в названии категории (например "Золотые слитки", будет передано "Золотые"), где будет произведена транслитерация на латинский алфавит, а все лишние символы - заменены на "-" (тире), а в конце, разбивка по тире (так как бывает, что попадали на транслитерацию словоформы типа: "красно-черный"), в общем, вот сам метод транслитерации:
private function seo($name) {
$string = html_entity_decode($name);
$source[] = '/а/'; $replace[] = 'a';
$source[] = '/б/'; $replace[] = 'b';
$source[] = '/в/'; $replace[] = 'v';
$source[] = '/г/'; $replace[] = 'g';
$source[] = '/ґ/'; $replace[] = 'g';
$source[] = '/д/'; $replace[] = 'd';
$source[] = '/е/'; $replace[] = 'e';
$source[] = '/є/'; $replace[] = 'ye';
$source[] = '/ж/'; $replace[] = 'zh';
$source[] = '/з/'; $replace[] = 'z';
$source[] = '/и/'; $replace[] = 'i';
$source[] = '/і/'; $replace[] = 'i';
$source[] = '/ї/'; $replace[] = 'yi';
$source[] = '/й/'; $replace[] = 'j';
$source[] = '/к/'; $replace[] = 'k';
$source[] = '/л/'; $replace[] = 'l';
$source[] = '/м/'; $replace[] = 'm';
$source[] = '/н/'; $replace[] = 'n';
$source[] = '/о/'; $replace[] = 'o';
$source[] = '/п/'; $replace[] = 'p';
$source[] = '/р/'; $replace[] = 'r';
$source[] = '/с/'; $replace[] = 's';
$source[] = '/т/'; $replace[] = 't';
$source[] = '/у/'; $replace[] = 'y';
$source[] = '/ф/'; $replace[] = 'f';
$source[] = '/х/'; $replace[] = 'h';
$source[] = '/ц/'; $replace[] = 'c';
$source[] = '/ч/'; $replace[] = 'ch';
$source[] = '/ш/'; $replace[] = 'sh';
$source[] = '/щ/'; $replace[] = 'shh';
$source[] = '/ь/'; $replace[] = '';
$source[] = '/ю/'; $replace[] = 'yu';
$source[] = '/я/'; $replace[] = 'ya';
$source[] = '/э/'; $replace[] = 'e';
$source[] = '/ы/'; $replace[] = 'u';
$source[] = '/А/'; $replace[] = 'a';
$source[] = '/Б/'; $replace[] = 'b';
$source[] = '/В/'; $replace[] = 'v';
$source[] = '/Г/'; $replace[] = 'g';
$source[] = '/Ґ/'; $replace[] = 'g';
$source[] = '/Д/'; $replace[] = 'd';
$source[] = '/Е/'; $replace[] = 'e';
$source[] = '/Є/'; $replace[] = 'ye';
$source[] = '/Ж/'; $replace[] = 'zh';
$source[] = '/З/'; $replace[] = 'z';
$source[] = '/И/'; $replace[] = 'i';
$source[] = '/І/'; $replace[] = 'i';
$source[] = '/Ї/'; $replace[] = 'yi';
$source[] = '/Й/'; $replace[] = 'j';
$source[] = '/К/'; $replace[] = 'k';
$source[] = '/Л/'; $replace[] = 'l';
$source[] = '/М/'; $replace[] = 'm';
$source[] = '/Н/'; $replace[] = 'n';
$source[] = '/О/'; $replace[] = 'o';
$source[] = '/П/'; $replace[] = 'p';
$source[] = '/Р/'; $replace[] = 'r';
$source[] = '/С/'; $replace[] = 's';
$source[] = '/Т/'; $replace[] = 't';
$source[] = '/У/'; $replace[] = 'y';
$source[] = '/Ф/'; $replace[] = 'f';
$source[] = '/Х/'; $replace[] = 'h';
$source[] = '/Ц/'; $replace[] = 'c';
$source[] = '/Ч/'; $replace[] = 'ch';
$source[] = '/Ш/'; $replace[] = 'sh';
$source[] = '/Щ/'; $replace[] = 'shh';
$source[] = '/Ь/'; $replace[] = '';
$source[] = '/Ю/'; $replace[] = 'yu';
$source[] = '/Я/'; $replace[] = 'ya';
$source[] = '/Э/'; $replace[] = 'e';
$source[] = '/Ы/'; $replace[] = 'u';
$source[] = '/Ё/'; $replace[] = 'yo';
$string = preg_replace($source, $replace, $string);
for ($i=0; $i<strlen($string); $i++) {
if ($string[$i] >= 'a' && $string[$i] <= 'z') continue;
if ($string[$i] >= 'A' && $string[$i] <= 'Z') continue;
if ($string[$i] >= '0' && $string[$i] <= '9') continue;
$string[$i] = '-';
}
$string = str_replace("--","-",$string);
$string = preg_replace('/[^a-z0-9-.]/i', '', $string);
$string_last = explode('-', $string);
return strtolower($string_last[0]);
}далее, по коду, уникальный метод, который накидал на коленке и он сработал аж с 3-го раза, суть которого заключается в том, чтобы из вытянутого рисунка из базы, взять последниее звено в адресе, подставить в него транслитерированное название каталога, проверить, создан ли такой каталог и если нет - создать, ну и передислоцировать рисунок:
private function img2local($image_loc, $name) {
if (is_string($image_loc)) {
$img = explode('/', $image_loc);
$img = end($img);
$new_way = 'catalog/' . $name;
if (file_exists(DIR_IMAGE . $image_loc)) {
if (is_dir(DIR_IMAGE . $new_way) === false) {
mkdir(DIR_IMAGE . $new_way);
chmod(DIR_IMAGE . $new_way, 0777);
}
rename(DIR_IMAGE . $image_loc, DIR_IMAGE . $new_way . '/' . $img);
}
return $new_way . '/' . $img;
}
}ну а в конце - апдейтим таблицу по product_id новым адресом рисунка. :cool:
Вставлене медіа: B3HI2sgJZHM