ACC SHELL
<?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