ACC SHELL

Path : /srv/www/vhosts/centrumlb/administrace/libs/
File Upload :
Current File : /srv/www/vhosts/centrumlb/administrace/libs/katalog.class.php

<?php

/**
 *
 *
 * @version $Id$
 * @copyright 2010
 * @name Zpracování katalogovych produktu
 */
class Katalog extends Tools
{

    public $currentpage = "";
    public $totalpages = "";
    public $pagesize = "100";

    /**
     * Constructor
     */
    function __construct()
    {
        
    }

    public function update($arr, $table = false)
    {
        if (!$table)
        {
            return false;
        }
        $result = dibi::query('UPDATE ', $table, ' SET ', $arr, ' WHERE id=%i', $arr['id']);
        if ($result)
        {
            return true;
        } else
        {
            return false;
        }
    }

    /**
     *
     * @param type $id id produktu
     * @return boolean
     */
    public function delete($id)
    {
        //$result = dibi::query('DELETE FROM katalog WHERE id_katalog=%i', $id);
        $main_id = dibi::query('SELECT main_id FROM katalog_popis WHERE id_produktu=%i', $id)->fetchSingle();
        Query::delAllTree($main_id, 'katalog');
        $result = dibi::query('DELETE FROM katalog_popis WHERE id_produktu=%i', $id);
        $result = dibi::query('DELETE FROM katalog_parametry WHERE id_produktu=%i', $id);
        $result = dibi::query('DELETE FROM katalog_hodnoceni WHERE id_produktu=%i', $id);
        if ($result)
        {
            return true;
        } else
        {
            return false;
        }
    }

    /**
     *
     * @param type $id id row
     * @return boolean
     */
    public function deleteVariant($id)
    {
        //$result = dibi::query('DELETE FROM katalog WHERE id_katalog=%i', $id);
        $cannotBeDeleted = dibi::query('SELECT * FROM objednavky_detail WHERE id_zbozi=%i', $id)->fetchSingle();
        //NDebugger::dump($canIdBeDeleted);exit;
        if ($cannotBeDeleted == false)
        {
            $result = dibi::query('DELETE FROM katalog_popis WHERE id=%i', $id);
            $result = dibi::query('DELETE FROM katalog_parametry WHERE id_katalog=%i', $id);
            //$result = dibi::query('DELETE FROM katalog_hodnoceni WHERE id_katalog=%i', $id);
            if ($result)
            {
                return 200;
            } else
            {
                return 500;
            }
        }
        return 501;
    }

    /**
     *
     * @param type $main_id main_id produktu
     * @return boolean
     */
    public function deleteAll($main_id)
    {
        $result = dibi::query('DELETE FROM katalog WHERE id=%i', $main_id);

        $pole = dibi::query('SELECT id FROM katalog_popis WHERE main_id=%i', $main_id)->fetchAll();

        foreach ($pole as $p)
        {
            $this->delete($p->id);
        }
        if ($result)
        {
            return true;
        } else
        {
            return false;
        }
    }

