Перейти к содержимому


Фотография
- - - - -

Выпадающий список валют в шаблоне Full


Сообщений в теме: 4

#1 zeus07

zeus07

Отправлено 31 December 2017 - 01:36

Здравствуйте! 

 

Прежде всего, всех с наступающим!  :)

 

Необходимо реализовать на сайте переключатель валют в шаблоне Full в виде выпадающего списка. По умолчанию сделано только в виде радиокнопок, и других вариантов нет, только в модуле разве что...

 

Вносил изменения в функцию в файле /media/zoo/applications/jbuniversal/framework/helpers/jbhtml.php

 

Функция:

public function currencyToggle($defaultCur = 'eur', $rates = null, $options = array(), $return = false)
    {
        $rates = !empty($rates) ? $rates : $this->app->jbmoney->getData();

        $defaultCur    = $this->_vars->lower($defaultCur);
        $uniqId        = $this->_jbstring->getId();
        $systemDefault = JBModelConfig::model()->getCurrency();

        if (isset($rates['%'])) {
            unset($rates['%']);
        }

        $options = $this->app->data->create(array_merge(array(
            'showDefault' => true,
        ), $options));

        $i     = 0;
        $count = count($rates);
        $html  = array();
        foreach ($rates as $code => $currency) {
            $i++;
            $id    = $this->_jbstring->getId('unique-');
            $title = JText::_('JBZOO_JBCURRENCY_' . $code);

            $moneyVal = JBCart::val('1000 ' . $code, $rates); // for calculating

            if ($systemDefault != JBCartValue::DEFAULT_CODE && !$moneyVal->isCur($systemDefault)) {
                $title .= '; ' . $moneyVal->text() . ' ≈ ' . $moneyVal->text($systemDefault);
            }

            $inputAttrs = array(
                'type'          => 'radio',
                'name'          => 'currency[' . $uniqId . '][]',
                'id'            => $id,
                'data-currency' => $code,
                'class'         => array(
                    'jbcurrency-input',
                    'jbcurrency-' . $code,
                ),
            );

            if ($code == $defaultCur) {
                $inputAttrs['checked'] = 'checked';
            }

            $labelAttrs = array(
                'for'   => $id,
                'title' => $title,
                'class' => array(
                    'jbcurrency-label',
                    'jbtooltip',
                    'hasTip',
                ),
            );

            if ($i == $count) {
                $inputAttrs['class'][] = 'isLast';
                $labelAttrs['class'][] = 'isLast';
            }

            if ($i == 1) {
                $inputAttrs['class'][] = 'isFirst';
                $labelAttrs['class'][] = 'isFirst';
            }

            $flag = ($code == JBCartValue::DEFAULT_CODE)
                ? '<span class="jbflag jbflag-' . $code . '">&curren;</span>'
                : '<span class="jbflag jbflag-' . $code . '"></span>';

            $html[] = '<input ' . $this->buildAttrs($inputAttrs) . ' />';
            $html[] = '<label  ' . $this->buildAttrs($labelAttrs) . '>' . $flag . '</label>';
        }

        if (!empty($html)) {

            $id = $this->_jbstring->getId('currency-toggle-');

            $this->_assets->initTooltip();
            $html[] = $this->_assets->currencyToggle($id, (array)$options, $return);

            $widgetAttrs = array(
                'data-default' => $moneyVal->cur(),
                'id'           => $id,
                'class'        => array(
                    'jsCurrencyToggle',
                    'currency-toggle',
                ),

            );

            $html = '<div ' . $this->buildAttrs($widgetAttrs) . '>' . implode(PHP_EOL, $html) . '</div>';

            return $html;
        }

        return null;
    }

После моих изменений функция выглядит таким образом: 

public function currencyToggle($defaultCur = 'eur', $rates = null, $options = array(), $return = false)
    {
        $rates = !empty($rates) ? $rates : $this->app->jbmoney->getData();

        $defaultCur    = $this->_vars->lower($defaultCur);
        $uniqId        = $this->_jbstring->getId();
        $systemDefault = JBModelConfig::model()->getCurrency();

        if (isset($rates['%'])) {
            unset($rates['%']);
        }

        $options = $this->app->data->create(array_merge(array(
            'showDefault' => true,
        ), $options));

        $i     = 0;
        $count = count($rates);
        $html  = array();
        foreach ($rates as $code => $currency) {
            $i++;
            $id    = $this->_jbstring->getId('unique-');
            $title = JText::_('JBZOO_JBCURRENCY_' . $code);

            $moneyVal = JBCart::val('1000 ' . $code, $rates); // for calculating

            if ($systemDefault != JBCartValue::DEFAULT_CODE && !$moneyVal->isCur($systemDefault)) {
                $title .= '; ' . $moneyVal->text() . ' &asymp; ' . $moneyVal->text($systemDefault);
            }

            $inputAttrs = array(
                'value'          => $code,
                'name'          => 'currency[' . $uniqId . '][]',
                'id'            => $id,
                'data-currency' => $code,
                'class'         => array(
                    'jbcurrency-input',
                    'jbcurrency-' . $code,
                ),
            );

            if ($code == $defaultCur) {
                $inputAttrs['selected'] = 'selected';
            }

            $labelAttrs = array(
                'for'   => $id,
                'title' => $title,
                'class' => array(
                    'jbcurrency-label',
                    'jbtooltip',
                    'hasTip',
                ),
            );

            if ($i == $count) {
                $inputAttrs['class'][] = 'isLast';
                $labelAttrs['class'][] = 'isLast';
            }

            if ($i == 1) {
                $inputAttrs['class'][] = 'isFirst';
                $labelAttrs['class'][] = 'isFirst';
            }

            $flag = ($code == JBCartValue::DEFAULT_CODE)
                ? '<span class="jbflag jbflag-' . $code . '">&curren;</span>'
                : '<span class="jbflag jbflag-' . $code . '"></span>';

            $html[] = '<option ' . $this->buildAttrs($inputAttrs) . ' >' . $code . '</option>';
            $html[] = '<label  ' . $this->buildAttrs($labelAttrs) . '>' . $flag . '</label>';
        }

        if (!empty($html)) {

            $id = $this->_jbstring->getId('currency-toggle-');

            $this->_assets->initTooltip();
            $html[] = $this->_assets->currencyToggle($id, (array)$options, $return);

            $widgetAttrs = array(
                'data-default' => $moneyVal->cur(),
                'id'           => $id,
                'class'        => array(
                    'jsCurrencyToggle',
                    'currency-toggle',
                ),

            );

            $html = '<select ' . $this->buildAttrs($widgetAttrs) . '>' . implode(PHP_EOL, $html) . '</select>';

            return $html;
        }

        return null;
    }

Суть проблемы в том, что сам по себе селект появился, но при изменении валюты  - валюта не переключается.

 

Подскажите пожалуйста, в чём проблема, и как это можно исправить.


  • 0

#2 mmth

mmth

Отправлено 02 January 2018 - 04:29

вероятно, js нужно править, который отвечает за переключение валют. 


  • 0

#3 zeus07

zeus07

Отправлено 02 January 2018 - 19:12

вероятно, js нужно править, который отвечает за переключение валют. 

 

Возможно...Знать бы ещё, где находится этот файл, и как называется, раньше не приходилось это править в карточке товара


  • 0

#4 fiction13

fiction13

Отправлено 02 January 2018 - 21:09

Подскажите пожалуйста, в чём проблема

 

Потому что виджет переключения работает только с радио кнопками. 

 

и как это можно исправить.
 

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


  • 3

#5 zeus07

zeus07

Отправлено 02 January 2018 - 21:18

Потому что виджет переключения работает только с радио кнопками. 

 

 

 

 

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

 

Спасибо за идею! Попробую таким образом сделать.


  • 0




Click to return to top of page in style!