Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Добавляем в 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

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Спасибо, mishanya!

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

 

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

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

 

ppps

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

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

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

что то не работает фатал эрор( в чем беда?

 

не совсем информативно. где именно? могу посмотреть, доступы фтп в личку.

Ссылка на сообщение
Поделиться на другие сайты
<?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>
Ссылка на сообщение
Поделиться на другие сайты

женюсь! побрею голову и перекрашу на аваторке выше....

и женюсь

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

файлы:

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

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

нее( Parse error: syntax error, unexpected '}', expecting ')' in /var/www/u0052739/public_html/discount/api/Design.php on line 302

 

напишите в личку с доступом. исправлю.

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

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

:D

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

Ссылка на сообщение
Поделиться на другие сайты

:facepalm

 

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

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

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

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

 

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

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

а нет.

 

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

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

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

 

 

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

Изменено пользователем kuvila1
Ссылка на сообщение
Поделиться на другие сайты

ST_RU ты что то принимаешь, мне так кажется. Зачастую пишешь сам для себя, это так забавно наблюдать за тобой со стороны :D

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...