Recommended Posts

Как правильно организовать переключатель валют в realty_grid?

 

Несколько я понимаю массивы с валютами доступны, но как их переключать с мимимумом кода?

 

 

Можно организовать 2 цикла с разными валютами и переключать их по принципу как в list_view/thumbs_view, но если валют не 2 а много...

 

Вобщем посоветуйте кто как делает.

Поделиться сообщением


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

Я бы сделал скриптом.

Выше сетки вынес бы значки всех валют.

В сетке бы сделал вывод цен в валютах по "кармашкам" с идешками.

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

Текущую выбранную валюту скриптом закладывал бы в куки, что бы по ней определялось какую валюту показать при загрузке страницы.

 

если я правильно понял о чем речь.

Поделиться сообщением


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

abushyk правильно.

Скрыть/показать валюту нужную будет легко, а как заложить в куки значения текущей выбранной валюты по событию .click ?

Поделиться сообщением


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

На java типа такого будет

 

 

<p onclick="myFunctionRUB()">Рубль</p>
<p onclick="myFunctionUSD()">USD</p>

<script>
function myFunctionRUB() {
document.getElementById("usd").style.visibility = 'hidden';
document.getElementById("rur").style.visibility ='visible';
}
function myFunctionUSD() {
document.getElementById("rur").style.visibility = 'hidden';
document.getElementById("usd").style.visibility ='visible';
}
</script>



<div id="rur"> вывод SMARTY рубль </div>
<div id="usd"> вывод SMARTY USD </div>

Поделиться сообщением


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

Jquery версия. Помогите доработать чтобы запоминала валюту

 

 

<p id="RURtrigger">Рубль</p>
<p id="USDtrigger">USD</p>

<script>
jQuery(document).ready(function(){

jQuery('#RURtrigger').click(function(){
$('#usd').hide();
$('#rur').show();
});

jQuery('#USDtrigger').click(function(){
$('#rur').hide();
$('#usd').show();
});
});
</script>



<div id="rur"> вывод SMARTY рубль </div>
<div id="usd"> вывод SMARTY USD </div>


<style>
#usd {display:none}

</style>

Поделиться сообщением


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

Данная ветка для готовых решений, а не флуда! Выкладываются именно готовые решения!.

Поделиться сообщением


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

<div id="rur"> вывод SMARTY рубль </div>

<div id="usd"> вывод SMARTY USD </div>

 

Вот за такое да клавиатурой да по пальцам))))

Если речь о сетке, то никаких ид на выводе цен, только классы.

 

Остальное завтра постараюсь расписать.

 

 

Данная ветка для готовых решений, а не флуда! Выкладываются именно готовые решения!.

 

Иногда путь к готовому решение значительно интереснее и познавательнее самого решения)))

Поделиться сообщением


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

Делаем userfriendly-переключатель отображения валют.

 

Исходным материалом будет http://www.etown.ru/s/topic/1742-отображение-валют/?p=18682.

 

1. Что нам понадобится.

 - заготовки из указанной статьи

 - jquery библиотека https://github.com/carhartl/jquery-cookie. Без нее можно обойтись, но с ней быстрее

 

2. Модернизируем код контроллера (main.php)

В контроллере мы готовили массив курсов валют. Изменим его немного

if(!isset($_SESSION['site_cache']['courses'])){    $DBC=DBC::getInstance();    $query='SELECT * FROM '.DB_PREFIX.'_currency';    $stmt=$DBC->query($query);    if($stmt){        while($ar=$DBC->fetch($stmt)){            $ar['code_id']=strtolower(trim($ar['code']));            $courses[$ar['currency_id']]=$ar;        }     }     $_SESSION['site_cache']['courses']=$courses;}$this->template->assign('_courses', $_SESSION['site_cache']['courses']);if(isset($_COOKIE['current_view_currency']) && $_COOKIE['current_view_currency']!=''){    $this->template->assign('_current_view_currency', $_COOKIE['current_view_currency']);}else{    setcookie('current_view_currency', 'eur');    $this->template->assign('_current_view_currency', 'eur');}

В чем отличие? В данные курсов мы добавили переменную code_id - это приведенный к нижнему регистру код валюты, что бы мы этим не занимались в шаблоне.

