Internetový obchod v nette – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Internetový obchod v nette – PHP – Fórum – Programujte.comInternetový obchod v nette – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
jAkErCZ0
Návštěvník
31. 10. 2017   #1
-
0
-

Zdravím vás,
dle seriálu kde si pomocí návodu vytvoříte internetový obchod postavený na frameworku nette jsem si ho vytvořil ale mám pár problémů se kterými si nevím rady... https://www.itnetwork.cz/php/nette/e-shop

Takže máme velkoobchodníka u který nám poskytl xml import pro jeho zboží abychom si ho mohli nahrát na náš obchod... problém je v tom že na starým systému jsme měli udělaný kód který nám díky tomu mohl z xml vytahovat data a nahrávat na náš obchod... jenže tím že teď již máme jiný systém je potřeba ten kód upravit abychom ho mohli opět pomocí cronu volat....

<?php

/**
 * Description of Import
 *
 * @author David Skála <skala2524@gmail.com>
 */
class Import {

    CONST URL = 'http://navratws:ws13852@WWW.SPOKEY.CZ/i6ws/Default.asmx/GetResult?resultType=X-StoItemBaseComplEl';

    private $slozka;
    private $slozkaDb;

    /** @var DibiConnection */
    private $dibi;

    public function __construct($dibi) {
        $this->log('init');

        $this->dibi = $dibi;
        $this->slozka = __DIR__ . '/../files/catalog/items/';
        $this->slozkaDb = 'catalog/items/';

        /*
          $cdir = scandir($this->slozka);
          foreach ($cdir as $value) {
          if (intval($value) > 112)
          $this->rrmdir($this->slozka . $value);
          }
          exit;
         */
    }

    private function rrmdir($dir) {
        if (is_dir($dir)) {
            $objects = scandir($dir);
            foreach ($objects as $object) {
                if ($object != "." && $object != "..") {
                    if (is_dir($dir . "/" . $object))
                        $this->rrmdir($dir . "/" . $object);
                    else
                        unlink($dir . "/" . $object);
                }
            }
            rmdir($dir);
        }
    }

    /**
     *
     * @param string $message
     */
    private function log($message) {
        echo sprintf('<span style="color: #CCC;">bellugio:</span> %s<br>', $message);
    }

    /**
     *
     * @return type
     */
    public function getXml() {
        $this->log('getXml: ' . self::URL);
        return file_get_contents(self::URL);
    }

    public function zpracujXmlKategorie($xml) {

        $poleLevel1 = [
            'Míčové a společenské sporty' => 2,
            'Fitness a posilovna' => 2,
            'Vodní sporty' => 2,
            'Skating' => 2,
            'Bojové sporty' => 2,
            'Tenis a badminton' => 2,
            'Outdoor' => 3,
            'Sport. obuv a nazouváky' => 4,
            'Termoprádlo' => 4,
            'Funkční oblečení' => 4
        ];

        foreach ($xml->StoItem as $item) {
            $tmp1 = explode(' ', $item->SPresentTree->Level1);
            unset($tmp1[0]);
            $level1 = trim(implode(' ', $tmp1));
            $idLevel0 = isset($poleLevel1[$level1]) ? $poleLevel1[$level1] : 'false';

            /* level 1 */
            if ($idLevel0) {
                $data = $this->vratDataProKategorii($idLevel0, $level1);
                $kategorieId_1 = $this->dibi->query(sprintf('SELECT id FROM [eshop_category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle();
                if (!$kategorieId_1) {
                    $this->dibi->query('INSERT INTO [eshop_category]', $data);
                    $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 1, $level1));
                    $kategorieId_1 = $this->dibi->getInsertId();
                }

                /* level 2 */
                $tmp2 = explode(' ', $item->SPresentTree->Level2);
                unset($tmp2[0]);
                $level2 = trim(implode(' ', $tmp2));
                if ($level2) {
                    $data = $this->vratDataProKategorii($kategorieId_1, $level2);
                    $kategorieId_2 = $this->dibi->query(sprintf('SELECT id FROM [eshop_category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle();
                    if (!$kategorieId_2) {
                        $this->dibi->query('INSERT INTO [eshop_category]', $data);
                        $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 2, $level2));
                        $kategorieId_2 = $this->dibi->getInsertId();
                    }

                    /* level 3 */
                    $tmp3 = explode(' ', $item->SPresentTree->Level3);
                    unset($tmp3[0]);
                    $level3 = trim(implode(' ', $tmp3));
                    if ($level3) {
                        $data = $this->vratDataProKategorii($kategorieId_2, $level3);
                        $kategorieId_3 = $this->dibi->query(sprintf('SELECT id FROM [eshop_category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle();
                        if (!$kategorieId_3) {
                            $this->dibi->query('INSERT INTO [eshop_category]', $data);
                            $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 3, $level3));
                        }
                    }
                }
            }
        }
    }

