2015-12-08 4 views
0

мне нужно изменять PRODUCT поля (DropDownList) изменяются свойства и MIN MAX Картики \ Slider компонентИзменения свойств от другого поля

---- Форма ----

<?= 
     $form->field($model, 'product_id', [ 
      'inputOptions' => [ 
       'class' => 'selectpicker ' 
      ] 
     ] 
     )->dropDownList(app\models\Product::getHierarchy(), ['prompt' => 'Selecione', 'class'=>'form-control required']); 
?> 

use kartik\slider\Slider; 
echo $form->field($model, 'commission_percent')->widget(Slider::classname(), [ 
      'name'=>'commission_percent', 
      'value'=>7, 
      'sliderColor'=>Slider::TYPE_GREY, 
      'handleColor'=>Slider::TYPE_SUCCESS, 
      'pluginOptions'=>[ 
       'handle'=>'round', 
       'tooltip'=>'always', 
       'min'=>10, 
       'max'=>50, 
       'step'=>1, 
      ] 
     ]); 

---- правила ----

['commission_percent', 'number','min'=>30,'max'=>40, 'when' => function($model) { 
       return $model->product_id == 14; 
      }], 

EDITED

Каждый продукт имеет максимальное значение и минимальную комиссионную сумму. Я не знаю, как поймать эти значения и передать свойства max и min SLIDER.

EDITED 2

Мой контроллер actionListx возврата:

Invalid Parameter - юй \ база \ InvalidParamException содержание Ответ не должен быть массивом.

Моего _form:

<?php 
$productId = Html::getInputId($model, 'product_id'); 
$comissionId = Html::getInputId($model, 'commission_percent'); 
$url = \Yii::$app->getUrlManager()->createUrl('/dailyproductivity/listx'); 
$js = <<<JS 
$('#{$productId}').on('change', function() { 
    var form = $('#dailyproductivity-form'); 
    $.ajax({ 
     url: '{$url}', 
     type: 'post', 
     data: form.serialize(), 
     success: function(data) { 
      var min = data.min; 
      var max = data.max; 

      $("#{$comissionId}").data('slider').options.min = min; 
      $("#{$comissionId}").data('slider').options.max = max; 
      $("#{$comissionId}").slider('setValue', min); 
     } 
    }); 
}); 
JS; 
$this->registerJs($js); 
?> 

Моего ProductivityController:

public function actionListx() 
    { 
     $model = new Dailyproductivity(); 

     if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { 
      Yii::$app->response->format = Response::FORMAT_JSON; 

      $product = Product::findOne($model->product_id); 

      if ($product !== null) { 
       return [ 
        'min' => $product->min_value, 
        'max' => $product->max_value, 
       ]; 
      } 
     } 

     return [ 
     'min' => '0', 
     'max' => '100' 
    ]; 
} 

печать

enter image description here

+0

В чем проблема ?. –

+0

Привет @RumesShyaman Я не знаю как. – gugoan

ответ

3

Если вы не спасаете это минимальное и максимальное значение и соответствуют идентификаторам где-то в ваш db (и я думаю, что вам нужно), вы можете сделать это остроумие h pure js. Вот пример:

<?php 
$productId = Html::getInputId($model, 'product_id'); 
$comissionId = Html::getInputId($model, 'commission_percent'); 
$js = <<<JS 
$('#{$productId}').on('change', function() { 
    var id = $(this).val(); 

    if (id == 14) { 
     var min = 30; 
     var max = 40; 
    } else { 
     var min = 0; 
     var max = 100; 
    } 

    $("#{$comissionId}").data('slider').options.min = min; 
    $("#{$comissionId}").data('slider').options.max = max; 
    $("#{$comissionId}").slider('setValue', min); 
}); 
JS; 
$this->registerJs($js); 

И убедитесь, чтобы добавить новое правило в модели:

public function rules() 
{ 
    return [ 
     // the other rules 
     // ... 
     ['commission_percent', 'number','min'=>0,'max'=>100] // the general values 
     ['commission_percent', 'validate'] 
    ]; 
} 

/** 
* @param string $attribute 
*/ 
public function validate($attribute) 
{ 
    if ($this->product_id == 14) { 
     $min = 30; 
     $max = 40; 

     if ($this->attribute < $min || $this->attribute > $max) { 
      $this->addError($attribute, 'error message')); 
     } 
    } 
} 

Но если у вас есть много продуктов, и каждый из них имеет определенное значение мин и макс , вместо создания группы if statements вы можете создать новое действие, которое проверит модель, у которой есть два значения (мин. и макс.), и вернет их. И вы можете получить к нему доступ с помощью вызова ajax.

Вот пример этого AJAX (предполагая, что вы добавили min_value и max_value атрибуты в вашей Product модели:

в вашем зрения:

$productId = Html::getInputId($model, 'product_id'); 
$comissionId = Html::getInputId($model, 'commission_percent'); 
$url = Url::to(['controller/action-with-ajax']); 

$js = <<<JS 
$('#{$productId}').on('change', function() { 
    var form = $('#my-form-id'); 
    $.ajax({ 
     url: '{$url}', 
     type: 'post', 
     data: form.serialize(), 
     success: function(data) { 
      var min = data.min; 
      var max = data.max; 

      $("#{$comissionId}").data('slider').options.min = min; 
      $("#{$comissionId}").data('slider').options.max = max; 
      $("#{$comissionId}").slider('setValue', min); 
     } 
    }); 
}); 
JS; 
$this->registerJs($js); 

И ваш контроллер:

public function actionWithAjax() 
{ 
    $model = new Model(); // the model you are using in this form 

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { 
     Yii::$app->response->format = Response::FORMAT_JSON; 

     if ($product = Product::findOne($model->product_id)) !== null) { 
      return [ 
       'min' => $product->min_value, 
       'max' => $product->max_value, 
      ]; 
     } 
    } 

    return [ 
     'min' => '0', 
     'max' => '100' 
    ]; 
} 
+0

прохладный. Мне показалось интересной твоя идея. Для каждого product_id у меня будет столбец MAX и MIN? – gugoan

+0

Да, я бы порекомендовал вам сделать это.Возможно, добавьте эти два дополнительных столбца в таблицу продуктов. Итак, как в ваших 'js', так и в ваших' rules', вместо выполнения 'if statement' вы проверите это значение и передадите его в переменные' max' и 'min'. – Clyff

+0

В вашем 'js', это просто вопрос замены' if' на вызов 'ajax', есть много примеров того, как это сделать в stackoverflow. И действие, которое вы вызываете, попытается найти этот продукт и вернуть его или просто вернуть эти два значения. То же самое в ваших правилах, попробуйте найти продукт и получите два атрибута. – Clyff