Так же мы проверяем куки на наличие значения current_view_currency и если его нет, то заполняем его "eur" либо другой дефолтной валютой (кодом валюты приведенным к нижнему регистру). И отправляем эту переменную в шаблон.

 

Вот и все в контроллере. Идем в шаблон.

 

3. Модернизация шаблона (realty_grid.tpl - либо какой-то из его подчиненных типа табличного или плиточного видов)

 

В этом шаблоне у нас должно быть два момента:

а) некий чекер с именами\кодами валют, куда бы мы кликали, что бы выбрать валюту.

б) некий блок цен с ценами в разных валютах на строке или блоке объявления.

 

Начнем с чекера-переключателя. Поставим его, в области над списком.

{foreach from=$_courses item=_course}    <div class="show_valute{if $_course.code_id==$_current_view_currency} active{/if}" data-codeid="{$_course.code_id}">{$_course.code}</div>{/foreach}

тут не сложно. прокручиваем массив валют из контроллера мы выводим их в виде

<div class="show_valute" data-codeid="rur">RUR</div><div class="show_valute active" data-codeid="usd">USD</div><div class="show_valute" data-codeid="eur">EUR</div>

Класс show_valute указывает управляющую кнопку, а active - активное состояние переключателя.

 

Код вывода разновалютных цен в блоке объявления

 

<div class="valutes">{foreach from=$_courses item=_course}    <div class="course_price {$_course.code_id}" style="{if $_course.code_id!=$_current_view_currency}display: none;{/if}">{$_course.code}: {(($grid_items[i].price*$_courses[$grid_items[i].currency_id].course)/($_course.course))|number_format:0:",":" "}</div>{/foreach}</div>

Главное отличие - мы выводим цены в общий блок с классом valutes и, кроме этого, каждую цену внутри своего блока с класами course_price и тем кодом валюты(названием кода валюты приведенным к нижнему регистру). Вместе с этим мы проверяем текущую "отображаемую" валюту, которую ищем в куках и те блок, которые соответствуют другим валютам обозначаем стилем display: none; иными словами прячем.

 

В результате у нас в блоках объявлений всегда будет показана только одна цена в той валюте, которая лежала в куках, либо дефолтной, если ее там не было.

А общий виду будет такой

<div class="valutes">    <div class="course_price rur" style="display: none;">RUR: 13 774 091</div>    <div class="course_price usd" style="">USD: 568 181</div>    <div class="course_price eur" style="display: none;">EUR: 454 545</div></div>

3. Добавляем красоту и интерактив.

Включаем библиотеку jquery.cookie.js

 

У меня она лежит в /third/jquery.cookie/ поэтому в шаблоне сетки я ее подключаю как 

<script type="text/javascript" src="{$estate_folder}/third/jquery.cookie/jquery.cookie.js"></script>

На стилях не останавливаюсь.

{literal}<style>.show_valute.active {font-weight: bold;cursor: auto;}.show_valute {cursor: pointer;}</style>{/literal}

А вот и сам скрипт

{literal}<script>$(document).ready(function(){$('.show_valute').click(function(){var _this=$(this);var codeid=_this.data('codeid');_this.addClass('active').siblings().removeClass('active');$('.valutes .course_price').hide();$('.valutes .'+codeid).fadeIn();$.cookie('current_view_currency', codeid);});});</script>{/literal}

Кратко: кликая по элементу с классом show_valute мы берем у этого элемента значение из аттрибута data-codeid, запоминаем его, прячем все разновалютные курсы и показываем только те блоки, которые имеют класс аналогичный запрошенному коду валюты. И пакуем этот код в куки, что бы при рефреше страницы у нас уже показались нужные валюты.

Поделиться сообщением


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

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

 

Я себе сделал так:

 

по-умолчанию выводит стандартный $grid_items.price   с возможностью перевести все в нужную валюту.

 

Чекер

{foreach from=$_courses item=_course name=curr}    <div class="currencies show_valute{if $_course.code_id==$_current_view_currency} active{/if}" data-codeid="{$_course.code_id}">| {$_course.code} </div>	{if $smarty.foreach.curr.last}<div class="currencies show_valute{if $_current_view_currency=="def"} active{/if}" data-codeid="def">по умолчанию </div>{/if}{/foreach}

Вывод

{foreach from=$_courses item=_course name=currs}{if $smarty.foreach.currs.first}    <div class="course_price def" style="{if $_current_view_currency!='def'}display: none;{/if}"> {$grid_items[i].price|number_format:0:",":" "} {if $grid_items[i].currency_name != ''}{$grid_items[i].currency_name}{/if}</div>{/if}    <div class="course_price {$_course.code_id}" style="{if $_course.code_id!=$_current_view_currency}display: none;{/if}"> {(($grid_items[i].price*$_courses[$grid_items[i].currency_id].course)/($_course.course))|number_format:0:",":" "}{if $_course.code=='USD'} ${elseif $_course.code=='BYR'} р.{/if}</div>{/foreach}

По-умолчанию поставил код def

....setcookie('current_view_currency', 'def');$this->template->assign('_current_view_currency', 'def');....

Получилось:

 

по умолчанию | BYR | USD

Поделиться сообщением


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

Отличная ветка,

прикрутил все по интсрукции, на удивление для меня и моих програмерских способностей все заработало.

 

Вот теперь такой ворос:

 

1. Как прикрутить вместо RUR, EUR, USD картинки с валютами, по аналогии с grid_list, grid_thumbs вот в это место.

 

<div class="show_valute" data-codeid="rur">RUR</div>
<div class="show_valute active" data-codeid="usd">USD</div>
<div class="show_valute" data-codeid="eur">EUR</div>

 

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

И еще, картинками валют будут служить например файлы "eur_on.png"; "eur.png", то есть, при активности валюты подсвечиваеться картинка eur_on.png, если валюта не активна, то eur.png

 

2. и еще вот в этой штуке {$_course.code} зашиты коды валют RUR, USD, EUR...., а хочется таблице и в описании объекта использовать р. , $, €, 

  Как это сделать.

 

Спасибо.

Поделиться сообщением


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

Здравствуйте! С мультивалютностью все получилось отлично. А как бы еще ее прикрутить к поиску по цене "от и до". А то какую валюту не выбираешь ищет все равно по долларам.

Поделиться сообщением


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

В принципе, если передать из формы поиска параметр currency_id с идешкой нужной валюты, то мин и макс цена, отправленные с формы, будут учитывать эту валюту и искать объявки которые, при конвертации, попадают нужный диапазон.

Поделиться сообщением


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

В принципе, если передать из формы поиска параметр currency_id с идешкой нужной валюты, то мин и макс цена, отправленные с формы, будут учитывать эту валюту и искать объявки которые, при конвертации, попадают нужный диаgfpjy/

 

Спасибо

Поделиться сообщением


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

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

Решения на форуме так или иначе требуют писать немного кода, если есть описание этого кода.

Если же желания с кодом не возиться, тогда лучше написать на фрилансе.

Поделиться сообщением


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

Здравствуйте! Перестал работать переключатель. Пишет Warning: Division by zero in /var/www/u0032031/data/www/vesta-yalta.ru/cache/compile/821e2c2d537c9f283f89859833d6253573206f74.file.realty_grid_list.tpl.php on line 168
0. Я понимаю, что где-то деление на ноль, но где? Может подскажете чайнику. Сайт vesta-yalta.ru

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, Nikvz сказал:

Здравствуйте! Перестал работать переключатель. Пишет Warning: Division by zero in /var/www/u0032031/data/www/vesta-yalta.ru/cache/compile/821e2c2d537c9f283f89859833d6253573206f74.file.realty_grid_list.tpl.php on line 168
0. Я понимаю, что где-то деление на ноль, но где? Может подскажете чайнику. Сайт vesta-yalta.ru

Проверьте обновлена ли система у вас.

Зашел на сайт к вам, ошибки не вижу.

Поделиться сообщением


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

Всё обновлено, цены в рублях показывает, в тех объявлениях, где цена была в долларах, теперь нули, при нажатии на USD или EUR ошибка  Warning: Division by zero in /var/www/u0032031/data/www/vesta-yalta.ru/cache/compile/821e2c2d537c9f283f89859833d6253573206f74.file.realty_grid_list.tpl.php on line 168
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Nikvz сказал:

Всё обновлено, цены в рублях показывает, в тех объявлениях, где цена была в долларах, теперь нули, при нажатии на USD или EUR ошибка  Warning: Division by zero in /var/www/u0032031/data/www/vesta-yalta.ru/cache/compile/821e2c2d537c9f283f89859833d6253573206f74.file.realty_grid_list.tpl.php on line 168
0

Скриншот покажите и адрес станицы где делаете скриншот.

Поделиться сообщением


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

Зашел к вам на сайт, нажимаю, все красиво переключается.

Проверьте у вас кэш?

Поделиться сообщением


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

Немного поменял исполнение для проблемы в старте темы.

 

1. main.php функция frontend_main::getValutesInfo

function getValutesInfo(){
		$def_currency_id=1; //идешка дефотной валюты, если пользователь еще не выбирал
		$cache_time=21600; //время жизни файла кеша с инфой о валютах, что бы не выбирать из бд каждый раз наново - 6 часов
		$cache_file=SITEBILL_DOCUMENT_ROOT.'/cache/valutes_info.txt'; //имя файла с кешем курсов
		$valutes_info=array();
		$valutes_info['courses']=array();

		//определяем "текущую" валюту или используем дефолтную
		$valutes_info['active']=intval($_COOKIE['current_currency']);
		if($valutes_info['active']==0){
			$valutes_info['active']=$def_currency_id;
			setcookie('current_currency', $def_currency_id, time()+86400, '/');
		}

		//загружаем курсы из кеша или из БД
		if(file_exists($cache_file) && (time()-filemtime($cache_file))<$cache_time){
			$valutes_info['courses']=unserialize(file_get_contents($cache_file));
		}else{
			@unlink($cache_file);
			$DBC=DBC::getInstance();
			$query='SELECT * FROM '.DB_PREFIX.'_currency';
			$stmt=$DBC->query($query);
			if($stmt){
				while($ar=$DBC->fetch($stmt)){
					$valutes_info['courses'][$ar['currency_id']]=$ar;
				}
				$f=fopen($cache_file, 'w');
				fwrite($f, serialize($valutes_info['courses']));
				fclose($f);
			}
		}
		
		if(!empty($valutes_info['courses'])){
			foreach($valutes_info['courses'] as $k=>$v){
				$valutes_info['courses'][$k]['active']=0;
				if($k==$valutes_info['active']){
					$valutes_info['courses'][$k]['active']=1;
				}
			}
		}
		
		return $valutes_info;
	}

2. В main.php внутри main() загружаем данные в шаблон

$this->template->assign('valutes_info', $this->getValutesInfo());

3. В шапке сайта или другом месте выводим список переключателей

<ul class="valute_changer">
  {foreach from=$valutes_info.courses item=_course}
  <li class="valute{if $_course.active==1} active{/if}" data-id="{$_course.currency_id}">{$_course.name}</li>
  {/foreach}
</ul>

4. В файле скриптов шаблона включаем обработку нажатий на переключателе

$(document).ready(function(){
	$('.valute_changer .valute').click(function(){
		var _this=$(this);
		var id=_this.data('id');
		_this.addClass('active').siblings().removeClass('active');
		$('.valutes .course_price').hide();
		$('.valutes .valute'+id).fadeIn();
		$.cookie('current_currency', id, {expires: 1, path: '/'});
	});
});

5. По шаблону вместо вывода обычного цены 

{$grid_items[i].price|number_format:0:",":"	"} {if $grid_items[i].currency_name != ''}{$grid_items[i].currency_name}{/if}

ставим блок разных цен, зависимых от выбранной валюты

{if intval($grid_items[i].price)>0 && $grid_items[i].currency_id>0}
<div class="valutes">
  {foreach from=$valutes_info.courses item=_course}
  <div class="course_price valute{$_course.currency_id}"{if $_course.active!=1} style="display: none;"{/if}>{(($grid_items[i].price*$valutes_info.courses[$grid_items[i].currency_id].course)/($_course.course))|number_format:0:",":" "} {$_course.name}</div>
  {/foreach}
</div>
{/if}

6. Красоту добавляем по вкусу. Ниже вариант для реалии

ul.valute_changer {
	list-style: none;margin: 0;display: block;font-size: 12px;
}
ul.valute_changer li.valute {
	    display: inline-block;padding: 2px 4px;width: 30px;text-align: center;border: 1px solid White;background: #0581b5;color: White;cursor: pointer;
}
ul.valute_changer li.valute:hover {
	background: #5db2d6;
}
ul.valute_changer li.valute.active {
    font-weight: bold;color: #0581b5;background: White;border: 1px solid #0581b5;
}

 

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас