лайфхак Распределяем рисунки по категориям

Baco

Baco

architect
#1
Здравствуйте, уважаемые!
Решил не отправлять более в небытие нужные функции, как делаю обычно, а подслушав совет некоторых мастеров, таки отвравлю в архивы, может кому сэкономит времени, а может и себе пригодится, чтобы не писать по новой.
Итак, ситуация: парсинг нескольких сайтов и картинки в одном каталоге (товаров over 5К, а рисунков ещё больше, так как доп. рисунки тоже), при необходимости изменить контент, на сервере долго висел каталог, при открытии стольких рисунков, в общем проблема в том, что в одном каталоге - много рисунков в опенкарте решаю несколькими методами:
алгоритм следующий:
формируем из нужного контроллера (это расписывать не буду) метод в модель, на выборку всех:
  • product_id (для последующего обновления таблицы товара с новым адресом рисунка)
  • image (собственно сам рисунок, с которым производим корректировку)
  • category_name (выбираем для разбиения каталогов по названию категории)
[так как таблицы с рисунками у нас 2-ве (одна основная и 2-я с дополнительными]
примерно такого вида:
$this->model_tool_rellocate->reLocateImg($this->config->get('config_language_id'), true);
где первый аргумент - язык, согласно которому, будет выборка названия категории
второй - если в true - то прогон будет по таблице с доп. рисунками, а если в false или без него, то по основной таблице товара.
PHP:
    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]) - я передал первое вхождение в названии категории (например "Золотые слитки", будет передано "Золотые"), где будет произведена транслитерация на латинский алфавит, а все лишние символы - заменены на "-" (тире), а в конце, разбивка по тире (так как бывает, что попадали на транслитерацию словоформы типа: "красно-черный"), в общем, вот сам метод транслитерации:
PHP:
    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-го раза, суть которого заключается в том, чтобы из вытянутого рисунка из базы, взять последниее звено в адресе, подставить в него транслитерированное название каталога, проверить, создан ли такой каталог и если нет - создать, ну и передислоцировать рисунок:
PHP:
    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:
 
Последнее редактирование:
S

SlaSoft

Maestro
#2
Я на это без боли смотреть не могу


Код:
        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 =  preg_replace('/[^_\-.\-a-zA-Z0-9\s]/u','', $string);
$string = preg_replace ('/[_\s]+/u', '-', $string);
$string = preg_replace('/-\s+/', ' ', $string);
$string = trim($string,'-');
 
ТС
Baco

Baco

architect
Топик Стартер #3
ну, Слав, этот метод вообще не мой, но изобретать веломопед не хотел и не имел времени, нашел подходящий и впулил, главное - цель, а средства все хороши в достижении, хотя да, можна более элегантно накидать)
 
Твой e-mail адрес не будет опубликован. Он нужен для подтверждения сообщения !
Вверх