каким методом передать данные в контроллер
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: как передать данные из 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']
];
}
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: как передать данные из js в контроллер
Это тестовый пример.Контроллер. Я использую модель 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 в контроллер
Для теста можно так:
Model:
Controller:
View:
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');
}
}
Код: Выделить всё
<?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]);
}
}
Код: Выделить всё
<?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>
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
-
- Сообщения: 1
- Зарегистрирован: 2018.07.03, 01:18
Re: как передать данные из js в контроллер
Проблема в том, что когда я пытаюсь работать с данными внутри if ($model->load(Yii::$app->request->post())) {..} и присваивать переменной итоговые значения, эту переменную вне этого if не видно, и я не могу ее вывести:
Вид после формы, куда эти значения не выводятся и выдается ошибка, что их нет:
Вот так работает и выводится в вид:
Как сделать, чтобы можно было получать конечные данные из 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]);
}
}
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: как передать данные из js в контроллер
Код: Выделить всё
die; // Останавливает выполнение кода в этой точке
http://php.net/manual/ru/function.die.php
и почему
Код: Выделить всё
$value=$array[0];
$value2=$array[2];
Код: Выделить всё
$value=$array[0];
$value2=$array[1];
Код: Выделить всё
'123,456'
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: как передать данные из js в контроллер
А можно записать еще так:
Код: Выделить всё
list($value, $value2) = explode(',', $model->range);
Re: как передать данные из js в контроллер
Dominus, Toshus, спасибо.
Почему не попадает в $value (prompt) "Любой" из select-option при
и надо прописывать
Почему не попадает в $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 в контроллер
https://www.yiiframework.com/doc/guide/ ... ing-valuessvil писал(а): ↑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="Любой";
Смотрите какие у вас данные.
Код: Выделить всё
$array = ['один', 'два', 'три'];
$val = 1;
$value = ArrayHelper::getValue($array, $val,'Любой');
print_r($value); // Выведет - два
Код: Выделить всё
$array = ['один', 'два', 'три'];
$val = 3;
$value = ArrayHelper::getValue($array, $val,'Любой');
print_r($value); // Выведет - Любой
Последний раз редактировалось Dominus 2018.07.03, 16:51, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: как передать данные из js в контроллер
Как посмотреть?
Код: Выделить всё
<?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 в контроллер
В посте выше есть функция
https://www.yiiframework.com/doc/guide/ ... lding-maps
Код: Выделить всё
/**
* Возвращает массив стран
* @return mixed
*/
public function getCountriesArray()
{
$countries = Country::find()->all();
return \yii\helpers\ArrayHelper::map($countries, 'id', 'name');
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: как передать данные из js в контроллер
У меня внутри категории вычисляется минимальная и максимальная цена товаров в контроллере: $min и $max.
Если я вне ActiveForm вывожу слайдер цены, то все корректно отображается в слайдере, то есть он видит $min и $max, выводит диапазон от $min до $max
Если я то же самое вывожу внутри ActiveForm: слайдер не работает и не видит $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>
Код: Выделить всё
<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>
Re: как передать данные из js в контроллер
В модели вычислять и передавать в $model, а потом выводить как 'min', 'max'? Или в контроллере по min max модели?
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: как передать данные из js в контроллер
Трудно сказать где лучше, код то ваш) А так, что то мы далеко ушли от самой темы топика))
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: как передать данные из js в контроллер
спасибо большое
Re: каким методом передать данные в контроллер
Я сомневалась в правильности, как надо делать, думала, просто в вид неправильно что-то вывожу.
Re: каким методом передать данные в контроллер
Всем привет. Увидел похожую тему, чтобы не создавать, решил написать сюда. Вопрос такой, имеется 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: каким методом передать данные в контроллер
Можно с помощью Ajax
Контроллер, в данном случае SiteController
Код: Выделить всё
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']) ?>
Код: Выделить всё
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.');
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: каким методом передать данные в контроллер
Спасибо, попробую.