Jump to content

Recommended Posts

Добавляем в 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 by mishanya
Link to post
Share on other sites

Отличное решение, как вариант.

 

Что значит "как вариант"?

Никакой это Вам не вариант, а добротно и образцово сделанная удобная разработка.

Спасибо, mishanya!

Link to post
Share on other sites

Яж похвалил, Вам бы лишь накричать.

Не кричите на меня дяденька. Я просто от поезда отстал. Не ел три дня.

А то лицо обгрызу http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m19_zps335c7e60.gif

Edited by ST_RU
Link to post
Share on other sites

Никто на Вас не кричал.

Как вариант, обгрызите какой-нибудь огурчик, чтоб подкрепиться...

За три дня даже автостопом можно пол-Европы проехать...

Link to post
Share on other sites

Никто на Вас не кричал.

Как вариант, обгрызите какой-нибудь огурчик, чтоб подкрепиться...

За три дня даже автостопом можно пол-Европы проехать...

 

Корс. Зачем мне эти буйные советы? от огурчика до автостопа .... 

Какая жуткая логика и фантазия.

 

ps Держите себя в руках киса! заграница нам поможет! (с) красит усы фирменной краской из Одессы

pps Не задумывайтесь. Молчите. И не забывайте надувать щеки.© Бендер

 

ppps

У меня СИБИРЬ как 20 ваших европ.

Кстати,  европу беспокоит то, что ЗЛЫЕ БУБУБУ Русские меряют свою землю другими странами 

Edited by ST_RU
Link to post
Share on other sites

Мишаня красавчик)

Если бы еще убрать жестко прописанные рубли чтобы можно было использовать и другие валюты, скажем эвро, то было бы вообще гениально.

Link to post
Share on other sites

Мишаня красавчик)

Если бы еще убрать жестко прописанные рубли чтобы можно было использовать и другие валюты, скажем эвро, то было бы вообще гениально.

 

тогда нужно передавать еще валюту походу. подумаю над этим на выходных и сделаю

Edited by mishanya
Link to post
Share on other sites
<?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>
Link to post
Share on other sites

выложите пожалуйста кто нибудь свои файлы эти два, что бы в order_print.tpl можно было вывести {$order->total_price|num2str}

 

так используйте

<p>Сумма: {$order->total_price|num2str:1} </p>

 

файлы:

api/Design.php - https://yadi.sk/d/LBS-w8hyhuwEx

Edited by mishanya
Link to post
Share on other sites

можно дурной вопрос №2 ... just ask

любопытно.... если сменить ник на настя например...или ксюха. аваторку поставить

мне тоже помогать будут? 

 

http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m22_zpsbb36e50b.gif

Edited by ST_RU
Link to post
Share on other sites

можно дурной вопрос №2 ... just ask

любопытно.... если сменить ник на настя например...или ксюха. аваторку поставить

мне тоже помогать будут? 

 

 

я могу вам помочь и без смены ника. пока не отказывал если знал решение вопроса. но у вас статус Фрилансер, думаю вы более квалифицированны чем настя или ксюха.

Link to post
Share on other sites

Я написал выше... просто спросил   http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m4_zpsc52b6aa5.gif

за предложение спс.

Edited by ST_RU
Link to post
Share on other sites

я могу вам помочь и без смены ника. пока не отказывал если знал решение вопроса. но у вас статус Фрилансер, думаю вы более квалифицированны чем настя или ксюха.

:D

А ST_RU :facepalm: во весь экран)

Link to post
Share on other sites

:facepalm

 

скажи лучше..

как под каждое сообщение поставить подпись. http://i1069.photobucket.com/albums/u478/L0ckedmem0ries/blackandwhite/898B3066306D_m1_zps501bba34.gif

Не хотят мне дать эту возможность. и шифта пытал и просил и другого.....

отмазка про статус не.

 

говорю - сделай на час админом.

сделаю подпись и убери меня из статуса...

а нет.

 

а не дают поставить такие ссылки быстрые снизу

место проклятое ?

Edited by ST_RU
Link to post
Share on other sites

максимум чего добился это 

 

 

Array ( [0] => сорок [1] => восемь [2] => тысяч [3] => пятьсот [4] => один [5] => рубль ) сорок восемь тысяч пятьсот один рубль 

 

 

выводит но коряво ито после добавления второй функции в регистрацию

Edited by kuvila1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...