Поле ползунки

vikont
Был
За помощь админу За активное участие
9 тем
351 сообщение
Рейтинг: 40
Репутация: 2
На сайте 3 года

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

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

Как это исправить?

Автор: vikont
vikont
Был
За помощь админу За активное участие
9 тем
351 сообщение
Рейтинг: 40
Репутация: 2
На сайте 3 года

<?php<br-->
class fieldInumber extends cmsFormField {

public $title = 'Число с ползунком';

public $sql = 'float NULL DEFAULT NULL';

public $filter_type = 'int';

public function getOptions() {

return array(
new fieldString('units', array(
'title' => 'Единица измерения',
)),
);

}

public function getRules() {

$this->rules[] = array('number');

return $this->rules;

}

public function parse($value) {

$units = $this->getProperty('units');

if(!$units) { $units = $this->getOption('units'); }

if(!$units) { $units = ''; }

if(intval($value) == $value) {

$value = number_format($value, 0, '.', '');

}

return @htmlspecialchars($value)." {$units}";

}

public function getFilterInput($value) {

$template = cmsTemplate::getInstance();

$template->addJS('templates/default/js/jquery-ui.js');

$template->addCSS('templates/default/css/jquery-ui.css');

$units = $this->getProperty('units');

if(!$units) { $units = $this->getOption('units'); }

if(!$units) { $units = ''; }

$from = !empty($value['from'])? intval($value['from']): false;

$to = !empty($value['to'])? intval($value['to']): false;

$uri = (stripos($_SERVER['REQUEST_URI'], '?') !== false)? strstr($_SERVER['REQUEST_URI'], '?', true): $_SERVER['REQUEST_URI'];

$min = 0;

$max = 1000000000;

if($uri) {

$uri_array = explode("/", trim($uri, '/'));

if($uri_array[0]) {

$ctype_name = ($uri_array[0] == 'users')? $uri_array[3]: ((stripos($uri_array[0], '-') !== false)? strstr($uri_array[0], '-', true): $uri_array[0]);

$content_model = cmsCore::getModel('content');

$min_item = $content_model->filterGtEqual($this->element_name, '1')->selectOnly($this->element_name)->orderBy($this->element_name, 'asc')->getItem($content_model->table_prefix. $ctype_name);

if(!empty($min_item[$this->element_name])) $min = $min_item[$this->element_name];

$content_model->resetFilters();

$max_item = $content_model->filterGtEqual($this->element_name, '1')->selectOnly($this->element_name)->orderBy($this->element_name, 'desc')->getItem($content_model->table_prefix. $ctype_name);

if(!empty($max_item[$this->element_name])) $max = $max_item[$this->element_name];

$content_model->resetFilters();

}

}

$rand = rand(1, 100);

$res = '';

$res .= '
';

$res .= '
$(document).ready(function() {
$("#slider-'. $this->id. $rand .'").slider({
range: true,
min: '. $min .',
max: '. $max .',
values: [ '. ($from? $from: $min) .', '. ($to? $to: $max) .' ],
slide: function( event, ui ) {
$("#slider-'. $this->id. $rand .'-from").val(ui.values[0]);
$("#slider-'. $this->id. $rand .'-to").val(ui.values[1]);
}
});
});

#slider-'. $this->id. $rand .' { margin: 0 10px 10px; } .input-slider-from, .input-slider-to { }
';

$res .= '
'. html_input('text', $this->element_name.'[from]', ($from? $from: $min), array('class' => 'input-small input-slider-from', 'id' => 'slider-'. $this->id. $rand .'-from')). ' — ' .
html_input('text', $this->element_name.'[to]', ($to? $to: $max), array('class' => 'input-small input-slider-to', 'id' => 'slider-'. $this->id. $rand .'-to')) .
($units? ' '. $units: '') .'
';

return $res;

}

public function applyFilter($model, $value) {

if(!is_array($value)) { return $model; }

if(!empty($value['from'])) {

$model->filterGtEqual($this->name, $value['from']);

}

if(!empty($value['to'])){

$model->filterLtEqual($this->name, $value['to']);

}


return $model;

}

public function store($value, $is_submitted, $old_value=null) {

return str_replace(',', '.', trim($value));

}

public function getInput($value) {

$this->data['units'] = $this->getProperty('units')? $this->getProperty('units'): $this->getOption('units');

return parent::getInput($value);

}

}
Проблема кроется где то в этом скрипте

Автор: vikont
vikont
Был
За помощь админу За активное участие
9 тем
351 сообщение
Рейтинг: 40
Репутация: 2
На сайте 3 года
Цитата: dmitrix2024
Я уже и не вспомню был там id=«slider»… или это я поставил под свои потребности.

Он там был

Вы мне видимо не тот файл сбросили, потому как вместо ползунков в Фильтре+ такая бяка

$(document).ready(function() { $("#slider-price13").slider({ range: true, min: 81.5, max: 1750, values: [ 81, 1750 ], slide: function( event, ui ) { $("#slider-price13-from").val(ui.values[0]); $("#slider-price13-to").val(ui.values[1]); } }); }); #slider-price13 { margin: 0 10px 10px; } .input-slider-from, .input-slider-to { }

