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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

left не видит переменную вне if. id2 это rang

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

public function actionView($id){
        $rang = Yii::$app->request->get('rang');
        $rang2 = Yii::$app->request->get('rang2');

//
//        $id2 = Yii::$app->request->get('id2');
//
//
//        $range = explode(" ", $id2);
//        $left=$range[0];
//
//        $right= (!isset($range[2]))?$right=0:$right=$range[2];
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

            if ($rang = Yii::$app->request->get('id2')) {

                $result = explode(":", $rang);
                $range = [];
                foreach($result as $value) {
                    $range[] =  trim($value, " ");
                }

                return [
                    'left' => $range[0],
                    'right' => $range[1],
                    'success' => true,
                ];
            }
        }
       // return $this->redirect(['category', 'id' => $id]);

//debug($range);
       // $min2 = Product::find()->where(['category_id' => $id, ])->min('price');
      //  $min2 = Product::find()->with('category')->where(['id' => $id])
        $rangeres = Product::find()
            ->select(['name'])
            ->where(['between', 'price', 1000, 50000])
            ->indexBy('name')
            ->column();
//        if( !Yii::$app->request->isAjax ){
//            return $this->redirect(Yii::$app->request->referrer);
        //}
        //debug($range);
      //  if (\Yii::$app->request->isAjax){
           // $range = explode(" ", $id2);
           // $left=$range[0];
           // $right=$range[2];

           //return  \yii\helpers\Json::encode($range);
        //}

           // return $this->redirect(['index']);

       // $rang = !$rang ? 1 : $rang;

//        $id = Yii::$app->request->get('id');

        $category = Category::findOne($id);
        $query2 = Brand::find()->where(['category_id' => $id]);

        if(empty($category))
            throw new \yii\web\HttpException(404, 'Такой категории нет');

//        $products = Product::find()->where(['category_id' => $id])->all();
        $query = Product::find()->where(['category_id' => $id]);
        $pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 3, 'forcePageParam' => false, 'pageSizeParam' => false]);
        $products = $query->offset($pages->offset)->limit($pages->limit)->all();
        $min = Product::find()->where(['category_id' => $id])->min('price');
        $max = Product::find()->where(['category_id' => $id])->max('price');
        $brands = $query2->orderBy('name')->all();


        $this->setMeta('Автозапчасти | ' . $category->name, $category->keywords, $category->description);
        return $this->render('view', compact('products', 'pages', 'category','min','max', 'brands','rang2','id',  'rangeres','left' ));
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

а вот так видит:

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

$id2 = Yii::$app->request->get('id2');
        $range = explode(" ", $id2);
        $left=$range[0];
        $right= (!isset($range[2]))?$right=0:$right=$range[2];
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

то есть по сети я вижу диапазон в get, но в вид не выводятся

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

<div>
            Лево: <?=$left;
            ?>
        </div>
        <div>
            Право: <?=$right; ?>
        </div>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

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

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

Сообщение svil »

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

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

Сообщение Dominus »

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

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

Сообщение svil »

//id- параметр категории нужен для redirect
public function actionView($id){

//Это выводит без ошибок, но пока не понятно, видит left и right или нет
// $id2 = Yii::$app->request->get('id2');
//
//
// $range = explode(" ", $id2);
// $left=$range[0];
//
// $right= (!isset($range[2]))?$right=0:$right=$range[2];

//Это не видит left и right изза return, с которым ошибка
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

if ($rang = Yii::$app->request->get('id2')) {

$result = explode(":", $rang);
$range = [];
foreach($result as $value) {
$range[] = trim($value, " ");
}

return [
'left' => $range[0],
'right' => $range[1],
'success' => true,
];
}
}
return $this->redirect(['category', 'id' => $id]);

//Здесь по id параметру экшена выводятся товары только одной категории с пагинацией
$category = Category::findOne($id);
$query2 = Brand::find()->where(['category_id' => $id]);
if(empty($category))
throw new \yii\web\HttpException(404, 'Такой категории нет');
$query = Product::find()->where(['category_id' => $id]);
$pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 3, 'forcePageParam' => false, 'pageSizeParam' => false]);
$products = $query->offset($pages->offset)->limit($pages->limit)->all();
//здесь получаю минимальное и максимальное значение для диапазона цены для ranger и вывожу
$min = Product::find()->where(['category_id' => $id])->min('price');
$max = Product::find()->where(['category_id' => $id])->max('price');

//здесь беру массив брендов для фильтрации потому что , кроме диапазона цен, пользователь будет выбирать бренд из бренда категорий
$brands = $query2->orderBy('name')->all();

//метатэги
$this->setMeta('Автозапчасти | ' . $category->name, $category->keywords, $category->description);

//вот эти ,'left', 'right' не выводятся в вид, пробовать в коде не успела их наличие в этом контроллере
return $this->render('view', compact('products', 'pages', 'category','min','max', 'brands','left', 'right' ));
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

1. Создаёте форму со слайдером.
2. При выборе значений на слайдере, пользователь нажимает кнопку отправить.
3. Форма со значениями отправляется на сервер.
4. В контроллере происходит обработка и выводится результат.

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

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

Сообщение svil »

ясно. И в эту же форму положить выбор бренда из брендов этой категории(select-option).Попробую
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

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

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

Сообщение Dominus »

Для слайдера можно использовать готовый виджет, например этот: http://demos.krajee.com/slider
Тогда форма может выглядеть так:

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

<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,
                '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>
и Controller может выглядеть так:

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

public function actionIndex()
    {
        $model = new MyModel();
        if ($model->load(Yii::$app->request->post())) {
            // Смотрим, данные получены.
            \yii\helpers\VarDumper::dump($model->range, 10, 1);
            die;
            // Работаем с принятыми данными
            //...           
        }
        return $this->render('index', ['model' => $model]);
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

Инсталлировала виджет: "kartik-v/yii2-slider": "*"(composer.json)+composer update;
так выглядит вид(скопировала Ваш):

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

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

?>
<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,
            '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>
Модель:

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

<?php
namespace app\models;
use yii\base\Model;
use Yii;

class MyModel extends \yii\base\Model
{
    public $range;
    public $country;

    public function rules()
    {
        return [

        ];
    }
}
Контроллер:

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

<?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())) {
        // Смотрим, данные получены.
        \yii\helpers\VarDumper::dump($model->range, 10, 1);
        die;
        // Работаем с принятыми данными
        //...
    }
    return $this->render('index', ['model' => $model]);
}
}
Но при переходе на cartic/index слайдер не работает, нет 2 ползунков. Что я сделала не так?
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

Прилагаю снимок с экрана, не кликается ползунок

https://drive.google.com/open?id=1sSwks ... YENQbzVHkX
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

Исходный код страницы

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

 <div class="container">
                        <div class="price-range">
<form id="w0" action="/~svetlanailina/yii3/web/index.php?r=cartic/index" method="post">
<input type="hidden" name="_csrf" value="-BKKErOKZP0D-VlbRlsiGtAtXezy4lhYtEGNC75FXCjIQcEqwckUu0aKby4Aak9qu2MfmL6lNjXHdPdtxyM-Ww=="><h2>Фильтр категории:</h2>
<div class="well text-center">
    <div class="form-group field-mymodel-range">

<input type="text" id="mymodel-range" class="form-control" name="MyModel[range]" data-krajee-slider="slider_ca98cb64">

<p class="help-block help-block-error"></p>
</div>    <br/>
    <b class="pull-left">2500</b> <b class="pull-right">3123</b>
</div>
<div class="form-group">
    <button type="submit" class="btn btn-primary">Отправить</button></div>
</form></div>    </div>
</div>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

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

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

Сообщение svil »

https://drive.google.com/open?id=1SNBer ... JytAOn58Gk
Это ссылка когда я с документации просто вставила пример, тоже не работает

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

echo '<b class="badge">$10</b> ' . Slider::widget([
    'name'=>'rating_3',
    'value'=>'250,650',
    'sliderColor'=>Slider::TYPE_GREY,
    'pluginOptions'=>[
        'min'=>10,
        'max'=>1000,
        'step'=>5,
        'range'=>true
    ],
]) . ' <b class="badge">$1,000</b>';
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

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

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

Сообщение svil »

Нашла ошибку: конфликт с ранее установленным ranger, убрала из asset его js, и ползунок появился.
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

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

Сообщение svil »

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

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

Сообщение Dominus »

Цвет это уже настройки)

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

'sliderColor' => \kartik\slider\Slider::TYPE_GREY,
'handleColor' => \kartik\slider\Slider::TYPE_DANGER,
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить