mishanya Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) Добавляем в api/Design.php после: $this->smarty->registerPlugin('modifier', 'time', array($this, 'time_modifier')); регистрацию плагина, который будет переводить число в строку: $this->smarty->registerPlugin('modifier', 'num2str', array($this, 'num2str')); дальше в самом конце до последней закрывающей добавим две функции, одна для перевода в строку, вторая для склонения словоформы public function num2str($inn, $stripkop=false) { $nol = 'ноль'; $str[100]= array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот', 'восемьсот','девятьсот'); $str[11] = array('','десять','одиннадцать','двенадцать','тринадцать', 'четырнадцать','пятнадцать','шестнадцать','семнадцать', 'восемнадцать','девятнадцать','двадцать'); $str[10] = array('','десять','двадцать','тридцать','сорок','пятьдесят', 'шестьдесят','семьдесят','восемьдесят','девяносто'); $sex = array( array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),// m array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять') // f ); $forms = array( array('копейка', 'копейки', 'копеек', 1), // 10^-2 array('рубль', 'рубля', 'рублей', 0), // 10^ 0 array('тысяча', 'тысячи', 'тысяч', 1), // 10^ 3 array('миллион', 'миллиона', 'миллионов', 0), // 10^ 6 array('миллиард', 'миллиарда', 'миллиардов', 0), // 10^ 9 array('триллион', 'триллиона', 'триллионов', 0), // 10^12 ); $out = $tmp = array(); // Поехали! $tmp = explode('.', str_replace(',','.', $inn)); $rub = number_format($tmp[ 0], 0,'','-'); if ($rub== 0) $out[] = $nol; // нормализация копеек $kop = isset($tmp[1]) ? substr(str_pad($tmp[1], 2, '0', STR_PAD_RIGHT), 0,2) : '00'; $segments = explode('-', $rub); $offset = sizeof($segments); if ((int)$rub== 0) { // если 0 рублей $o[] = $nol; $o[] = morph( 0, $forms[1][ 0],$forms[1][1],$forms[1][2]); } else { foreach ($segments as $k=>$lev) { $sexi= (int) $forms[$offset][3]; // определяем род $ri = (int) $lev; // текущий сегмент if ($ri== 0 && $offset>1) {// если сегмент==0 & не последний уровень(там Units) $offset--; continue; } // нормализация $ri = str_pad($ri, 3, '0', STR_PAD_LEFT); // получаем циферки для анализа $r1 = (int)substr($ri,0,1); //первая цифра $r2 = (int)substr($ri,1,1); //вторая $r3 = (int)substr($ri,2,1); //третья $r22= (int)$r2.$r3; //вторая и третья // разгребаем порядки if ($ri>99) $o[] = $str[100][$r1]; // Сотни if ($r22>20) {// >20 $o[] = $str[10][$r2]; $o[] = $sex[ $sexi ][$r3]; } else { // <=20 if ($r22>9) $o[] = $str[11][$r22-9]; // 10-20 elseif($r22> 0) $o[] = $sex[ $sexi ][$r3]; // 1-9 } // Рубли $o[] = $this->morph($ri, $forms[$offset][ 0],$forms[$offset][1],$forms[$offset][2]); $offset--; } } // Копейки if (!$stripkop) { $o[] = $kop; $o[] = $this->morph($kop,$forms[0][0],$forms[0][1],$forms[0][2]); } return preg_replace("/\s{2,}/",' ',implode(' ',$o)); } public function morph($n, $f1, $f2, $f5) { $n = abs($n) % 100; $n1= $n % 10; if ($n>10 && $n<20) return $f5; if ($n1>1 && $n1<5) return $f2; if ($n1==1) return $f1; return $f5; } теперь модификатором можно пользоваться так:{$price|num2str} - вывод цены с копейками{$price|num2str:1} - вывод цены без копеек по аналогии выводим все что нужно:{$order->total_price|num2str} Функция взята из github Edited July 17, 2015 by mishanya Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) Отличное решение, как вариант. Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
Kors Posted July 16, 2015 Report Share Posted July 16, 2015 Отличное решение, как вариант. Что значит "как вариант"?Никакой это Вам не вариант, а добротно и образцово сделанная удобная разработка.Спасибо, mishanya! Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) Яж похвалил, Вам бы лишь накричать.Не кричите на меня дяденька. Я просто от поезда отстал. Не ел три дня.А то лицо обгрызу http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m19_zps335c7e60.gif Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
Kors Posted July 16, 2015 Report Share Posted July 16, 2015 Никто на Вас не кричал.Как вариант, обгрызите какой-нибудь огурчик, чтоб подкрепиться...За три дня даже автостопом можно пол-Европы проехать... Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) Никто на Вас не кричал.Как вариант, обгрызите какой-нибудь огурчик, чтоб подкрепиться...За три дня даже автостопом можно пол-Европы проехать... Корс. Зачем мне эти буйные советы? от огурчика до автостопа .... Какая жуткая логика и фантазия. ps Держите себя в руках киса! заграница нам поможет! (с) красит усы фирменной краской из Одессыpps Не задумывайтесь. Молчите. И не забывайте надувать щеки.© Бендер ppps У меня СИБИРЬ как 20 ваших европ. Кстати, европу беспокоит то, что ЗЛЫЕ БУБУБУ Русские меряют свою землю другими странами Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
Noxter Posted July 16, 2015 Report Share Posted July 16, 2015 Мишаня красавчик) Если бы еще убрать жестко прописанные рубли чтобы можно было использовать и другие валюты, скажем эвро, то было бы вообще гениально. Quote Link to post Share on other sites
mishanya Posted July 16, 2015 Author Report Share Posted July 16, 2015 (edited) Мишаня красавчик)Если бы еще убрать жестко прописанные рубли чтобы можно было использовать и другие валюты, скажем эвро, то было бы вообще гениально. тогда нужно передавать еще валюту походу. подумаю над этим на выходных и сделаю Edited July 16, 2015 by mishanya Quote Link to post Share on other sites
Noxter Posted July 16, 2015 Report Share Posted July 16, 2015 тогда нужно передавать еще валюту походу. подумаю над этим на выходных и сделаюУспехов в реализации! Quote Link to post Share on other sites
kuvila1 Posted July 16, 2015 Report Share Posted July 16, 2015 что то не работает фатал эрор( в чем беда? Quote Link to post Share on other sites
mishanya Posted July 16, 2015 Author Report Share Posted July 16, 2015 что то не работает фатал эрор( в чем беда? не совсем информативно. где именно? могу посмотреть, доступы фтп в личку. Quote Link to post Share on other sites
kuvila1 Posted July 16, 2015 Report Share Posted July 16, 2015 <?php /** * Simpla CMS * * @copyright 2011 Denis Pikusov * @link http://simplacms.ru * @author Denis Pikusov * */ require_once(dirname(__FILE__).'/'.'Simpla.php'); require_once(dirname(dirname(__FILE__)).'/Smarty/libs/Smarty.class.php'); class Design extends Simpla { public $smarty; public function __construct() { parent::__construct(); // Создаем и настраиваем Смарти $this->smarty = new Smarty(); $this->smarty->compile_check = $this->config->smarty_compile_check; $this->smarty->caching = $this->config->smarty_caching; $this->smarty->cache_lifetime = $this->config->smarty_cache_lifetime; $this->smarty->debugging = $this->config->smarty_debugging; $this->smarty->error_reporting = E_ALL & ~E_NOTICE; // Берем тему из настроек $theme = $this->settings->theme; $this->smarty->compile_dir = $this->config->root_dir.'/compiled/'.$theme; $this->smarty->template_dir = $this->config->root_dir.'/design/'.$theme.'/html'; // Создаем папку для скомпилированных шаблонов текущей темы if(!is_dir($this->smarty->compile_dir)) mkdir($this->smarty->compile_dir, 0777); $this->smarty->cache_dir = 'cache'; $this->smarty->registerPlugin('modifier', 'resize', array($this, 'resize_modifier')); $this->smarty->registerPlugin('modifier', 'token', array($this, 'token_modifier')); $this->smarty->registerPlugin('modifier', 'plural', array($this, 'plural_modifier')); $this->smarty->registerPlugin('function', 'url', array($this, 'url_modifier')); $this->smarty->registerPlugin('modifier', 'first', array($this, 'first_modifier')); $this->smarty->registerPlugin('modifier', 'cut', array($this, 'cut_modifier')); $this->smarty->registerPlugin('modifier', 'date', array($this, 'date_modifier')); $this->smarty->registerPlugin('modifier', 'time', array($this, 'time_modifier')); $this->smarty->registerPlugin('modifier', 'num2str', array($this, 'num2str')); $this->smarty->registerPlugin('function', 'api', array($this, 'api_plugin')); if($this->config->smarty_html_minify) $this->smarty->loadFilter('output', 'trimwhitespace'); } public function assign($var, $value) { return $this->smarty->assign($var, $value); } public function fetch($template) { // Передаем в дизайн то, что может понадобиться в нем $this->assign('config', $this->config); $this->assign('settings', $this->settings); return $this->smarty->fetch($template); } public function set_templates_dir($dir) { $this->smarty->template_dir = $dir; } public function set_compiled_dir($dir) { $this->smarty->compile_dir = $dir; } public function get_var($name) { return $this->smarty->getTemplateVars($name); } public function clear_cache() { $this->smarty->clearAllCache(); } private function is_mobile_browser() { $user_agent = $_SERVER['HTTP_USER_AGENT']; $http_accept = isset($_SERVER['HTTP_ACCEPT'])?$_SERVER['HTTP_ACCEPT']:''; if(eregi('iPad', $user_agent)) return false; if(stristr($user_agent, 'windows') && !stristr($user_agent, 'windows ce')) return false; if(eregi('windows ce|iemobile|mobile|symbian|mini|wap|pda|psp|up.browser|up.link|mmp|midp|phone|pocket', $user_agent)) return true; if(stristr($http_accept, 'text/vnd.wap.wml') || stristr($http_accept, 'application/vnd.wap.xhtml+xml')) return true; if(!empty($_SERVER['HTTP_X_WAP_PROFILE']) || !empty($_SERVER['HTTP_PROFILE']) || !empty($_SERVER['X-OperaMini-Features']) || !empty($_SERVER['UA-pixels'])) return true; $agents = array( 'acs-'=>'acs-', 'alav'=>'alav', 'alca'=>'alca', 'amoi'=>'amoi', 'audi'=>'audi', 'aste'=>'aste', 'avan'=>'avan', 'benq'=>'benq', 'bird'=>'bird', 'blac'=>'blac', 'blaz'=>'blaz', 'brew'=>'brew', 'cell'=>'cell', 'cldc'=>'cldc', 'cmd-'=>'cmd-', 'dang'=>'dang', 'doco'=>'doco', 'eric'=>'eric', 'hipt'=>'hipt', 'inno'=>'inno', 'ipaq'=>'ipaq', 'java'=>'java', 'jigs'=>'jigs', 'kddi'=>'kddi', 'keji'=>'keji', 'leno'=>'leno', 'lg-c'=>'lg-c', 'lg-d'=>'lg-d', 'lg-g'=>'lg-g', 'lge-'=>'lge-', 'maui'=>'maui', 'maxo'=>'maxo', 'midp'=>'midp', 'mits'=>'mits', 'mmef'=>'mmef', 'mobi'=>'mobi', 'mot-'=>'mot-', 'moto'=>'moto', 'mwbp'=>'mwbp', 'nec-'=>'nec-', 'newt'=>'newt', 'noki'=>'noki', 'opwv'=>'opwv', 'palm'=>'palm', 'pana'=>'pana', 'pant'=>'pant', 'pdxg'=>'pdxg', 'phil'=>'phil', 'play'=>'play', 'pluc'=>'pluc', 'port'=>'port', 'prox'=>'prox', 'qtek'=>'qtek', 'qwap'=>'qwap', 'sage'=>'sage', 'sams'=>'sams', 'sany'=>'sany', 'sch-'=>'sch-', 'sec-'=>'sec-', 'send'=>'send', 'seri'=>'seri', 'sgh-'=>'sgh-', 'shar'=>'shar', 'sie-'=>'sie-', 'siem'=>'siem', 'smal'=>'smal', 'smar'=>'smar', 'sony'=>'sony', 'sph-'=>'sph-', 'symb'=>'symb', 't-mo'=>'t-mo', 'teli'=>'teli', 'tim-'=>'tim-', 'tosh'=>'tosh', 'treo'=>'treo', 'tsm-'=>'tsm-', 'upg1'=>'upg1', 'upsi'=>'upsi', 'vk-v'=>'vk-v', 'voda'=>'voda', 'wap-'=>'wap-', 'wapa'=>'wapa', 'wapi'=>'wapi', 'wapp'=>'wapp', 'wapr'=>'wapr', 'webc'=>'webc', 'winw'=>'winw', 'winw'=>'winw', 'xda-'=>'xda-' ); if(!empty($agents[substr($_SERVER['HTTP_USER_AGENT'], 0, 4)])) return true; } public function resize_modifier($filename, $width=0, $height=0, $set_watermark=false) { $resized_filename = $this->image->add_resize_params($filename, $width, $height, $set_watermark); $resized_filename_encoded = $resized_filename; if(substr($resized_filename_encoded, 0, 7) == 'http://') $resized_filename_encoded = rawurlencode($resized_filename_encoded); $resized_filename_encoded = rawurlencode($resized_filename_encoded); return $this->config->root_url.'/'.$this->config->resized_images_dir.$resized_filename_encoded.'?'.$this->config->token($resized_filename); } public function token_modifier($text) { return $this->config->token($text); } public function url_modifier($params) { if(is_array(reset($params))) return $this->request->url(reset($params)); else return $this->request->url($params); } public function plural_modifier($number, $singular, $plural1, $plural2=null) { $number = abs($number); if(!empty($plural2)) { $p1 = $number%10; $p2 = $number%100; if($number == 0) return $plural1; if($p1==1 && !($p2>=11 && $p2<=19)) return $singular; elseif($p1>=2 && $p1<=4 && !($p2>=11 && $p2<=19)) return $plural2; else return $plural1; }else { if($number == 1) return $singular; else return $plural1; } } public function first_modifier($params = array()) { if(!is_array($params)) return false; return reset($params); } public function cut_modifier($array, $num=1) { if($num>=0) return array_slice($array, $num, count($array)-$num, true); else return array_slice($array, 0, count($array)+$num, true); } public function date_modifier($date, $format = null) { if(empty($date)) $date = date("Y-m-d"); return date(empty($format)?$this->settings->date_format:$format, strtotime($date)); } public function time_modifier($date, $format = null) { return date(empty($format)?'H:i':$format, strtotime($date)); } public function api_plugin($params, &$smarty) { if(!isset($params['module'])) return false; if(!isset($params['method'])) return false; $module = $params['module']; $method = $params['method']; $var = $params['var']; unset($params['module']); unset($params['method']); unset($params['var']); $res = $this->$module->$method($params); $smarty->assign($var, $res); } public function num2str($inn, $stripkop=false) { $nol = 'ноль'; $str[100]= array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот', 'восемьсот','девятьсот'); $str[11] = array('','десять','одиннадцать','двенадцать','тринадцать', 'четырнадцать','пятнадцать','шестнадцать','семнадцать', 'восемнадцать','девятнадцать','двадцать'); $str[10] = array('','десять','двадцать','тридцать','сорок','пятьдесят', 'шестьдесят','семьдесят','восемьдесят','девяносто'); $sex = array( array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),// m array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять') // f ); $forms = array( array('копейка', 'копейки', 'копеек', 1), // 10^-2 array('рубль', 'рубля', 'рублей', 0), // 10^ 0 array('тысяча', 'тысячи', 'тысяч', 1), // 10^ 3 array('миллион', 'миллиона', 'миллионов', 0), // 10^ 6 array('миллиард', 'миллиарда', 'миллиардов', 0), // 10^ 9 array('триллион', 'триллиона', 'триллионов', 0), // 10^12 ); $out = $tmp = array(); // Поехали! $tmp = explode('.', str_replace(',','.', $inn)); $rub = number_format($tmp[ 0], 0,'','-'); if ($rub== 0) $out[] = $nol; // нормализация копеек $kop = isset($tmp[1]) ? substr(str_pad($tmp[1], 2, '0', STR_PAD_RIGHT), 0,2) : '00'; $segments = explode('-', $rub); $offset = sizeof($segments); if ((int)$rub== 0) { // если 0 рублей $o[] = $nol; $o[] = morph( 0, $forms[1][ 0],$forms[1][1],$forms[1][2]); } else { foreach ($segments as $k=>$lev) { $sexi= (int) $forms[$offset][3]; // определяем род $ri = (int) $lev; // текущий сегмент if ($ri== 0 && $offset>1) {// если сегмент==0 & не последний уровень(там Units) $offset--; continue; } // нормализация $ri = str_pad($ri, 3, '0', STR_PAD_LEFT); // получаем циферки для анализа $r1 = (int)substr($ri,0,1); //первая цифра $r2 = (int)substr($ri,1,1); //вторая $r3 = (int)substr($ri,2,1); //третья $r22= (int)$r2.$r3; //вторая и третья // разгребаем порядки if ($ri>99) $o[] = $str[100][$r1]; // Сотни if ($r22>20) {// >20 $o[] = $str[10][$r2]; $o[] = $sex[ $sexi ][$r3]; } else { // <=20 if ($r22>9) $o[] = $str[11][$r22-9]; // 10-20 elseif($r22> 0) $o[] = $sex[ $sexi ][$r3]; // 1-9 } // Рубли $o[] = $this->morph($ri, $forms[$offset][ 0],$forms[$offset][1],$forms[$offset][2]); $offset--; } } // Копейки if (!$stripkop) { $o[] = $kop; $o[] = $this->morph($kop,$forms[0][0],$forms[0][1],$forms[0][2]); } print_r($o); return preg_replace("/\s{2,}/",' ',implode(' ',$o)); } public function morph($n, $f1, $f2, $f5) { $n = abs($n) % 100; $n1= $n % 10; if ($n>10 && $n<20) return $f5; if ($n1>1 && $n1<5) return $f2; if ($n1==1) return $f1; return $f5; } } это Disign.php а это ордер тпл <p>Сумма: <font>{$price|num2str:1}</font> </p> Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) женюсь! побрею голову и перекрашу на аваторке выше....и женюсь Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
kuvila1 Posted July 16, 2015 Report Share Posted July 16, 2015 выложите пожалуйста кто нибудь свои файлы эти два, что бы в order_print.tpl можно было вывести {$order->total_price|num2str} Quote Link to post Share on other sites
mishanya Posted July 16, 2015 Author Report Share Posted July 16, 2015 (edited) выложите пожалуйста кто нибудь свои файлы эти два, что бы в order_print.tpl можно было вывести {$order->total_price|num2str} так используйте <p>Сумма: {$order->total_price|num2str:1} </p> файлы:api/Design.php - https://yadi.sk/d/LBS-w8hyhuwEx Edited July 16, 2015 by mishanya Quote Link to post Share on other sites
kuvila1 Posted July 16, 2015 Report Share Posted July 16, 2015 нее( Parse error: syntax error, unexpected '}', expecting ')' in /var/www/u0052739/public_html/discount/api/Design.php on line 302 Quote Link to post Share on other sites
mishanya Posted July 16, 2015 Author Report Share Posted July 16, 2015 нее( Parse error: syntax error, unexpected '}', expecting ')' in /var/www/u0052739/public_html/discount/api/Design.php on line 302 напишите в личку с доступом. исправлю. Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) можно дурной вопрос №2 ... just askлюбопытно.... если сменить ник на настя например...или ксюха. аваторку поставитьмне тоже помогать будут? http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m22_zpsbb36e50b.gif Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
mishanya Posted July 16, 2015 Author Report Share Posted July 16, 2015 можно дурной вопрос №2 ... just askлюбопытно.... если сменить ник на настя например...или ксюха. аваторку поставитьмне тоже помогать будут? я могу вам помочь и без смены ника. пока не отказывал если знал решение вопроса. но у вас статус Фрилансер, думаю вы более квалифицированны чем настя или ксюха. Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) Я написал выше... просто спросил http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m4_zpsc52b6aa5.gifза предложение спс. Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
Noxter Posted July 16, 2015 Report Share Posted July 16, 2015 я могу вам помочь и без смены ника. пока не отказывал если знал решение вопроса. но у вас статус Фрилансер, думаю вы более квалифицированны чем настя или ксюха. А ST_RU :facepalm: во весь экран) Quote Link to post Share on other sites
ST_RU Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) :facepalm скажи лучше..как под каждое сообщение поставить подпись. http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m1_zps501bba34.gifНе хотят мне дать эту возможность. и шифта пытал и просил и другого.....отмазка про статус не. говорю - сделай на час админом.сделаю подпись и убери меня из статуса...а нет. а не дают поставить такие ссылки быстрые снизуместо проклятое ? Edited July 16, 2015 by ST_RU Quote Link to post Share on other sites
kuvila1 Posted July 16, 2015 Report Share Posted July 16, 2015 (edited) максимум чего добился это Array ( [0] => сорок [1] => восемь [2] => тысяч [3] => пятьсот [4] => один [5] => рубль ) сорок восемь тысяч пятьсот один рубль выводит но коряво ито после добавления второй функции в регистрацию Edited July 16, 2015 by kuvila1 Quote Link to post Share on other sites
Noxter Posted July 16, 2015 Report Share Posted July 16, 2015 ST_RU ты что то принимаешь, мне так кажется. Зачастую пишешь сам для себя, это так забавно наблюдать за тобой со стороны Quote Link to post Share on other sites
kuvila1 Posted July 16, 2015 Report Share Posted July 16, 2015 Ребята чувак окончивший один курс ВТ и ПО смог обуздать эту функцию) Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.