DmitriyBarinov
Был
За полезные публикации на форуме
13 тем
38 сообщений
Рейтинг: 31
Репутация: 2
На сайте 3 года
Цитата: vikont
Цитата: dmitrix2024
Я уже и не вспомню был там id=«slider»… или это я поставил под свои потребности.

Он там был

Вы мне видимо не тот файл сбросили, потому как вместо ползунков в Фильтре+ такая бяка

$(document).ready(function() { $("#slider-price13").slider({ range: true, min: 81.5, max: 1750, values: [ 81, 1750 ], slide: function( event, ui ) { $("#slider-price13-from").val(ui.values[0]); $("#slider-price13-to").val(ui.values[1]); } }); }); #slider-price13 { margin: 0 10px 10px; } .input-slider-from, .input-slider-to { }

Так, перезалил , в архиве 2 файла, просмотрите еще раз эти файлы… Проверял на 2х шаблонах и на дефолтном и другом, в режиме отладки, ошибок не замечено!

Редактировалось 1 раз, последний: 18:15
Автор: vikont
vikont
Был
За помощь админу За активное участие
9 тем
351 сообщение
Рейтинг: 40
Репутация: 2
На сайте 3 года
Цитата: dmitrix2024

Проверял на 2х шаблонах и на дефолтном и другом, в режиме отладки, ошибок не замечено!

Ошибок нет! С этим полный порядок! Но проблема с не дотягиванием ползунка к максимально большой величине при дробной малой, осталась.

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

А вот так выглядят ползунки если хоть один из них сдвинуть с места. Минимум стал 81.5 как и положено, а вот максимальная стала 1749.5 и поставить ползунком на 1750 нельзя — собственно в этом и проблема.

DmitriyBarinov
Был
За полезные публикации на форуме
13 тем
38 сообщений
Рейтинг: 31
Репутация: 2
На сайте 3 года

Согласен, и у меня так же, число убегает в меньшую сторону.

А попробуйте в step: 1 заменить на step 0.1,

Редактировалось 1 раз, последний: 15:55
unlocked
Был
Нет тем
44 сообщения
Рейтинг: 12
Репутация: 0
На сайте 3 года

Или 0.5

Fox
Был
1 тема
38 сообщений
Рейтинг: 2
Репутация: 0
На сайте 3 года

а как вы в ползунке две «точки или края» получили, от и до?

DmitriyBarinov
Был
За полезные публикации на форуме
13 тем
38 сообщений
Рейтинг: 31
Репутация: 2
На сайте 3 года

Вот так что бы не было нотиса и показывало цену после фильтрации

public function parse ($value){
$units = $this -> getProperty ( 'units' );
if ( !$units ) {$units = $this -> getOption ( 'units' );}
if ( !$units ) {$units = '';}
if ( intval ( $value ) == $value ) {$value = number_format ( $value, 0, '.', '' );}
//return $units;
return @htmlspecialchars ( $value, ENT_NOQUOTES ) . ' ' . $units ;}

@htmlspecialchars по совету kreator

Редактировалось 1 раз, последний: 18:12
Автор: vikont
vikont
Был
За помощь админу За активное участие
9 тем
351 сообщение
Рейтинг: 40
Репутация: 2
На сайте 3 года
Цитата: Fox
а как вы в ползунке две «точки или края» получили, от и до?

Крайние точки в ползунках есть, просто их не видно из=за стилей! Чтобы они появились в фильтре я в файле l/templates/default/controllers/content/widgets/filter_plus/filter.tpl.php перед тегом </style> дописал следующее

.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{
border:1px solid #aaaaaa;
background:#f6f6f6;
font-weight:normal;
color:#454545}
где border:1px solid #aaaaaa; и есть цвет и толщина рамки квадратика ползунка.
Редактировалось 1 раз, последний: 18:27
Автор: vikont
vikont
Был
За помощь админу За активное участие
9 тем
351 сообщение
Рейтинг: 40
Репутация: 2
На сайте 3 года
Цитата: dmitrix2024
А попробуйте в step: 1 заменить на step 0.1,

Спасибо, все заработало! В моем случае все оказалось куда проще:

1. Залил стандартные скрипты Поля ползунки на сайт

2. После строки 108 max: '. $max .', добавил step: 0.1, (по совету dmitrix2024) - теперь ползунки отрабатывают все значения и правильно становятся в крайние положения

4. Чтобы не было нотисов из за строки 43 приводим ее к следующему виду

return @htmlspecialchars($value)." {$units}"; — дописан символ @ перед htmlspecialchars($value). по совету kreator

5. Чтобы крайние точки ползунков стали видны в фильтре в файле l/templates/default/controllers/content/widgets/filter_plus/filter.tpl.php перед тегом </style> дописал следующее

.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{
border:1px solid #aaaaaa;
background:#f6f6f6;
font-weight:normal;
color:#454545}
Помогал maxisoft
Считаю, что проблема Поля ползунки решена.

Отвечать в темах могут только зарегистрированные пользователи. Вход Регистрация.

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.