    private function vratDataProKategorii($parentId, $jmeno) {
        return [
            'parentid' => $parentId,
            'main_category' => 1,
            'imp_idgroup' => NULL,
            'imp_id' => NULL,
            'imp_parentid' => NULL,
            'level' => 1,
            'idlang' => 1,
            'idlang_group' => 0,
            'name' => $jmeno,
            'url' => $this->webalize($jmeno),
            'description' => '',
            'order' => 0,
            'inmenu' => 1,
            'unpacked' => 0,
            'idfile' => NULL,
            'deleted' => 0,
            'meta_title' => $jmeno,
            'meta_description' => '',
            'meta_keywords' => sprintf('%s, Spokey, Bellugio', $jmeno),
            's_minorderprice' => 0,
            's_minorderprice_curr' => 'CZK',
            's_idpdprofile' => 0,
            's_freedelivery' => 0,
            's_freedelivery_curr' => 'CZK',
            's_marginpricecoeff' => 1.6,
            'similaritemprice' => 0,
            'megaaction' => 0,
            'megaaction_ladies' => 0,
            'idmegaactionfile' => NULL,
            'idmegaactionfile_ladies' => NULL,
            'typ' => 0,
            'druh' => 0,
            'kolekce' => 0,
            'tempish' => 0,
            'path' => 0,
            'bg_file' => 0,
            'subimg_id' => 0,
            'men' => 0,
            'women' => 0,
            'children' => 0,
            'micro_kolobezky' => 0,
            'micro_kolobezky_code' => NULL,
            'prima_outdoor' => 0,
            'prima_outdoor_code' => NULL,
            'aspire' => NULL,
            'aspire_code' => NULL,
            'salming' => NULL,
            'salming_code' => NULL,
            'floorballplayer' => NULL,
            'floorballplayer_code' => NULL,
            'yate' => '',
            'yate_code' => '',
            'heureka' => '',
            'mzd' => 0,
            'taxbox' => '',
            'taxbox0' => '',
            'taxbox1' => '',
            'taxbox2' => '',
            'taxbox3' => '',
            'taxbox4' => ''
        ];
    }

