каким методом передать данные в контроллер

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: как передать данные из js в контроллер

Сообщение Dominus »

svil писал(а): 2018.07.02, 15:15 Нашла ошибку: конфликт с ранее установленным ranger, убрала из asset его js, и ползунок появился.
css тоже надо убрать
и в модели укажите правила для range, а то получите null

Код: Выделить всё

<?php

namespace app\models;

/**
 * Class MyModel
 * @package app\models
 */
class MyModel extends \yii\base\Model
{
    public $range;
    public $country;

    public function rules()
    {
        return [
            [['range'], 'string']
        ];
    }
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

Это тестовый пример.Контроллер. Я использую модель Country с ActiveRecord, потому что мне надо select-option вывести список стран(в дальнейшем это будет список брендов категории). Но в виде ошибка на модель Country, отдельно она работала и отправлялась из формы.А сейчас я хочу объединить список и диапазон для фильтра

Код: Выделить всё

<?php
namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use app\models\MyModel;

class CarticController extends Controller
{
public function actionIndex()
{
    $model = new MyModel();
    //ввожу модель Country из БД для выпадающего списка в форме фильтра
    $country= new Country();
    if ($model->load(Yii::$app->request->post())) {
        // Смотрим, данные получены.
        \yii\helpers\VarDumper::dump($model->range, 10, 1);
        die;
        // Работаем с принятыми данными
        //...
    }
    return $this->render('index', ['model' => $model]);
}
}
Вид:

Код: Выделить всё

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\slider\Slider;

?>
<div class="price-range">
<?php $form = \yii\bootstrap\ActiveForm::begin(); ?>
<h2>Фильтр категории:</h2>


//это список стран select-option
    <?php     $items = \app\models\Country::find()
        ->select(['name'])
        ->where(['between', 'population', '200000000', '20000000000'])
        ->indexBy('name')
        ->column();
    $params = [
        'prompt' => 'любой'
    ];
    echo $form->field($country, 'name')->dropDownList($items, $params);
    ?>
    
//диапазон
<div class="well text-center">
    <?= $form->field($model, 'range')->widget(\kartik\slider\Slider::class, [
        'sliderColor' => \kartik\slider\Slider::TYPE_GREY,
        'handleColor' => \kartik\slider\Slider::TYPE_DANGER,
        'pluginOptions' => [
            'min' => 2500,
            'max' => 3123,
            'step' => 5,
            'range' => true
        ]
    ])->label(false); ?>
    <br/>
    <b class="pull-left">2500</b> <b class="pull-right">3123</b>
</div>
<div class="form-group">
    <?= Html::submitButton('Отправить', [
        'class' => 'btn btn-primary',
    ]) ?>
</div>
<?php \yii\bootstrap\ActiveForm::end(); ?>
</div>

?>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: как передать данные из js в контроллер

Сообщение Dominus »

Для теста можно так:
Model:

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use app\models\Country;

/**
 * Class MyModel
 * @package app\models
 *
 * @property string $range Range
 * @property integer $country Country
 */
class MyModel extends \yii\base\Model
{    
    public $range;
    public $country;
    
    /**
     * @return array
     */
    public function rules()
    {
        return [
            [['range'], 'string'],
            [['country'], 'integer'],
        ];
    }
   
   /**
     * @return array
     */ 
    public function attributeLabels()
    {
        return [
            'range' => Yii::t('app', 'Range'),
            'country' => Yii::t('app', 'Country'),
        ];
    }
    
    /**
     * Возвращает массив стран
     * @return mixed
     */
    public function getCountriesArray()
    {
        $countries = Country::find()->all();
        return \yii\helpers\ArrayHelper::map($countries, 'id', 'name');
    }
}
Controller:

Код: Выделить всё

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\MyModel;

/**
 * Class CarticController
 * @package app\controllers
 */
class CarticController extends Controller
{
    /**
     * @return string
     */
    public function actionIndex()
    {
        $model = new MyModel();
        if ($model->load(Yii::$app->request->post())) {

            // Работаем с принятыми данными
            $array = explode(',', $model->range);

            \yii\helpers\VarDumper::dump($array, 10, 1);
            \yii\helpers\VarDumper::dump($model->country, 10, 1);          
            die;

        }
        return $this->render('index', ['model' => $model]);
    }
}
View:

Код: Выделить всё

<?php
use yii\helpers\Html;
use kartik\slider\Slider;

?>
<div class="price-range">
<?php $form = \yii\bootstrap\ActiveForm::begin(); ?>
<h2>Фильтр категории:</h2>


//это список стран select-option
<?= $form->field($model, 'country')->dropDownList($model->getCountriesArray(), [
    'prompt' => 'Любой',
]); ?>
    
    
//диапазон
<div class="well text-center">
    <?= $form->field($model, 'range')->widget(\kartik\slider\Slider::class, [
        'sliderColor' => \kartik\slider\Slider::TYPE_GREY,
        'handleColor' => \kartik\slider\Slider::TYPE_DANGER,
        'pluginOptions' => [
            'min' => 2500,
            'max' => 3123,
            'step' => 5,
            'range' => true
        ]
    ])->label(false); ?>
    <br/>
    <b class="pull-left">2500</b> <b class="pull-right">3123</b>
</div>
<div class="form-group">
    <?= Html::submitButton('Отправить', [
        'class' => 'btn btn-primary',
    ]) ?>
</div>
<?php \yii\bootstrap\ActiveForm::end(); ?>
</div>
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

Проблема в том, что когда я пытаюсь работать с данными внутри if ($model->load(Yii::$app->request->post())) {..} и присваивать переменной итоговые значения, эту переменную вне этого if не видно, и я не могу ее вывести:

Код: Выделить всё

<?php
namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use app\models\MyModel;

class CarticController extends Controller
{
public function actionIndex()
{
    $model = new MyModel();
   
    if ($model->load(Yii::$app->request->post())) {

        // Работаем с принятыми данными
     $array = explode(',', $model->range);
 $value=$array[0];
  $value2=$array[2];
  $value3=$model->country; //так не правильно- как не знаю надо
   \yii\helpers\VarDumper::dump($array, 10, 1);
       \yii\helpers\VarDumper::dump($model->country, 10, 1);
       debug($_POST);
        die;
    }
    return $this->render('index', ['model' => $model, 'value' => $value, 'value2' => $value2, 'value' => $value3]);
}
}
Вид после формы, куда эти значения не выводятся и выдается ошибка, что их нет:

Код: Выделить всё

<?=$value ?>
<?=$value2 ?>
<?=$value3 ?>
Вот так работает и выводится в вид:

Код: Выделить всё

<?php
namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use app\models\MyModel;

class CarticController extends Controller
{
public function actionIndex()
{
    $model = new MyModel();
    $qu = Yii::$app->request->post();
    
   $value = ArrayHelper::getValue($qu,'MyModel.country','любой');
  $value2=ArrayHelper::getValue($qu,'MyModel.range','любой');

    return $this->render('index', ['model' => $model, 'value' => $value, 'value2' => $value2, 'value3' => $value3]);
}
}
Как сделать, чтобы можно было получать конечные данные из if?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: как передать данные из js в контроллер

Сообщение Dominus »

Код: Выделить всё

die; // Останавливает выполнение кода в этой точке
Удалите или за комментируйте.
http://php.net/manual/ru/function.die.php

и почему

Код: Выделить всё

$value=$array[0];
$value2=$array[2];
а не

Код: Выделить всё

$value=$array[0];
$value2=$array[1];
Если строка приходит вида

Код: Выделить всё

'123,456'
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Toshus
Сообщения: 14
Зарегистрирован: 2018.06.06, 21:06

Re: как передать данные из js в контроллер

Сообщение Toshus »

А можно записать еще так:

Код: Выделить всё

list($value, $value2) = explode(',', $model->range);
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

Dominus, Toshus, спасибо.
Почему не попадает в $value (prompt) "Любой" из select-option при

Код: Выделить всё

 ArrayHelper::getValue($qu,'MyModel.country','Любой');
  $value = ArrayHelper::getValue($qu,'Country.name','Любой');
 
и надо прописывать

Код: Выделить всё

if (!$value) $value="Любой";
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: как передать данные из js в контроллер

Сообщение Dominus »

svil писал(а): 2018.07.03, 16:13 Dominus, Toshus, спасибо.
Почему не попадает в $value (prompt) "Любой" из select-option при

Код: Выделить всё

 ArrayHelper::getValue($qu,'MyModel.country','Любой');
  $value = ArrayHelper::getValue($qu,'Country.name','Любой');
 
и надо прописывать

Код: Выделить всё

if (!$value) $value="Любой";
https://www.yiiframework.com/doc/guide/ ... ing-values

Смотрите какие у вас данные.

Код: Выделить всё

$array = ['один', 'два', 'три'];
$val = 1;
$value = ArrayHelper::getValue($array, $val,'Любой');
print_r($value); // Выведет - два

Код: Выделить всё

$array = ['один', 'два', 'три'];
$val = 3;
$value = ArrayHelper::getValue($array, $val,'Любой');
print_r($value); // Выведет - Любой
Если вы пытаетесь составить массив для select то используйте ArrayHelper::map
Последний раз редактировалось Dominus 2018.07.03, 16:51, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

Как посмотреть?

Код: Выделить всё

<?php
use yii\helpers\Html;
use kartik\slider\Slider;
use app\models\Country;

?>
<div class="price-range">
    <?php $form = \yii\bootstrap\ActiveForm::begin(); ?>
    <h2>Фильтр категории:</h2>
//Здесь есть "Любой" в prompt
    <?php     $items = \app\models\Country::find()
        ->select(['name'])
        ->where(['between', 'population', '200000000', '20000000000'])
        ->indexBy('name')
        ->column();
    $params = [
        'prompt' => 'Любой'
    ];
    echo $form->field($model, 'country')->dropDownList($items, $params);
    


    //диапазон
    <div class="well text-center">
        <?= $form->field($model, 'range')->widget(\kartik\slider\Slider::class, [
            'sliderColor' => \kartik\slider\Slider::TYPE_GREY,
            'handleColor' => \kartik\slider\Slider::TYPE_DANGER,
            'pluginOptions' => [
                'min' => 2500,
                'max' => 3123,
                'step' => 5,
                'range' => true
            ]
        ])->label(false); ?>
        <br/>
        <b class="pull-left">2500</b> <b class="pull-right">3123</b>
    </div>
    <div class="form-group">
        <?= Html::submitButton('Отправить', [
            'class' => 'btn btn-primary',
        ]) ?>
    </div>
    <?php \yii\bootstrap\ActiveForm::end(); ?>
</div>
<?="Страна: ".$value ?>
<br/>

<?="Диапазон: ".$value1."-".$value2; ?>
<br/>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: как передать данные из js в контроллер

Сообщение Dominus »

В посте выше есть функция

Код: Выделить всё

    /**
     * Возвращает массив стран
     * @return mixed
     */
    public function getCountriesArray()
    {
        $countries = Country::find()->all();
        return \yii\helpers\ArrayHelper::map($countries, 'id', 'name');
    }
https://www.yiiframework.com/doc/guide/ ... lding-maps
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

У меня внутри категории вычисляется минимальная и максимальная цена товаров в контроллере: $min и $max.
Если я вне ActiveForm вывожу слайдер цены, то все корректно отображается в слайдере, то есть он видит $min и $max, выводит диапазон от $min до $max

Код: Выделить всё

 <div class="price-range"><!--price-range-->
                <h2>Фильтр категории <?= $category->name?>:</h2>
                    <div class="well text-center">
                    <b class="pull-left">Цена</b>
                    <input type="text" class="span2" value="" data-slider-min="<?=$min ?>" data-slider-max="<?=$max ?>" data-slider-step="5" data-slider-value="[250,450]" id="sl2" ><br />
                    <b class="pull-left"><?=$min ?></b> <b class="pull-right"><?=$max ?></b>
                    </div>
Если я то же самое вывожу внутри ActiveForm: слайдер не работает и не видит $min и $max:

Код: Выделить всё

 <div class="price-range">
                <?php $form = \yii\bootstrap\ActiveForm::begin(); ?>
                <h2>Фильтр категории:</h2>
                //диапазон
                <div class="well text-center">
                    <?= $form->field($model, 'range')->widget(\kartik\slider\Slider::class, [
                        'sliderColor' => \kartik\slider\Slider::TYPE_GREY,
                        'handleColor' => \kartik\slider\Slider::TYPE_DANGER,
                        'pluginOptions' => [
                            'min' => 2500, //только так выводит, если ставлю $min - не работает
                            'max' => 3123, //только так выводит, если ставлю $max - не работает
                            'step' => 5,
                            'range' => true
                        ]
                    ])->label(false); ?>
                    <br/>
                    <b class="pull-left">2500</b> <b class="pull-right">3123</b> // если ставлю <?=$min ?> вместо 2500 не работает
                </div>
                <div class="form-group">
                    <?= Html::submitButton('Отправить', [
                        'class' => 'btn btn-primary',
                    ]) ?>
                </div>
                <?php \yii\bootstrap\ActiveForm::end(); ?>
            </div>
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

В модели вычислять и передавать в $model, а потом выводить как 'min', 'max'? Или в контроллере по min max модели?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: как передать данные из js в контроллер

Сообщение Dominus »

Трудно сказать где лучше, код то ваш) А так, что то мы далеко ушли от самой темы топика))
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: как передать данные из js в контроллер

Сообщение svil »

спасибо большое
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: каким методом передать данные в контроллер

Сообщение svil »

Я сомневалась в правильности, как надо делать, думала, просто в вид неправильно что-то вывожу.
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

Re: каким методом передать данные в контроллер

Сообщение Chaos-13 »

Всем привет. Увидел похожую тему, чтобы не создавать, решил написать сюда. Вопрос такой, имеется js скрипт, который собирает данные с таблицы в строку. На выходе получается массив TableList = ['1', '2', '3', '4', '5']. Это если таблица состоит из одной строки. Т.к. этот массив собран JS, а не элементами ActiveForm, то как его мне передать в контроллер. В этой теме уже писали, но у меня ничего не получилось, я новичок в этом деле). Вот код скрипта:

Код: Выделить всё

 function TableParse() { //собирает данные из таблицы с техникой и передаёт их на сервер
    var TableList = Array();
		var tr = document.getElementById("dynamic").getElementsByTagName("tr");
		for(var i=0;i<tr.length;i++)
		{
			var td = tr.item(i).getElementsByTagName("td");
			for(var j=0;j<td.length-1;j++)
			{
				TableList[i,j] = td.item(j).innerText.slice(0, -1);
				
			}
        }  
Как мне его правильно передать в контроллер?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: каким методом передать данные в контроллер

Сообщение Dominus »

Можно с помощью Ajax

Код: Выделить всё

    function TableParse() { //собирает данные из таблицы с техникой и передаёт их на сервер
        var TableList = Array('1', '2', '3', '4', '5');
        //...		
        return  TableList;
    }
    
    $('.send-ajax').click(function (e) {
        e.preventDefault();
        
        var link = e.currentTarget,
            url = link.href,
            data = TableParse();
        
        $.ajax({
            url: url,            
            type: 'post',            
            data: {value: data},
        }).done(function (response) {
            alert('Получены данные ' + response);
        });
    });

Код: Выделить всё

<?= Html::a('Отправить данные', ['/site/data-ajax'], ['class' => 'send-ajax']) ?>
Контроллер, в данном случае SiteController

Код: Выделить всё

    public function actionDataAjax()
    {
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

            // получен массив
            if ($post = Yii::$app->request->post('value')) {
                return implode(', ', $post); // конвертируем в строку, отправляем ответ
            }
        }
        throw new \yii\web\NotFoundHttpException('The requested page does not exist.');
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

Re: каким методом передать данные в контроллер

Сообщение Chaos-13 »

Спасибо, попробую.
Ответить