Zdravím, již jsem zde psal... ale bohužel jsem nechtěně označil téma jako uzamknuté a vyřešeno i když tomu tak nebylo proto píši znovu... Mám Cron který potřebuji upravit na nový systém viz struktura....
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_category_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_category_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íč
Zde je můj upravený Cron
<?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) {
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 product_id = ' . $lastId);
} else {
$lastId = $this->dibi->query(sprintf("SELECT product_id FROM [product] WHERE [product_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 category_id FROM [category] WHERE [title] = "%s" LIMIT 1', $level))->fetchSingle();
if ($kategorieId) {
$bindCat = $this->dibi->query(sprintf("SELECT product_id FROM [product_category] WHERE [product_id] = %s AND [category_id] = %s LIMIT 1", $lastId, $kategorieId))->fetchSingle();
if (!$bindCat) {
$dataKat = [
'product_id ' => $lastId,
'category_id' => $kategorieId
];
$this->dibi->query('INSERT INTO [product_category]', $dataKat);
}
}
}
}
}
}
}
private
function webalize($string) {
$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;
}
}
Ale mám problém s ukládáním obrázku...
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
Mohl by mi někdo poradit nebo pomoci abych dospěl k funkčnosti cronu?
Díky všem :)