    /**
     *
     * @param type $xml
     */
    public function zpracujXmlZbozi($xml) {
        $order = $this->dibi->query("SELECT max(eshop_catalog.order) AS orders FROM [eshop_catalog]")->fetchSingle() + 1;

        foreach ($xml->StoItem as $item) {
            $idKat = $this->dibi->query(sprintf("SELECT itemid FROM [eshop_catalog_variants] WHERE [catno] = '%s' LIMIT 1", $item->Code))->fetchSingle();
            $nazev = $idKat ? $this->dibi->query(sprintf("SELECT name FROM [eshop_catalog] WHERE [id] = %s LIMIT 1", $idKat))->fetchSingle() : false;

            if (!$nazev) {
                $this->log($item->Id . ': ' . $item->Name);

                if ($item->SisName == 'Výprodej')
                    $action = 1;
                if ($item->SisName == 'Novinka')
                    $news = 1;

                $dataCatalog = [
                    'imp_id' => intval($item->Id),
                    'imp_idgroup' => NULL,
                    'idlang' => 1,
                    'idlang_group' => 0,
                    'name' => (string) $item->Name,
                    'shortname' => (string) $item->Name,
                    'url' => $this->webalize($item->Name),
                    'addpageid' => 0,
                    'addmagazin' => '',
                    'exturl' => NULL,
                    'ptitle' => (string) $item->Name,
                    'pdescription' => (string) $item->Note,
                    'pkeywords' => '',
                    'shortdescription' => '',
                    'description' => (string) $item->Note,
                    'varranty' => '24 měsíců',
                    'vatflag' => 0,
                    'idmanufacturer' => NULL,
                    'iddistributor' => NULL,
                    'topsales' => 0,
                    'index' => 0,
                    'index_ladies' => 0,
                    'action' => $action,
                    'sleva' => 0,
                    'news' => $news,
                    'megaaction' => 0,
                    'megaaction_ladies' => 0,
                    'deleted' => 0,
                    'idpdprofile' => NULL,
                    'idfile' => NULL, //ssss
                    'idmegaactionfile' => NULL,
                    'idmegaactionfile_ladies' => NULL,
                    'idgal' => NULL,
                    'v_simple' => 1,
                    'v_simpleid' => NULL,
                    'currency' => 'CZK',
                    'unit' => '',
                    'similaritempriceflag' => 1,
                    'similaritemprice' => 0,
                    'order' => $order++,
                    'orderindex' => 0,
                    'user_note' => '',
                    'url_import' => '',
                    'color_import' => '',
                    'id_import' => 0,
                    'tempish_id' => '',
                    'men' => 0,
                    'women' => 0,
                    'children' => 0,
                    'micro_kolobezky_code' => NULL,
                    'prima_outdoor_code' => NULL,
                    'aspire_code' => NULL,
                    'salming_code' => NULL,
                    'floorballplayer_code' => NULL,
                    'yate_code' => NULL,
                    'brand' => 1,
                    'updated' => date('Y-m-d H:i:s'),
                    'offdate' => '0000-00-00 00:00:00',
                    'ondate' => '0000-00-00 00:00:00',
                    'import_active' => 1,
                    'taxbox' => -1
                ];

                $this->dibi->query('INSERT INTO [eshop_catalog]', $dataCatalog);

                $lastId = $this->dibi->getInsertId();

                /* cena */
                $dataPrice = [
                    'itemid' => $lastId,
                    'imp_idgroup' => NULL,
                    'params' => '',
                    'catno' => (string) ($item->Code),
                    'partno' => '',
                    'ean' => '',
                    'purchaseprice' => intval($item->PriceDea),
                    'commonprice' => 0,
                    'pcvflag' => 0,
                    'price' => intval($item->PriceEU),
                    'availability' => 3,
                    'simple' => 1,
                    'order' => 0,
                    'deleted' => 0,
                    'usestorecount' => 0,
                    'storecount' => 0,
                    'minordercount' => 0,
                    'supplier_stock' => 0,
                    'OznX1' => '',
                    'PozY1' => '',
                    'supplier_taken' => 0
                ];

                $this->dibi->query('INSERT INTO [eshop_catalog_variants]', $dataPrice);


                /* katerogie */
                foreach (['Level1', 'Level2', 'Level3'] AS $_level) {
                    $tmp = explode(' ', $item->SPresentTree->{$_level});
                    unset($tmp[0]);
                    $level = implode(' ', $tmp);

                    $kategorieId = $this->dibi->query(sprintf('SELECT id FROM [eshop_category] WHERE [name] = "%s" LIMIT 1', $level))->fetchSingle();
                    if ($kategorieId) {
                        $dataKat = [
                            'iditem' => $lastId,
                            'idcat' => $kategorieId,
                            'topsales' => 0
                        ];
                        $this->dibi->query('INSERT INTO [eshop_catalog_bindcat]', $dataKat);
                    }
                }

                /* obrazky */
                $dataKat = [
                    'imp_idgroup' => NULL,
                    'name' => '',
                    'description' => '',
                    'file' => '',
                    'extfile' => NULL,
                    'ext' => 0,
                    'type' => 1,
                    'order' => 0,
                    'owner_group' => NULL,
                    'idgal' => NULL,
                    'watermark' => 0,
                    'deleted' => 0,
                    'upload_date' => date('Y-m-d H:i:s')
                ];
                $this->dibi->query('INSERT INTO [files]', $dataKat);
                $idFotky = $this->dibi->getInsertId();

                /* obrazky */
                if (!file_exists($this->slozka . $lastId . '/' . $idFotky . '/'))
                    mkdir($this->slozka . $lastId . '/' . $idFotky . '/', 0777, true);

                copy($item->ImgUrl, $this->slozka . $lastId . '/' . $idFotky . '/' . $this->webalize($item->Name) . '.jpg');

                $this->dibi->query('UPDATE [eshop_catalog] SET idfile = ' . $idFotky . ' WHERE id = ' . $lastId);
                $this->dibi->query('UPDATE [files] SET file = "' . ($this->slozkaDb . $lastId . '/' . $idFotky . '/' . $this->webalize($item->Name) . '.jpg') . '" WHERE id = ' . $idFotky);
            } else {
                $lastId = $this->dibi->query(sprintf("SELECT id FROM [eshop_catalog] WHERE [id] = %s LIMIT 1", $idKat))->fetchSingle();
                foreach (['Level1', 'Level2', 'Level3'] AS $_level) {
                    $tmp = explode(' ', $item->SPresentTree->{$_level});
                    unset($tmp[0]);
                    $level = implode(' ', $tmp);

                    if ($level) {
                        $kategorieId = $this->dibi->query(sprintf('SELECT id FROM [eshop_category] WHERE [name] = "%s" LIMIT 1', $level))->fetchSingle();
                        if ($kategorieId) {
                            $bindCat = $this->dibi->query(sprintf("SELECT iditem FROM [eshop_catalog_bindcat] WHERE [iditem] = %s AND [idcat] = %s LIMIT 1", $lastId, $kategorieId))->fetchSingle();
                            if (!$bindCat) {
                                $dataKat = [
                                    'iditem' => $lastId,
                                    'idcat' => $kategorieId,
                                    'topsales' => 0
                                ];
                                $this->dibi->query('INSERT INTO [eshop_catalog_bindcat]', $dataKat);
                            }
                        }
                    }
                }

                $action = $news = 0;
                if ($item->SisName == 'Výprodej')
                    $action = 1;
                if ($item->SisName == 'Novinka')
                    $news = 1;

                $this->dibi->query(sprintf('UPDATE [eshop_catalog] SET action = %s, news = %s WHERE id = %s', $action, $news, $lastId));
            }
        }
    }