    public function getAdminTable($katalogId)
    {
        if (isset($_SESSION['listuj']))
            $this->pagesize = $_SESSION['listuj'];

        if (isset($_GET['recordstart']))
        {
            $recordstart = (isset($_GET['recordstart'])) ? (int) $_GET['recordstart'] : 0;
        } else
            $recordstart = 0;

        $query = '
		SELECT a.id, a.main_id, a.nazev, a.cena, a.akcni_cena, a.bezna_cena,
                a.obrazek,a.obrazek2,a.obrazek3,a.obrazek4,a.obrazek5,
		a.stav, a.cislo, a.kod,a.doplnek, a.anotace,a.obsah,
		a.varianta, a.doplnek, a.novinka, a.akcni, a.nejprodavanejsi, a.index, a.sklad, a.barvanadpisu,
                if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") as akcniZbozi,
			c.nazev nazev_hodnoty, b.id_hodnoty_parametru, b.id_parametru
		    FROM katalog_popis a
		    LEFT JOIN katalog_parametry b
			ON a.id=b.id_katalog
		    LEFT JOIN parametry_hodnoty c
			ON c.id=b.id_hodnoty_parametru
		    LEFT JOIN katalog d
			ON d.id = a.main_id
		    WHERE lang=1
			AND a.varianta=0 ';
        if (isset($katalogId) && !empty($katalogId))
        {
            $k = dibiArrayToString($katalogId);
            $query .= ' AND id_kategorie IN (' . $k . ') ';
        }
        $query .= 'ORDER BY d.lft ASC';


        $num_rows = dibi::query($query)->count();

        if ($num_rows > $this->pagesize)
        {
            $query .= " LIMIT $recordstart, $this->pagesize";
        }


        $pole = dibi::query($query)->fetchAll();
        //NDebugger::dump($pole);
        $this->totalpages = ceil($num_rows / $this->pagesize);
        $this->currentpage = ($recordstart / $this->pagesize) + 1;


        $id = 0;
        $item = '';
        foreach ($pole as $value)
        {
            //echo '<pre>';print_r($value);echo '</pre>';
            if ($id != $value->id)
            {
                $item[$value->id]['pocet_variant'] = dibi::query('SELECT count(id) FROM katalog_popis WHERE varianta=1 AND main_id=%i', $value->main_id)->fetchSingle();
                $item[$value->id]['id'] = $value->id;
                $item[$value->id]['main_id'] = $value->main_id;
                $item[$value->id]['nazev'] = html_entity_decode($value->nazev);
                $item[$value->id]['cena'] = $value->cena;
                $item[$value->id]['akcni_cena'] = $value->akcni_cena;
                $item[$value->id]['bezna_cena'] = $value->bezna_cena;
                $item[$value->id]['obrazek'] = $value->obrazek;
                $item[$value->id]['anotace'] = html_entity_decode($value->anotace);
                $item[$value->id]['obsah'] = html_entity_decode($value->obsah);
                $item[$value->id]['cislo'] = $value->cislo;
                $item[$value->id]['kod'] = $value->kod;
                $item[$value->id]['stav'] = $value->stav;
                $item[$value->id]['barvanadpisu'] = $value->barvanadpisu;
                $item[$value->id]['sklad'] = $value->sklad;
                $item[$value->id]['index'] = $value->index;
                $item[$value->id]['akce'] = $value->akcniZbozi = 'ano' ? 1 : 0;
                $item[$value->id]['novinka'] = $value->novinka;
                $item[$value->id]['nejprodavanejsi'] = $value->nejprodavanejsi;
                $item[$value->id]['parametr'][$value->id_parametru] = $value->nazev_hodnoty;
                $id = $value->id;
            } else
            {
                $item[$value->id]['parametr'][$value->id_parametru] = $value->nazev_hodnoty;
            }
        }

        return $item;
    }

    public function fetchAll($arr)
    {

        if (isset($_SESSION['listuj']))
            $this->pagesize = $_SESSION['listuj'];

        $recordstart = (isset($_GET['recordstart'])) ? (int) $_GET['recordstart'] : 0;


        $arr['lang'] = isset($arr['lang']) && intval($arr['lang']) != 0 ? $arr['lang'] : 1;

        $query = '
		SELECT a.id, a.main_id, a.id_produktu, a.nazev,
                a.cena,a.akcni_cena,a.bezna_cena,a.akcni_od, a.akcni_do, 
                if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") AS akcniZbozi,
                a.poznamka,a.cislo,
                a.obrazek,a.obrazek2,a.obrazek3,a.obrazek4,a.obrazek5,
		a.stav,a.anotace, a.obsah, a.kod, a.url, a.sklad,
		a.varianta, a.doplnek, a.novinka, a.akcni, a.nejprodavanejsi, a.index,
		d.main_id AS id_kategorie, d.url AS url_kategorie, d.nazev AS nazev_kategorie, d.seo_nazev AS seo_nazev_kategorie, e.hodnoceni, a.barvanadpisu
		    FROM katalog_popis a
		    LEFT JOIN katalog_prirazeni b
			ON a.id_produktu=b.katalog_id
		    LEFT JOIN kategorie_popis d
			ON b.kategorie_id=d.main_id
		    LEFT JOIN katalog_hodnoceni e
			ON e.id_produktu = a.id_produktu
			WHERE ';
        $query .= ' a.lang=' . $arr['lang'];

        if (isset($arr['main_id']) && intval($arr['main_id']) != 0)
        {
            $query .= ' AND a.main_id=' . $arr['main_id'];
        }
        /*
          if (isset($arr['id_kategorie']) && intval($arr['id_kategorie']) != 0) {
          $query .= ' AND a.id_kategorie=' . $arr['id_kategorie'];
          }
         *
         */
        if (isset($arr['index']))
        {
            $query .= ' AND a.index=' . intval($arr['index']);
        }
        if (isset($arr['varianty']))
        {
            $query .= ' AND a.varianta=' . intval($arr['varianty']);
        }
        if (isset($arr['musi_mit_varianty']))
        {
            $query .= ' AND pocet_variant>0';
        }
        if (isset($arr['zobrazitTyp']))
        {
            if ($arr['zobrazitTyp'] == 'akcni')
            {
                $query .= ' AND ( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND akcni_cena != 0';
            }
            if ($arr['zobrazitTyp'] == 'novinky')
            {
                $query .= ' AND novinka=1';
            }
        }

        /**
         * Zobrazeni i produktu vnorenych
         */
        if (isset($arr['id_kategorie']))
        {
            foreach ($arr['id_kategorie'] as $key => $val)
            {
                $ids_kat[] = $key;
            }
            if (isset($ids_kat))
            {
                $ids_kat = implode(',', $ids_kat);
            } else
            {
                $ids_kat = 0;
            }

            $query .= ' AND b.kategorie_id in (' . $ids_kat . ')';
        }
        /**
         * Zobrazeni variant
         */
        if (isset($arr['id_variant']))
        {
            foreach ($arr['id_variant'] as $key => $val)
            {
                $ids_kat[] = $key;
                //NDebugger::dump($val);exit;
            }
            if (isset($ids_kat))
            {
                $ids_kat = implode(',', $ids_kat);
            } else
            {
                $ids_kat = 0;
            }

            $query .= ' AND a.id in (' . $ids_kat . ')';
        }
        /**
         * Vysledky filtrovani
         */
        if (isset($arr['ids']))
        {
            foreach ($arr['ids'] as $key => $val)
            {
                $ids[] = $key;
            }
            if (isset($ids))
            {
                $ids = implode(',', $ids);
            } else
            {
                $ids = 0;
            }

            $query .= ' AND a.id_produktu in (' . $ids . ')';
        }
        if (isset($arr['stav']))
        {
            $query .= ' AND a.stav = ' . $arr['stav'];
        }
        $query .= ' GROUP BY a.id';
        if (isset($arr['sort']))
        {
            $query .= ' ORDER BY ' . $arr['sort'] . ' ' . $arr['sort_how'];
        }

        $sql = dibi::query($query);
        $num_rows = $sql->count();

        if ($num_rows > $this->pagesize)
        {
            $query .= " LIMIT $recordstart, $this->pagesize";
        }
        if (isset($arr['limit']))
        {
            $query .= ' LIMIT ' . $arr['limit'];
        }

        //myDebug($query);
        $this->totalpages = ceil($num_rows / $this->pagesize);
        $this->currentpage = ($recordstart / $this->pagesize) + 1;

        //return dibi::test($query);
        return dibi::query($query)->fetchAll();
    }

    public function search($arr)
    {

        $arr['lang'] = isset($arr['lang']) && intval($arr['lang']) != 0 ? $arr['lang'] : 1;

        $query = '
		SELECT a.id_produktu
		    FROM katalog_popis a
			WHERE a.stav=1 AND a.pocet_variant>0 AND a.varianta =0 AND MATCH (a.nazev, a.obsah) AGAINST ("' . $arr['search'] . '" IN boolean MODE)';

        $id_of_victims = dibi::query($query)->fetchAll();

        $query = '
		SELECT a.id, a.id_produktu, a.nazev, a.cena,a.akcni_cena,a.bezna_cena, a.obrazek,a.obrazek2,a.obrazek3,a.obrazek4,a.obrazek5,
		if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") as akcniZbozi,
                a.stav,a.anotace, a.obsah, a.kod, a.url,
		a.varianta, a.doplnek, a.novinka, a.akcni, a.nejprodavanejsi, a.index,
			d.url url_kategorie
		    FROM katalog_popis a
		    LEFT JOIN kategorie_popis d
			ON a.id_kategorie=d.main_id
			WHERE a.varianta =0 AND a.lang=' . $arr['lang'];
        if (isset($id_of_victims))
        {

            foreach ($id_of_victims as $val)
            {
                $ids[] = $val->id_produktu;
            }
            //NDebugger::dump($id_of_victims);exit;
            if (isset($ids))
            {
                $ids = implode(',', $ids);
            } else
            {
                $ids = 0;
            }

            $query .= ' AND a.id_produktu in (' . $ids . ')';
        }

        if (isset($arr['id_kategorie']) && intval($arr['id_kategorie']) != 0)
        {
            $query .= ' AND a.id_kategorie=' . $arr['id_kategorie'];
        }
        if (isset($arr['index']))
        {
            $query .= ' AND a.index=' . intval($arr['index']);
        }
        if (isset($arr['sort']))
        {
            $query .= ' ORDER BY ' . $arr['sort'] . ' ' . $arr['sort_how'];
        }
        $query .= ' GROUP BY a.id_produktu';
        //dibi::test($query);

        return dibi::query($query)->fetchAll();
    }

    public function fetchSingleById($arr)
    {
        if (!$arr['id'])
        {
            return false;
        }

        if (!$arr['lang'])
        {
            $arr['lang'] = 1;
        }

        $pole = dibi::query('
	    SELECT a.id, a.main_id, a.id_kategorie, a.id_produktu, a.nazev,a.dph,
	    a.cena,a.akcni_cena,a.bezna_cena, a.akcni_od, a.akcni_do, a.poznamka,a.cislo,a.kod,
	    a.obrazek,a.obrazek2,a.obrazek3,a.obrazek4,a.obrazek5,
	    a.stav,a.anotace, a.obsah, a.obsah2, a.url,
	    a.varianta, a.doplnek, a.novinka, a.akcni, a.nejprodavanejsi, a.index, 
            if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") as akcniZbozi,
            b.hodnoceni, a.barvanadpisu
	    FROM katalog_popis a
	    LEFT JOIN katalog_hodnoceni b
		ON b.id_produktu = a.id_produktu

	    WHERE a.id=%i', $arr['id'], ' AND a.lang=%i', $arr['lang'])->fetch();
//WHERE a.id=%i', $arr['id'], ' AND a.lang=%i', $arr['lang'])->fetch();
        $params = dibi::query('
	    SELECT a.id_katalog, a.id_produktu, a.id_hodnoty_parametru,
            b.nazev nazev_hodnoty,
            c.id, c.nazev nazev_parametru, c.varianty
            FROM katalog_parametry a
	    LEFT JOIN parametry_hodnoty b
		ON a.id_hodnoty_parametru=b.id
	    LEFT JOIN parametry c
		ON c.id=b.id_parametru
	    WHERE a.id_produktu=%i', $pole['id_produktu'])->fetchAll();

        $item['data'] = $pole;
        $item['params'] = $params == false ? false : $params;
        return $item;
    }

    /**
     *
     * @param type $url ziskani zaznamu na zaklade url produktu
     * @return boolean
     */
    public function fetchSingle($url)
    {
        if (!$url)
        {
            return false;
        }
// POZOR, pridano varianta=0 !!
        return dibi::query('
	    SELECT a.id, a.main_id, a.id_kategorie,  a.id_produktu, a.nazev,
	    a.cena,a.akcni_cena,a.bezna_cena,  a.akcni_od, a.akcni_do, a.poznamka,a.cislo,
	    a.obrazek,a.obrazek2,a.obrazek3,a.obrazek4,a.obrazek5,
	    a.stav,a.anotace, a.obsah, a.obsah2, a.kod, a.url,
	    a.varianta, a.doplnek, a.novinka, a.akcni, a.nejprodavanejsi, a.index, 
            if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") as akcniZbozi,
            b.hodnoceni, a.sklad, a.pocet_variant, a.barvanadpisu
	    FROM katalog_popis a
	    LEFT JOIN katalog_hodnoceni b
		ON b.id_produktu = a.id_produktu
	    WHERE a.url=%s AND varianta=0', $url)->fetch();
    }

    /**
     *
     * @param myId id vyrobku
     * @return 2 nejdrazsi polozky
     */
    public function fetchMohloBySeVamLibit($myId, $myCategory, $limit = false)
    {
        if (!$myId || !$myCategory)
        {
            return false;
            //throw new ErrorException('Default id must be set');
        }
        return dibi::query('
            SELECT a.*, 
                if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") as akcniZbozi,
                b.url url_kategorie FROM katalog_popis a 
            LEFT JOIN kategorie_popis b 
                ON a.id_kategorie = b.main_id 
                WHERE a.varianta = 0 AND a.id_produktu != %i', $myId, ' AND a.id_kategorie=%i', $myCategory, ' ORDER BY cena DESC LIMIT 2')->fetchAll();
    }

    /**
     *
     * @param myId id produktu
     * @param myCategory id kategorie
     * @return vsechny produkty z dane kategorie, krome $myId
     */
    public function fetchSouvisejiciProdukty($myId, $myCategory)
    {
        if (!$myId || !$myCategory)
        {
            return false;
            //throw new ErrorException('Default id must be set');
        }
        return dibi::query('
            SELECT a.*, 
                if(( akcni_od is null OR akcni_od<now()) AND ( akcni_do is null OR akcni_do>now() ) AND ( akcni_cena != 0 ), "ano", "ne") as akcniZbozi,
                b.url url_kategorie FROM katalog_popis a 
            LEFT JOIN kategorie_popis b 
                ON a.id_kategorie = b.main_id 
                WHERE a.varianta = 0 AND a.id_produktu != %i', $myId, ' AND a.id_kategorie=%i', $myCategory, ' ORDER BY id ASC')->fetchAll();
    }

    /**
     *
     * @param type $id Id produktu ke kteremu se parametry vztahuji
     * @param type $arr varianty 1/0
     * @todo 8.6.2012 zmeneno id_katalog na id_produktu
     * @return boolean
     */
    public function fetchParams($id, $arr = false)
    {
        if (!$id || intval($id) == 0)
        {
            return false;
        }
        return dibi::query('
	    SELECT
            a.id_katalog,
            b.nazev nazev_hodnoty, b.popis popis_hodnoty, b.obrazek popis_obrazek,
            c.id, c.nazev nazev_parametru, c.varianty, d.nazev, d.stav, d.sklad, d.cena
            FROM katalog_parametry a
	    LEFT JOIN parametry_hodnoty b
		ON a.id_hodnoty_parametru=b.id
	    LEFT JOIN parametry c
		ON c.id=b.id_parametru
	    LEFT JOIN katalog_popis d
		ON a.id_katalog = d.id
	    WHERE a.id_produktu=%i', $id)->fetchAll();
        //WHERE a.id_katalog=%i', $id)->fetchAll();
    }

    public function fetchParamsByIdProduktu($id, $arr = false)
    {
        if (!$id || intval($id) == 0)
        {
            return false;
        }
        return dibi::query('
	    SELECT
            a.id_katalog,
            b.nazev nazev_hodnoty, b.popis popis_hodnoty, b.obrazek popis_obrazek,
            c.id, c.nazev nazev_parametru, c.varianty
            FROM katalog_parametry a
	    LEFT JOIN parametry_hodnoty b
		ON a.id_hodnoty_parametru=b.id
	    LEFT JOIN parametry c
		ON c.id=b.id_parametru
            WHERE a.id_katalog=%i', $id)->fetchAll();
    }

    /**
     * Vrati seznam parametru, podle kterych se maji generovat varianty
     * @param type $id id kategorie ke ktere se parametry vztahuji
     * @return boolean
     */
    public function fetchParamsForVariant($id)
    {
        if (!$id)
        {
            return false;
        }

        return dibi::query('
	    SELECT * FROM parametry a
                    LEFT JOIN parametry_prirazeni c
                        ON c.id=a.id
                    WHERE a.varianty=1
                        AND id_kategorie IN %in', $id, ' GROUP BY a.id')->fetchAll();
    }

    public function povolit($id = false, $table = false)
    {
        if (!$id || !$table)
        {
            return false;
        }

        $result = dibi::query('UPDATE ', $table, ' SET stav=1 WHERE id_produktu=%i', $id);

        if ($result)
        {
            return true;
        }
        return false;
    }

    public function zakazat($id = false, $table = false)
    {
        if (!$id || !$table)
        {
            return false;
        }

        $result = dibi::query('UPDATE ', $table, ' SET stav=0 WHERE id_produktu=%i', $id);

        if ($result)
        {
            return true;
        }
        return false;
    }

    public function smazatFotku($id, $idObrazku = false)
    {

        if (!$idObrazku || $idObrazku == 0 || $idObrazku == 1)
        {
            $idObrazku = '';
        }

        $obrazek = dibi::query('SELECT obrazek' . $idObrazku . ' FROM katalog_popis WHERE id_produktu=%i', $id)->fetchSingle();
        $res = dibi::query('UPDATE katalog_popis SET obrazek' . $idObrazku . '=null WHERE id_produktu=%i', $id);
        //exit;
        if ($res)
        {
            unlink(ROOT . KATALOG_F_ADMIN_PATH . $obrazek);
            unlink(ROOT . KATALOG_F_S_PATH . $obrazek);
            unlink(ROOT . KATALOG_F_M_PATH . $obrazek);
            unlink(ROOT . KATALOG_F_L_PATH . $obrazek);
            unlink(ROOT . KATALOG_F_XL_PATH . $obrazek);
            return true;
        } else
        {
            return false;
        }
    }

    /**
     * Ulozi prirazeni do tabulky katalog_prirazeni
     * @param type $arr
     * @return boolean
     */
    public static function insertPrirazeni($arr)
    {

        $result = dibi::query('INSERT IGNORE INTO katalog_parametry ', $arr);

        if ($result)
        {
            //NDebugger::dump($result);NDebugger::dump(dibi::insertId());exit;
            return true;
            return dibi::insertId();
        } else
        {
            //$_SESSION['message_ko'][] = "Úprava neproběhla.";
            return false;
        }
    }

    /**
     * @var [id] => id parametru
     * @var [id_kategorie] => id kategorie ke ktere bude parametr prirazen
     */
    public function insertPrirazeniKatalog2Kategorie($id, $id_kategorie)
    {

        $arr = array(
            'katalog_id' => $id,
            'kategorie_id' => $id_kategorie
        );
        try
        {
            dibi::query('INSERT INTO katalog_prirazeni ', $arr);
        } catch (Exception $e)
        {
            return false;
        }
        return $id;
    }

    /**
     * 
     * @param type $idProduktu
     * @return sum of all product variant stock
     */
    public function getSkladoveZasoby($idProduktu = false)
    {
        if (!$idProduktu)
        {
            return false;
        }
        return dibi::query('SELECT SUM(sklad) FROM katalog_popis WHERE id_produktu=%i', $idProduktu)->fetchSingle();
    }

}

ACC SHELL 2018