ACC SHELL

Path : /srv/www/vhosts/toptisk/library/Core/
File Upload :
Current File : /srv/www/vhosts/toptisk/library/Core/Tools.php

<?php

/**
 * pokus o vytvoreni obecne tridy, kde budou univerzalni metody,
 * pouzitelne napric celym projektem
 * 
 * verze 1.0.1 - opraven bug (pridan trim do metody checkPhone)
 * 
 * verze 1.0.2 - v metode convertDate pridana kontrola, kdyz neni nalezen limiter pro explode
 */
class Core_Tools
{
    /**
     * odebere vsechny tagy ze vestupu vcetne veskereho contentu co obsahuji
     * @param <string> $text
     * @param <string> $tags - tagy ktere se nemaji resp maji rusit (dle nasledujiciho parametru)
     * @param <bool> $invert - pokud true, tak $tags se odebiraji, pokud false, tak se $tags naopak neodebiraji
     * @return <string>
     */
    public function strip_tags_content($text, $tags = '', $invert = FALSE) {

        preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags);
        $tags = array_unique($tags[1]);

        if(is_array($tags) AND count($tags) > 0)
        {
            if($invert == FALSE)
            {
                return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
            }
            else
            {
                return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
            }
        }
        elseif($invert == FALSE)
        {
            return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
        }
        return $text;
    }


    /**
     * metoda vygeneruje pole citajici $number prazdnych prvku
     * v pripade zadani parametru $array se prvky dogeneruji NAKONEC do zadaneho pole (jinak se vytovri nove)
     *
     * @param <integer> $number - pocet prvku, ktere maji byt v poli
     * @param <array> $array - nepovinny parametr pole, do ktereho se maji prazdne prvky dogenerovat
     * @return <array> vraci pole tvorene prazdnymi prvky (pripadne vstupni pole rozsirene o $number prazdnych prvku)
     */
    public function create_empty_array($number, $array = null) {
        
        //mam zadano pole?
        if($array !== null && is_array($array))
        {
            $ret = $array;
        }
        else
        {  //pokud ne, tak vytvorim nove
            $ret = array();
        }

        for($z = 0; $z < $number; $z++)
        {
            $ret[] = '';
        }
        return $ret;
    }

     /**
      * metoda vygeneruje relativne silne heslo o nastavitelne delce
      * heslo bere v potaz znaky vypadajici podobne (0/O, 1/l, y/z (qwuerty/qwertz problem)
      * @param <integer> $length - pozadovana delka hesla
      * @return <string> heslo
      */
    public function generate_password($length)
    {
        $samohlasky = 'aeiu';  //tvrde Y je schvalne vynechano, stejne jako Z (qwerty/qwertz problem), stejne jako o (kvuli nule)
        $souhlasky = 'hkrdtnbfmpsv';  //ch tam neni, pac jsou to defakto dve pismena
        $cisla = '23456789';   //neni tam 1 stejne jako u pismen neni l, protoze je to moc podobne ani nula (kvuli o)

        $password = '';
            $max_samohlasek = strlen($samohlasky) - 1;  //max index v poli samohlasek
            $max_souhlasek = strlen($souhlasky) - 1;    //max index v poli souhlasek
            $max_cisla = strlen($cisla) - 1;            //max index v poli cisel

        for($i = 0; $i < $length; $i++)
            {
                $typ = mt_rand(0, 2);               //nahodne, zda-li vyberu souhlasku ci samohlasku ci cislo
                $velke = mt_rand(0, 1);             //nahodne, zda-li bude pismeno velke ci male

                //vyberu samohlasku ci souhlasku
                if($typ == 0)
                {
                    $char = $souhlasky[mt_rand(0, $max_souhlasek)];
                }
                elseif($typ == 1)
                {
                    $char = $samohlasky[mt_rand(0, $max_samohlasek)];
                }
                else
                {
                    $char = $cisla[mt_rand(0, $max_cisla)];
                }

                //necham ji malou nebo ji prevedu na velkou
                if($velke == 1 && $typ < 2) //velke pismeno a soucasne se nejdena o cislo (cisla nejsou mala a velka:)
                {
                    $char = strtoupper($char);
                }

                //pridam znak do hesla
                $password .= $char;
            }
        return $password;
    }

    /**
     * metoda upravi telefonni cislo do mezinarodni podoby vcetne mezer
     * @param <string> $phone - telefon v jednom ze 4 moznych tvaru
     */
    public function checkPhone($phone)
    { 
        $phone = trim($phone);      //osekam mezery
        if(strlen($phone) == 16)    //tzn +420 123 456 789
        {   
            return $phone;  //cislo je uz spravne
        }

        if(strlen($phone) == 11)    //tzn 123 456 789
        {
            return '+420 ' . $phone;  //pridam +420
        }

        if(strlen($phone) == 13)    //tzn +420123456789
        {
            $ret = '';
            $array = preg_split('//', $phone, -1, PREG_SPLIT_NO_EMPTY); //prevedu sring na pole
            foreach($array as $pozice => $znak)
            {
                $ret .= $znak;  //pridavam znaky postupne
                if($pozice == 3 || $pozice == 6 || $pozice == 9)    //a ocas pridam mezeru
                {
                    $ret .= ' ';
                }
            }
            //var_dump($ret);exit;
            return $ret;
        }

        if(strlen($phone) == 9)    //tzn 123456789
        {
            $ret = '';
            $array = preg_split('//', $phone, -1, PREG_SPLIT_NO_EMPTY); //prevedu sring na pole
            foreach($array as $pozice => $znak)
            {
                $ret .= $znak;  //pridavam znaky postupne
                if($pozice == 2 || $pozice == 5 || $pozice == 8)    //a ocas pridam mezeru
                {
                    $ret .= ' ';
                }
            }
            return '+420 ' . $ret;
        }

        return null;    //chyba
        
    }

    /** Vytvoření (nejen) přátelského URL
    * @param string $nadpis řetězec v kódování UTF-8, ze kterého se má vytvořit URL
    * @return string řetězec obsahující pouze čísla, znaky bez diakritiky, podtržítko a pomlčku
    * @copyright Jakub Vrána, http://php.vrana.cz
     * 
     * ++ EDIT: aby URL mohla obsahovat i znak "+" (napr byt 4+1 apod)
     * ++ EDIT: v URL nemuze byt "/" - nahrazeno "-"
    */
    public function friendlyUrl($text)
    {
        setlocale(LC_CTYPE, 'cs_CZ.utf-8');
        $url = $text;
        $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;
    }

    public function getUniqueImageName($name)
    {
        //pak musim zjistit, jestli je unikatni v obou adresarich (pro nahledy i velke obrazky)
        $name = $this->_getFilenameUniqueInTwoDirs();

        return $name;
    }

    /**
     * metoda generuje unikatni jmeno souboru ve dvou adresarich soucasne
     * 
     * @param <string> $origin_name - puvodni jmeno souboru
     * @param <string> $directory - prvni adresar
     * @param <string> $directory_2 - druhy adresar
     * @return <string> - vysledne jmeno souboru
     */
    public function getFilenameUniqueInTwoDirs($origin_name, $directory, $directory_2)
    {
        $posledni_tecka_v_nazvu = strrpos($origin_name, '.');        
        $new_name = substr($origin_name, 0, $posledni_tecka_v_nazvu);   //nazev souboru bez koncovky
        $ext = substr($origin_name, $posledni_tecka_v_nazvu);   //koncovka souboru (vcetne uvodni tecky)
        
        //prevedu nazev souboru bez koncovky stejne jako URL
        $new_name = $this->friendlyUrl($new_name);
        $name = $new_name;
        $number = 1;    //suffix, ktery postupne iteruju, dokud neni nazev  unikatni v obou adresarich

        while(file_exists($directory . '/' . $name . $ext) || file_exists($directory_2 . '/' . $name . $ext))
        {
            $name = $new_name . '_' . $number;
            $number++;
        }
        return $name . $ext;
    }
    
    /**
     * metoda vezme sablonu, dosadi do ni za promenne a vrati ji jako string
     * @param <string> $sablona (nazev sablony - predpoklada se umisteni v adresari "APPLICATION_PATH . '/views/mail-templates/'"
     * @param <object> $data standardni objekt PHP s daty do sablony
     * @return <string>
     */
    public function getTemplate($sablona, $data)
    {
        ob_start();
        require (APPLICATION_PATH . '/views/mail-templates/' . $sablona . '.phtml');
        return ob_get_clean();
    }
    
    function mb_wordwrap_array($string, $width)
    {
        if (($len = mb_strlen($string, 'UTF-8')) <= $width)
        {
            return array($string);
        }

        $return = array();
        $last_space = FALSE;
        $i = 0;

        do
        {
            if (mb_substr($string, $i, 1, 'UTF-8') == ' ')
            {
                $last_space = $i;
            }

            if ($i > $width)
            {
                $last_space = ($last_space == 0) ? $width : $last_space;

                $return[] = trim(mb_substr($string, 0, $last_space, 'UTF-8'));
                $string = mb_substr($string, $last_space, $len, 'UTF-8');
                $len = mb_strlen($string, 'UTF-8');
                $i = 0;
            }

            $i++;
        }
        while ($i < $len);

        $return[] = trim($string);

        return $return;
    }
    
    /**
     * 18. 08. 2011 -> 2011-08-18 00:00:00
     * @param string $date 
     */
    public function convertDate($date)
    {
        $exploded_date = explode('.', $date);
        
        if($exploded_date[0] != $date)
        {
            return trim($exploded_date[2]) . '-' . trim($exploded_date[1]) . '-' . trim($exploded_date[0]) . ' 00:00:00';
        }
        
        return $date;
    }
    
    /**
     * metoda vraci unikatni jmeno pro soubor v danem adresari
     * pridava na konec nazvu souboru "_X", kde X je cislo zacinajici na 1 a iterujici do teoretickeho nekonecna...
     * @param <string> $folder - adresar, kde chceme aby nazev souboru byl unikatni
     * @param <string> $name - nazev souboru
     * @return <string>
     */
    public function getUniqueName($folder, $name)
    {
        //standarni uprava nazvu (odstraneni diakritiky, prevod na mala pismena atd)
        $posledni_tecka_v_nazvu = strrpos($name, '.');
        $name_without_ext = substr($name, 0, $posledni_tecka_v_nazvu);   //nazev souboru bez koncovky
        $ext = substr($name, $posledni_tecka_v_nazvu);   //koncovka souboru (vcetne uvodni tecky)
        
        $name = $this->friendlyUrl($name_without_ext);
        $new_name = $name . $ext;
        $iterace = 0;
        while(file_exists($folder . '/' . $new_name))
        {
            $iterace++;
            $new_name = $name . '_' . $iterace . $ext;
        }

        return $new_name;
    }
    
    public function getWrappedText($string, Zend_Pdf_Style $style, $max_width)
    {
        $wrappedText = '' ;
        $lines = explode("\n",$string);
        foreach($lines as $line) {
             $words = explode(' ',$line) ;
             $word_count = count($words) ;
             $i = 0 ;
             $wrappedLine = '' ;
             while($i < $word_count)
             {
                 /* if adding a new word isn't wider than $max_width,
                 we add the word */
                 if($this->_widthForStringUsingFontSize($wrappedLine.' '.$words[$i]
                     ,$style->getFont()
                     , $style->getFontSize()) < $max_width) {
                     if(!empty($wrappedLine)) {
                         $wrappedLine .= ' ' ;
                     }
                     $wrappedLine .= $words[$i] ;
                 } else {
                     $wrappedText .= $wrappedLine."\n" ;
                     $wrappedLine = $words[$i] ;
                 }
                 $i++ ;
             }
             $wrappedText .= $wrappedLine."\n" ;
         }
         return $wrappedText ;
    }
    
    /**
     * found here, not sure of the author :
     * http://devzone.zend.com/article/2525-Zend_Pdf-tutorial#comments-2535
     */
     protected function _widthForStringUsingFontSize($string, $font, $fontSize)
     {
         $drawingString = iconv('UTF-8', 'UTF-16BE//IGNORE', $string);
         $characters = array();
         for ($i = 0; $i < strlen($drawingString); $i++) 
         {
             $characters[] = (ord($drawingString[$i++]) << 8 ) | ord($drawingString[$i]);
         }
         $glyphs = $font->glyphNumbersForCharacters($characters);
         //$glyphs = $font->cmap->glyphNumbersForCharacters($characters);
         $widths = $font->widthsForGlyphs($glyphs);
         $stringWidth = (array_sum($widths) / $font->getUnitsPerEm()) * $fontSize;
         return $stringWidth;
     }
}

ACC SHELL 2018