    private $prevodniTabulka = [
        'ä' => 'a',
        'Ä' => 'A',
        'á' => 'a',
        'Á' => 'A',
        'à' => 'a',
        'À' => 'A',
        'ã' => 'a',
        'Ã' => 'A',
        'â' => 'a',
        'Â' => 'A',
        'č' => 'c',
        'Č' => 'C',
        'ć' => 'c',
        'Ć' => 'C',
        'ď' => 'd',
        'Ď' => 'D',
        'ě' => 'e',
        'Ě' => 'E',
        'é' => 'e',
        'É' => 'E',
        'ë' => 'e',
        'Ë' => 'E',
        'è' => 'e',
        'È' => 'E',
        'ê' => 'e',
        'Ê' => 'E',
        'í' => 'i',
        'Í' => 'I',
        'ï' => 'i',
        'Ï' => 'I',
        'ì' => 'i',
        'Ì' => 'I',
        'î' => 'i',
        'Î' => 'I',
        'ľ' => 'l',
        'Ľ' => 'L',
        'ĺ' => 'l',
        'Ĺ' => 'L',
        'ń' => 'n',
        'Ń' => 'N',
        'ň' => 'n',
        'Ň' => 'N',
        'ñ' => 'n',
        'Ñ' => 'N',
        'ó' => 'o',
        'Ó' => 'O',
        'ö' => 'o',
        'Ö' => 'O',
        'ô' => 'o',
        'Ô' => 'O',
        'ò' => 'o',
        'Ò' => 'O',
        'õ' => 'o',
        'Õ' => 'O',
        'ő' => 'o',
        'Ő' => 'O',
        'ř' => 'r',
        'Ř' => 'R',
        'ŕ' => 'r',
        'Ŕ' => 'R',
        'š' => 's',
        'Š' => 'S',
        'ś' => 's',
        'Ś' => 'S',
        'ť' => 't',
        'Ť' => 'T',
        'ú' => 'u',
        'Ú' => 'U',
        'ů' => 'u',
        'Ů' => 'U',
        'ü' => 'u',
        'Ü' => 'U',
        'ù' => 'u',
        'Ù' => 'U',
        'ũ' => 'u',
        'Ũ' => 'U',
        'û' => 'u',
        'Û' => 'U',
        'ý' => 'y',
        'Ý' => 'Y',
        'ž' => 'z',
        'Ž' => 'Z',
        'ź' => 'z',
        'Ź' => 'Z'
    ];

    private
            function webalize($string) {
        $url = strtr($string, $this->prevodniTabulka);
        $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
        $url = trim($url, "-");
        $url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
        $url = strtolower($url);
        $url = preg_replace('~[^-a-z0-9_]+~', '', $url);
        return $url;
    }

}

To je starý kód importu....

 

A druhá věc jak mohu v payments udělat možnost že pokud dotyčný nakoupí za 3000Kč tak má dopravu zadarmo?

Předem děkuji všem dotyčným za pomoc

Nahlásit jako SPAM
IP: 94.112.128.–
peter
~ Anonymní uživatel
2983 příspěvků
31. 10. 2017   #2
-
0
-

Nebo mas s necim problem, s cim, co jsi pro reseni udelal a ten nefunkcni kod a funkcni kod, zdrojovy xml predtim a nyni mas?
Ten kod mi prijde jako trosku smes. Ja bych si napsal zvlast cast, ktera to parsuje a zvlast cast, ktera to dava do db.

Se mi to jevi zatim tak, ze se nam pokousis zadat praci. Takze inzerat, nabidka prace? Odmena?

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
jAkErCZ0
Návštěvník
31. 10. 2017   #3
-
0
-

#2 peter

Jde o to že tento kód nám na zakázku dělal jeden člověk viz Header kódu... ale jelikož jsme dle seriálu vytvořily nový e-shop postavený na nette rád bych abych nemusel ručně nahrávat produkt po produktu tak ten kód upravit tak aby jej nette s ním umělo pracovat jelikož já osobně jsem se ještě nesetkal s nette importem pomocí xml->db 

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+12
Guru
31. 10. 2017   #4
-
0
-

#3 jAkErCZ
Tak řekni tomu autorovi, ať ti udělá i ten import.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Návštěvník
31. 10. 2017   #5
-
0
-

#4 Kit

Podle informací dost lidí říká že tento import co udělal je úplná slátanina a to jsme za to nechali 1000kč... proto se chci pokusit na nette udělat podobnou věc ale ještě jak říkám sem se nesetkal s nette a xml.... proto sem píši.

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+12
Guru
31. 10. 2017   #6
-
0
-

#5 jAkErCZ
Otázkou je, proč dělat import v Nette...

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Návštěvník
31. 10. 2017   #7
-
0
-

#6 Kit
Tak asi třeba proto protože potřebujeme nahrát do db asi 5k produktů? A ručně to nikdo dělat nebude? A protože nám velkoobchodník dal xml import kde ty všechny produkty má?

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+12
Guru
31. 10. 2017   #8
-
0
-

#7 jAkErCZ
Ptal jsem se, proč snažíte import dělat v Nette. Potřebu importu samotného nijak nezpochybňuji.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
2983 příspěvků
1. 11. 2017   #9
-
0
-

jAkErCZ - Klid. Nenech se nasimi otazkami rozhodit. Ptame se, protoze nam unikaji zasadni informace.
Napriklad, KIT se te pta, proc to chces predelat pres nette framework? Ten samotny import muze byt proste extra php kod, jako do ted. Jen to musis upravit pro jinou strukturu db, xml.

1000 kc za ten kod mi prijde v pohode, pokud jsi s nim byl do ted spokojeny a delal, co ma. Neni uplne snadne takovy modul udelat. Je treba prave prozkoumat shop a zjistit, co a jak tam dela, insert kategorie, produktu, ...

A co ja vim, co vsechno ten kousek dela. Jsou tam 2 slozky, jedna asi se soubory, obrazky produktu.  Kategorie tam cislujes nejak rucne misto db, misto, abys tu tabulku vytahl z db (zpracujXmlKategorie).
Je tam kod, pridej kategorii, lvl 1, 2, 3. Pridej novy produkt. To je tam nejak 2x a jeste asi pro kazdou kategorii jine. Asi spatne navrhnute db tabulky. Pak tam mas deleni na vyprodej / novinka. Pole asi 20 polozek kolem ceny. 20 polozek kolem obrazku. A na zaver kod pro odstraneni diakritiky, asi kvuli presunu obrazku na server, kde diakritika nedela dobrotu. Prijde mi to celkem promyslene a slozite do toho zasahovat.

Nahlásit jako SPAM
IP: 2001:718:2601:258:50c5:ea...–
jAkErCZ0
Návštěvník
1. 11. 2017   #10
-
0
-

#8 Kit
#9 peter

Vlastně máte pravdu, já nemusím mít import v nette ale může být zvlášť :) V tom případě to musím nějak upravit a to bude oříšek.

Nahlásit jako SPAM
IP: 94.112.128.–
jAkErCZ0
Návštěvník
2. 11. 2017   #11
-
0
-

Asi by jste mi někdo nepomohl z úpravou na stávající novou db?

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+12
Guru
2. 11. 2017   #12
-
0
-

#11 jAkErCZ
To je mi divná otázka, která vlastně ani neobsahuje konkrétní dotaz.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Návštěvník
2. 11. 2017   #13
-
0
-

#12 Kit

Co je na tom divného? Zeptal jsem se zda-li by mi někdo nepomohl s předěláním a úpravou na nový systém... Jelikož v novém systému se již kategorie dělají trošku jinak to stejné produkty a obrázky též..

Nahlásit jako SPAM
IP: 94.112.128.–
peter
~ Anonymní uživatel
2983 příspěvků
2. 11. 2017   #14
-
0
-

'Jelikož v novém systému se již kategorie dělají trošku jinak to stejné produkty a obrázky'
Asi ocekavas jakysi zpusob telepatie, kde to budeme vedet, jak pracoval stary system a jak pracuje novy.
Ale mohl bys prijit treba s vlastni upravou a rici, co ti tam nefunguje, ikdyz si myslis, ze to mas podle kodu spravne.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
jAkErCZ0
Návštěvník
7. 11. 2017   #15
-
0
-

#12 Kit
#14 peter

Tak jsem se pokusil udělat vlastní úpravu... 

Ale mám problém s obrázky... jelikož v systému fungují tak že..

Ve složce se vytvoří obrázek ve tvaru 1_0.jpg = id_produktu_číslo kolikátý obrázek to je.jpg

VZOR -> 1_0.jpg,1_1.jpg = Produkt ID 1 má 2 obrázky

A pak také v databázi products v řádku images_count doplnit kolik obrázků je...

 

<?php

/**
 * Description of Import
 *
 * @author David Skála <skala2524@gmail.com>
 */
class Import {

    CONST URL = 'http://navratws:ws13852@WWW.SPOKEY.CZ/i6ws/Default.asmx/GetResult?resultType=X-StoItemBaseComplEl';

    private $slozka;
    private $slozkaDb;

    /** @var DibiConnection */
    private $dibi;

    public function __construct($dibi) {
        $this->log('init');

        $this->dibi = $dibi;
        $this->slozka = __DIR__ . '/../images/products/';
        $this->slozkaDb = 'images/products/';

        /*
          $cdir = scandir($this->slozka);
          foreach ($cdir as $value) {
          if (intval($value) > 112)
          $this->rrmdir($this->slozka . $value);
          }
          exit;
         */
    }

    private function rrmdir($dir) {
        if (is_dir($dir)) {
            $objects = scandir($dir);
            foreach ($objects as $object) {
                if ($object != "." && $object != "..") {
                    if (is_dir($dir . "/" . $object))
                        $this->rrmdir($dir . "/" . $object);
                    else
                        unlink($dir . "/" . $object);
                }
            }
            rmdir($dir);
        }
    }

    /**
     * 
     * @param string $message
     */
    private function log($message) {
        echo sprintf('<span style="color: #CCC;">bellugio:</span> %s<br>', $message);
    }

    /**
     * 
     * @return type
     */
    public function getXml() {
        $this->log('getXml: ' . self::URL);
        return file_get_contents(self::URL);
    }

    public function zpracujXmlKategorie($xml) {

        $poleLevel1 = [
            'Míčové a společenské sporty' => 2,
            'Fitness a posilovna' => 2,
            'Vodní sporty' => 2,
            'Skating' => 2,
            'Bojové sporty' => 2,
            'Tenis a badminton' => 2,
            'Outdoor' => 3,
            'Sport. obuv a nazouváky' => 4,
            'Termoprádlo' => 4,
            'Funkční oblečení' => 4
        ];

        foreach ($xml->StoItem as $item) {
            $tmp1 = explode(' ', $item->SPresentTree->Level1);
            unset($tmp1[0]);
            $level1 = trim(implode(' ', $tmp1));
            $idLevel0 = isset($poleLevel1[$level1]) ? $poleLevel1[$level1] : 'false';

            /* level 1 */
            if ($idLevel0) {
                $data = $this->vratDataProKategorii($idLevel0, $level1);
                $kategorieId_1 = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle();
                if (!$kategorieId_1) {
                    $this->dibi->query('INSERT INTO [category]', $data);
                    $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 1, $level1));
                    $kategorieId_1 = $this->dibi->getInsertId();
                }

                /* level 2 */
                $tmp2 = explode(' ', $item->SPresentTree->Level2);
                unset($tmp2[0]);
                $level2 = trim(implode(' ', $tmp2));
                if ($level2) {
                    $data = $this->vratDataProKategorii($kategorieId_1, $level2);
                    $kategorieId_2 = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle();
                    if (!$kategorieId_2) {
                        $this->dibi->query('INSERT INTO [category]', $data);
                        $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 2, $level2));
                        $kategorieId_2 = $this->dibi->getInsertId();
                    }

                    /* level 3 */
                    $tmp3 = explode(' ', $item->SPresentTree->Level3);
                    unset($tmp3[0]);
                    $level3 = trim(implode(' ', $tmp3));
                    if ($level3) {
                        $data = $this->vratDataProKategorii($kategorieId_2, $level3);
                        $kategorieId_3 = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle();
                        if (!$kategorieId_3) {
                            $this->dibi->query('INSERT INTO [category]', $data);
                            $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 3, $level3));
                        }
                    }
                }
            }
        }
    }

    private function vratDataProKategorii($parentId, $jmeno) {
         $orderid = $this->dibi->query("SELECT max(category.order_no) AS order_nos FROM [category]")->fetchSingle() + 1;
        return [
            'url' => $this->webalize($jmeno),
            'title' => $jmeno,
            'order_no' => $orderid++,
            'hidden' => 0,
            'parent_category_id' => $parentId
        ];
    }

    /**
     * 
     * @param type $xml
     */
    public function zpracujXmlZbozi($xml) {
        $order = $this->dibi->query("SELECT max(eshop_catalog.order) AS orders FROM [eshop_catalog]")->fetchSingle() + 1;

        foreach ($xml->StoItem as $item) {
            $idKat = $this->dibi->query(sprintf("SELECT product_id FROM [product] WHERE [code] = '%s' LIMIT 1", $item->Code))->fetchSingle();
            $nazev = $idKat ? $this->dibi->query(sprintf("SELECT title FROM [product] WHERE [product_id] = %s LIMIT 1", $idKat))->fetchSingle() : false;

            if (!$nazev) {
                $this->log($item->Id . ': ' . $item->Name);

                if ($item->SisName == 'Výprodej')
                    $action = 1;
                if ($item->SisName == 'Novinka')
                    $news = 1;

                $dataCatalog = [
                    'product_id' => intval($item->Id),
                    'code' => (string) ($item->Code),
                    'url' => $this->webalize($item->Name),
                    'title' => (string) $item->Name,
                    'shortname' => (string) $item->Name,
                    'short_description' => (string) $item->Note,
                    'description' => (string) $item->Note,
                    'price' => intval($item->PriceEU),
                    'old_price' => intval($item->PriceDea),
                    'rating_sum' => 0,
                    'ratings' => 0,
                    'stock' => 1,                   	
                    'images_count' => 0,
                    'hidden' => 0                    
                ];

                $this->dibi->query('INSERT INTO [product]', $dataCatalog);
                
                $lastId = $this->dibi->getInsertId();

                /* katerogie */
                foreach (['Level1', 'Level2', 'Level3'] AS $_level) {
                    $tmp = explode(' ', $item->SPresentTree->{$_level});
                    unset($tmp[0]);
                    $level = implode(' ', $tmp);

                    $kategorieId = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [title] = "%s" LIMIT 1', $level))->fetchSingle();
                    if ($kategorieId) {
                        $dataKat = [
                            'product_id' => $lastId,
                            'category_id' => $kategorieId
                        ];
                        $this->dibi->query('INSERT INTO [product_category]', $dataKat);
                    }
                }

                $idFotky = $this->dibi->getInsertId();

                /* obrazky */
                if (!file_exists($this->slozka))
                    mkdir($this->slozka, 0777, true);

                copy($item->ImgUrl, $this->slozka . $this->intval($item->Id) . '.jpg');

                $this->dibi->query('UPDATE [product] SET images_count= ' . $idFotky . ' WHERE id = ' . $lastId);
            } else {
                $lastId = $this->dibi->query(sprintf("SELECT id FROM [eshop_catalog] WHERE [id] = %s LIMIT 1", $idKat))->fetchSingle();
                foreach (['Level1', 'Level2', 'Level3'] AS $_level) {
                    $tmp = explode(' ', $item->SPresentTree->{$_level});
                    unset($tmp[0]);
                    $level = implode(' ', $tmp);

                    if ($level) {
                        $kategorieId = $this->dibi->query(sprintf('SELECT id FROM [eshop_category] WHERE [name] = "%s" LIMIT 1', $level))->fetchSingle();
                        if ($kategorieId) {
                            $bindCat = $this->dibi->query(sprintf("SELECT iditem FROM [eshop_catalog_bindcat] WHERE [iditem] = %s AND [idcat] = %s LIMIT 1", $lastId, $kategorieId))->fetchSingle();
                            if (!$bindCat) {
                                $dataKat = [
                                    'iditem' => $lastId,
                                    'idcat' => $kategorieId,
                                    'topsales' => 0
                                ];
                                $this->dibi->query('INSERT INTO [eshop_catalog_bindcat]', $dataKat);
                            }
                        }
                    }
                }
            }
        }
    }

    private $prevodniTabulka = [
        'ä' => 'a',
        'Ä' => 'A',
        'á' => 'a',
        'Á' => 'A',
        'à' => 'a',
        'À' => 'A',
        'ã' => 'a',
        'Ã' => 'A',
        'â' => 'a',
        'Â' => 'A',
        'č' => 'c',
        'Č' => 'C',
        'ć' => 'c',
        'Ć' => 'C',
        'ď' => 'd',
        'Ď' => 'D',
        'ě' => 'e',
        'Ě' => 'E',
        'é' => 'e',
        'É' => 'E',
        'ë' => 'e',
        'Ë' => 'E',
        'è' => 'e',
        'È' => 'E',
        'ê' => 'e',
        'Ê' => 'E',
        'í' => 'i',
        'Í' => 'I',
        'ï' => 'i',
        'Ï' => 'I',
        'ì' => 'i',
        'Ì' => 'I',
        'î' => 'i',
        'Î' => 'I',
        'ľ' => 'l',
        'Ľ' => 'L',
        'ĺ' => 'l',
        'Ĺ' => 'L',
        'ń' => 'n',
        'Ń' => 'N',
        'ň' => 'n',
        'Ň' => 'N',
        'ñ' => 'n',
        'Ñ' => 'N',
        'ó' => 'o',
        'Ó' => 'O',
        'ö' => 'o',
        'Ö' => 'O',
        'ô' => 'o',
        'Ô' => 'O',
        'ò' => 'o',
        'Ò' => 'O',
        'õ' => 'o',
        'Õ' => 'O',
        'ő' => 'o',
        'Ő' => 'O',
        'ř' => 'r',
        'Ř' => 'R',
        'ŕ' => 'r',
        'Ŕ' => 'R',
        'š' => 's',
        'Š' => 'S',
        'ś' => 's',
        'Ś' => 'S',
        'ť' => 't',
        'Ť' => 'T',
        'ú' => 'u',
        'Ú' => 'U',
        'ů' => 'u',
        'Ů' => 'U',
        'ü' => 'u',
        'Ü' => 'U',
        'ù' => 'u',
        'Ù' => 'U',
        'ũ' => 'u',
        'Ũ' => 'U',
        'û' => 'u',
        'Û' => 'U',
        'ý' => 'y',
        'Ý' => 'Y',
        'ž' => 'z',
        'Ž' => 'Z',
        'ź' => 'z',
        'Ź' => 'Z'
    ];

    private
            function webalize($string) {
        $url = strtr($string, $this->prevodniTabulka);
        $url = preg_replace('~[^\pL0-9_]+~u', '-', $url);
        $url = trim($url, "-");
        $url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
        $url = strtolower($url);
        $url = preg_replace('~[^-a-z0-9_]+~', '', $url);
        return $url;
    }

}

A s tím si nevím rady... plus ani nevím zda-li to mám dobře...

Nějaká pomoc?

Díky

Nahlásit jako SPAM
IP: 94.112.128.–
jAkErCZ0
Návštěvník
7. 11. 2017   #16
-
0
-

Jinak přikládám i strukturu DB se kterými se pracuje...

product

Pro produkty vytvoříme tabulku product. Bude obsahovat následující sloupce:

product_id (int) - Id produktu, primární klíč, autoincrement
code (varchar 255) - Kód produktu pro obchodníka (např. EAN nebo cokoli jiného)
url (varchar 255) - URL adresa produktu (např. zeleny-kvetinac-ella) pro lepší SEO optimalizaci
title (varchar 255) - Titulek produktu
short_description (varchar 255) - Krátký popisek do HTML meta tagu
description (text) - Delší popisek pro detail produktu, může obsahovat HTML formátování
price (decimal(10,1)) - Cena produktu
old_price (decimal(10,1)) - Stará cena produktu (pokud je zlevněný)
rating_sum (int) - Součet hodnocení produktu (celkový počet udělených hvězdiček uživateli)
ratings (int) - Počet hodnocení produktu
stock (int) - Počet kusů produktu na skladu
images_count (int) - Počet obrázků u produktu
hidden (tinyint) - Označuje zda je produkt skrytý (1/0), viz dále.

Přidejme tabulku category s následujícími sloupci:

category_id (int) - Id kategorie, primární klíč, autoincrement
url (varchar 255) - URL adresa odkazu
title (varchar 255) - Titulek
order_no (int) - Určuje pořadí položek
hidden (tinyint) - Určuje, zda je položka skrytá (můžeme tak skrýt nějaké systémové kategorie, viz dále)
parent_catego­ry_id (int, nullový) - Id rodičovské položky (pod kterou má být položka zařazena) nebo NULL, cizí klíč

řidáme tabulku product_category s následujícími sloupci:

product_catego­ry_id (int) - Id vazebního řádku, primární klíč, autoincrement
product_id (int) - Id produktu, cizí klíč
category_id (int) - Id kategorie, do které produkt patří, cizí klíč

To jsou DB které se používají.

Pokusil jsem se dle těchto DB upravit cron ale nevím zda-li jej mám dobře plus to co jsem psal výše.

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+12
Guru
7. 11. 2017   #17
-
0
-

#15 jAkErCZ
Možná, kdybys vyhodil zbytečnou proměnnou $prevodniTabulka, vypadalo by to mnohem lépe.
 

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Návštěvník
7. 11. 2017   #18
-
0
-

#17 Kit

Jako osobně jsem v tom začátečník, pokud dobře vím převodní tabulka mi převádí háčky ne?

Mám na to 2 dny to opravit jinak je problém... :/

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+12
Guru
7. 11. 2017   #19
-
0
-

#18 jAkErCZ
Odstranění diakritiky dělá funkce iconv(), která je pod tím.

Podle mne je zjišťování počtu obrázků zcela k ničemu. Nepracuješ s polem, ale se seznamem.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Návštěvník
7. 11. 2017   #20
-
0
-

#19 Kit

Tak jak docílím toho aby obrázky se ukládaly jak mají + do sloupce images_count doplnil počet obrázků u daného produktu?

Jinak funkce odstraněna a funkce na úpravu textu upravena.

Nahlásit jako SPAM
IP: 94.112.128.–
peter
~ Anonymní uživatel
2983 příspěvků
8. 11. 2017   #21
-
0
-

Take mi neni jasne, proc ukladat obrazky jako image_count.
A kdyz obrazek smazes nekde uprostred, tak precislovavas obrazky kvuli poradi? Jestli by treba nebylo jednodussi pro produkt vytvorit slozku a do ni nahrat obrazky a pak nacist obsah cele slozky. Poradi pak urcit jako string v db se jmeny obrazku oddelenymi treba carkou. Pripadne, jestli mas obrazky v db, tak seznam id obrazku oddeleny carkou.

Nahlásit jako SPAM
IP: 2001:718:2601:258:f017:74...–
jAkErCZ0
Návštěvník
8. 11. 2017   #22
-
0
-

Ale ja to mám řešené tak ze mám složku images/product ve které se obrázky ukládají tak ze IdProduktu_kolikatyObrazekToJe.jpg

To znamená mám obrázek s ID 1 a u nej mám 3 obrázky a ve složce mám 1_0.jpg,1_1.jpg,1_2.jpg a v Db product ve sloupci images_count se mi vytvoří argument kolik těch obrázku to dané ID ma v tomto případě 3 a pokud nějaký smažu odstraní se ze složky a v Db se aktualizuje na počet 2

Myslím ze řešené to je dobře jen potřebuji docílit cronu který to udělá s obrázky přesně tak jak jsem psal.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 37.188.171.–
jAkErCZ0
Návštěvník
11. 11. 2017   #23
-
0
-

#19 Kit
#21 peter

Nějaká rada? Jak to udělat ty obrázky v cronu tak jak píšu?

Nahlásit jako SPAM
IP: 94.112.128.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý