Хочу рассказать Вам как сделать в интернет магазине красивый выбор валюты.
Мне кажется, именно такие мелочи показывают качество Вашего магазина, и даже может быть "продают" товар.
Вот так это выглядит в закрытом состоянии:
А вот как если щёлкнуть по валюте:
Мучить мы будем, разумеется, модуль mod_virtuemart_currencies. А точнее файл /modules/mod_virtuemart_currencies/mod_virtuemart_currencies.php
Такой внешний вид можно придать элементу select только с использованием JavaScript, но ведь это нас не остановит?
Мы используем великолепную библиотеку Jquery. Наш скрипт сам скроет модуль и покажет нужную красивую картинку.
Открываем файл и немного меняем форму. Вместо
<form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
Пишем
<form action="<?php echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; ?>" method="post" name="currencies">
Имя нам необходимо, чтобы при выборе валюты скрипт мог "засабмитить" форму.
Также необходимо изменить сам select. Вместо
echo $ps_html->selectList( 'product_currency', $GLOBALS['product_currency'], $currencies, 1, '', 'style="width:130px;"' );
Пишем:
echo $ps_html->selectList( 'product_currency', $GLOBALS['product_currency'], $currencies, 1, '', 'onChange="currencies.submit()" style="width:130px;"', 'divselect' );
где "'divselect" - будет id нашего select-а. Для того чтобы он появился немного меняем виртовский вывод select-а. Открываем файл /administrator/components/com_virtuemart/classes/ps_html.php и находим в самом начале функцию selectList и меняем её. Вместо
function selectList($name, $value, &$arr, $size=1, $multiple="", $extra="") {
$html = '';
if( empty( $arr ) ) {
$arr = array();
}
$html = "<select class=\"inputbox\" name=\"$name\" size=\"$size\" $multiple $extra>\n";
while (list($key, $val) = each($arr)) {
$selected = "";
if( is_array( $value )) {
if( in_array( $key, $value )) {
$selected = "selected=\"selected\"";
}
}
else {
if(strtolower($value) == strtolower($key) ) {
$selected = "selected=\"selected\"";
}
}
$html .= "<option value=\"$key\" $selected>$val";
$html .= "</option>\n";
}
$html .= "</select>\n";
return $html;
}
Пишем
function selectList($name, $value, &$arr, $size=1, $multiple="", $extra="", $id="") {
$html = '';
if( empty( $arr ) ) {
$arr = array();
}
if ($id!='') $id='id="'.$id.'"';
$html = "<select $id class=\"inputbox\" name=\"$name\" size=\"$size\" $multiple $extra>\n";
while (list($key, $val) = each($arr)) {
$selected = "";
if( is_array( $value )) {
if( in_array( $key, $value )) {
$selected = "selected=\"selected\"";
}
}
else {
if(strtolower($value) == strtolower($key) ) {
$selected = "selected=\"selected\"";
}
}
$html .= "<option value=\"$key\" $selected>".shopMakeHtmlSafe($val);
$html .= "</option>\n";
}
$html .= "</select>\n";
return $html;
}
Далее убираем кнопку - скрипт будет срабатывать просто при выборе валюты, лишний клик по кнопке не нужен. Убираем
<input class="button" type="submit" name="submit" value="<?php echo 'Change Currency' ?>" />
На этом этапе можете сохранить все файлы и проверить - у формы появилось name, у селекта - id. Валюта меняется при выборе.
Теперь навешиваем JavaScript. Идем в самый конец файла mod_virtuemart_currencies.php , где закрывается фома </form> и грузим Jquery:
<?php
$document =& JFactory::getDocument();
$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js');
Причем, сам Jquery закачивать себе на сайт не будем - гораздо удобнее взять его с гугла.
Весь текст нашего скрипта мы присвоим переменной $js, а потом с помощью
$document->addScriptDeclaration($js);
разместим скрипт в head нашей страницы.
В первую очредь - включаем бесконфликтный режим, чтобы наш скрипт не воеовал с другими скриптами:
$js="jQuery.noConflict();
Далее все наши функции должны быть обернуты в
jQuery(function(){
});
Теперь напишем функцию, отрисовывающую красивый select:
function redesign(select, addclass) {
addclass = typeof(addclass) != 'undefined' ? addclass : '';
jQuery(select).wrap('<div class=\"sel_wrap ' + addclass + '\"/>');
var sel_options = '';
var selected_option = false;
jQuery(select).children('option').each(function() {
if(jQuery(this).is(':selected')){
selected_option = jQuery(this).index();
}
sel_options = sel_options + '<div id= \"sel_option_'+jQuery(this).val()+'\" class=\"sel_option\" value=\"' + jQuery(this).val() + '\"><span>' + jQuery(this).html() + '</span></div>';
});
var sel_imul = '<div class=\"sel_imul\">\
<div class=\"sel_selected\">\
<div id= \"sel_option_selected_'+jQuery(select).children('option').eq(selected_option).val()+'\" class=\"selected-text\"><span>' + jQuery(select).children('option').eq(selected_option).html() + '</span></div>\
<div class=\"sel_arraw\"></div>\
</div>\
<div class=\"sel_options\">' + sel_options + '</div>\
</div>';
jQuery(select).before(sel_imul);
}
И сразу вызовем её
redesign('#divselect');
Далее добавим обработку мышиного клика по дивам:
jQuery('.sel_imul').live('click', function() {
jQuery('.sel_imul').removeClass('act');
jQuery(this).addClass('act');
if (jQuery(this).children('.sel_options').is(':visible')) {
jQuery('.sel_options').hide();
}
else {
jQuery('.sel_options').hide();
jQuery(this).children('.sel_options').show();
}
});
jQuery('.sel_option').live('click', function() {
var tektext = jQuery(this).html();
jQuery(this).parent('.sel_options').parent('.sel_imul').children('.sel_selected').children('.selected-text').html(tektext);
jQuery(this).parent('.sel_options').parent('.sel_imul').children('.sel_selected').children('.selected-text').attr('id', 'sel_option_selected_'+jQuery(this).attr('value'));
jQuery(this).parent('.sel_options').children('.sel_option').removeClass('sel_ed');
jQuery(this).addClass('sel_ed');
var tekval = jQuery(this).attr('value');
tekval = typeof(tekval) != 'undefined' ? tekval : tektext;
jQuery(this).parent('.sel_options').parent('.sel_imul').parent('.sel_wrap').children('select').children('option').removeAttr('selected').each(function() {
if (jQuery(this).val() == tekval) {
jQuery(this).attr('selected', 'select');
}
});
document.currencies.submit();
});
var selenter = false;
jQuery('.sel_imul').live('mouseenter', function() {
selenter = true;
});
jQuery('.sel_imul').live('mouseleave', function() {
selenter = false;
});
jQuery(document).click(function() {
if (!selenter) {
jQuery('.sel_options').hide();
jQuery('.sel_imul').removeClass('act');
}
});
Где "document.currencies.submit();" - отправляет форму.
Для того чтобы мы могли навесить флажки валют - скрипт делает для каждого дива с валюты свой id, например - sel_option_UAH, если валюта уже выбрана - sel_option_selected_UAH.
Теперь добавляем CSS в template.css шаблона:
.sel_wrap{height:25px}
.sel_wrap select{display:none}
.sel_imul{width:200px}
.sel_imul .sel_selected{position:relative;padding:0 0 0 14px}
.sel_imul.act .sel_selected{}
.sel_imul .sel_options{
background:#474747;overflow:auto;position:absolute;width:186px;display:none;z-index:10;padding:7px 0 7px 14px;
-moz-box-shadow:0 3px 7px #555;-webkit-box-shadow:0 3px 7px #555;box-shadow:0 3px 7px #555}
.sel_options .sel_option, .selected-text{background-image:url(../images/flasg.png);padding:0 0 0 27px;line-height:27px;color:#FFF;background-repeat:no-repeat;cursor:pointer}
.selected-text span {border-bottom:1px dotted #FFF}
.sel_options .sel_option:hover span {border-bottom:1px solid #FFF}
#sel_option_USD, #sel_option_selected_USD {background-position:0 -48px}
#sel_option_EUR, #sel_option_selected_EUR {background-position:0 -73px}
#sel_option_RUB, #sel_option_selected_RUB {background-position:0 1px}
#sel_option_UAH, #sel_option_selected_UAH {background-position:0 -23px}
Нюанс - все флаги лежат у нас в одном файле - /images/flasg.png и мы просто показываем нужный.

