Ajax + POST/GET как вывести в вид переменную без лишних тэгов?

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

Ajax + POST/GET как вывести в вид переменную без лишних тэгов?

Сообщение svil »

Не могу вывести в вид результаты AJAX запроса post. В консоли выводятся.Мне в js нужно передавать json.Но пока без него -чтоб сам механизм работал.Может как-то защита срабатывает изза csrf токена. Я его убрала из шаблона и в контроллере false.
Модель:

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

<?php

namespace app\models;
use yii\base\Model;

class TestForm extends Model{

    public $name;
    public $email;
    public $text;

    public function attributeLabels(){
        return[
            'name'=>'Имя',
            'email'=>'E-mail',
            'text'=>'Текст сообщения',

        ];
    }


    public function rules(){
        return [
            [ ['name', 'email'], 'required' ],
            [ 'email', 'email' ],
            [ 'name', 'string', 'length' => [2,5] ],
            [ 'name', 'myRule' ],
            [ 'text', 'trim' ],
        ];
    }

    public function myRule($attr){
        if( !in_array($this->$attr, ['hello', 'world']) ){
            $this->addError($attr, 'Wrong!');
        }
    }



}
Контроллер SiteController

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

 public function beforeAction($action){
        if($action->id=='page'){
            $this->enableCsrfValidation=false;
        }
        return parent::beforeAction($action);
    }
    public function actionPage(){

        $form_model = new TestForm();
        $array_if= " ";

        if(\Yii::$app->request->isAjax){
            debug($_POST);
            Yii::$app->request->post();
            return 'Запрос принят!';
        }
        if ($form_model->load(Yii::$app->request->post())) {
            // Работаем с принятыми да
            нными
            $array_if = $form_model->TestForm->text;

            debug($form_model);

        }

        debug($form_model);

        return $this->render('page', compact('array_if','form_model'));

    }
Вид

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

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
?>

<?php $form = ActiveForm::begin() ?>
 <?= $form->field($form_model, 'text') ?> 
<?= Html::submitButton('Отправить', ['class' => 'btn btn-success']) ?>


<?php ActiveForm::end(); ?>
<?php
$js = <<<JS
    $('form').on('beforeSubmit', function(){
var data = $(this).serialize();
$.ajax({
url: 'index.php?r=site/page',
type: 'POST',
data: data,
success: function(res){
console.log(res);
console.log(data);
},
error: function(){
alert('Error!');
}
});
return false;
});
JS;
$this->registerJs($js);
?>
дебаг
<?php
debug($array_if);//здесь не выводится
?>

<?php
debug($form_model);//здесь пусто
?>
form_model
Вот что в консоли на ввод текста "Пров":

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

<pre>Array
(
    [_csrf] => 4AITkDB-hoBWicn-xa-2FrpH5ZregtvjXgz9kvhuFh2pWyvDADjO5QHcvbqh-ock6wavyJX0ns4xZZLYnwRyaQ==
    [TestForm] => Array
        (
            [text] => Пров
        )

)
</pre>Запрос принят! index.php:994:1
_csrf=4AITkDB-hoBWicn-xa-2FrpH5ZregtvjXgz9kvhuFh2pWyvDADjO5QHcvbqh-ock6wavyJX0ns4xZZLYnwRyaQ%3D%3D&TestForm%5Btext%5D=%D0%9F%D1%80%D0%BE%D0%B2
Последний раз редактировалось svil 2018.07.20, 17:26, всего редактировалось 1 раз.
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: ActiveForm+ Ajax + POST как вывести в вид?

Сообщение svil »

Нашла расширение demogorgorn\ajax\AjaxSubmitButton, пока не работает

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

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use demogorgorn\ajax\AjaxSubmitButton;
?>

<?php $form = ActiveForm::begin(['id' => 'add-form']) ?>
 <?= $form->field($form_model, 'text') ?>
<?php //= Html::submitButton('Отправить', ['class' => 'btn btn-success']) ?>


<div class="form-group">
    <?php
    AjaxSubmitButton::begin([
        'label' => 'Сохранить',
        'useWithActiveForm' => 'add-form',
        'ajaxOptions' => [
            'type' => 'POST',

            'url' => 'index.php?r=site/page',
            'success' => new \yii\web\JsExpression("function(data) {
if (data.status == true)
{
closeTopbar();
}
}"),
        ],
        'options' => ['class' => 'btn btn-primary', 'type' => 'submit', 'id' =>'add-button'],
    ]);
    AjaxSubmitButton::end();
    ?>

    <?php ActiveForm::end(); ?>
    <div id="output"></div>
</div>
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ActiveForm+ Ajax + POST как вывести в вид?

Сообщение urichalex »

"Все уже украдено до нас"
В представлении, или в js файле отправляем post запрос на действие:

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

<?php
$js = <<<JS
$('#myForm').on('submit', function(event) {
	event.preventDefault();
	$.post("index.php?r=site/page").done(function(response) {
		$("#element1").text(response.element1);
		$("#element2").text(response.param2);
	});
})
JS;
$this->registerJs($js);
?>
<div id="element1"></div>
<div id="element2"></div>
В контроллере ловим и отдаем json

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

public function actionPage()
{
	$model = new MyModel();
	if($model->load(Yii::$app->getRequest()->post()) && $model->validate()) {
		return $this->asJson([
			'element1' => $model->someProperty,
			'param2' => $model->myAnotherProperty
		]);
	}
}
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: ActiveForm+ Ajax + POST как вывести в вид?

Сообщение svil »

Белый экран без ошибок
вид site/page

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

<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
?>

<?php $form = ActiveForm::begin() ?>
<?= $form->field($form_model, 'text') ?>
<?= Html::submitButton('Отправить', ['class' => 'btn btn-success myform']) ?>


<?php ActiveForm::end(); ?>


<?php
$js = <<<JS
$('.myform').on('submit', function(event) {
	event.preventDefault();
	$.post("index.php?r=site/page").done(function(response) {
		$("#element1").text(response.element1);

	});
})
JS;
$this->registerJs($js);
?>
<div id="element1"></div>
контроллер SiteController
[code]

        public function actionPage()
        {
            $form_model = new TestForm();
            if($form_model->load(Yii::$app->getRequest()->post()) && $form_model->validate()) {
                return $this->asJson([
                    'element1' => $form_model->text,
                ]);
            }
        }


Модель

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

<?php

namespace app\models;
use yii\base\Model;

class TestForm extends Model{

    public $name;
    public $email;
    public $text;

    public function attributeLabels(){
        return[
            'name'=>'Имя',
            'email'=>'E-mail',
            'text'=>'Текст сообщения',

        ];
    }


    public function rules(){
        return [
            [ ['name', 'email'], 'required' ],
            [ 'email', 'email' ],
//            [ 'name', 'string', 'min' => 2, 'tooShort' => 'Мало' ],
//            [ 'name', 'string', 'max'=> 5, 'tooLong' => 'Много' ]
            [ 'name', 'string', 'length' => [2,5] ],
            [ 'name', 'myRule' ],
            [ 'text', 'trim' ],
        ];
    }

    public function myRule($attr){
        if( !in_array($this->$attr, ['hello', 'world']) ){
            $this->addError($attr, 'Wrong!');
        }
    }



}
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ActiveForm+ Ajax + POST как вывести в вид?

Сообщение urichalex »

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

Re: ActiveForm+ Ajax + POST как вывести в вид?

Сообщение svil »

Я правильно поняла, что для ajax нельзя напрямую переменную в php вывести как в post / get запросе? Нужно подготовить контейнер для выводв в js коде при отправке ajax типа

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

$("#element1").text(response.element1);  
чтобы потом вывести

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

<div id="element1"></div>
Я думала, что ошибка какая-то у меня, а получается вообще другой механизм в принципе.
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: ActiveForm+ Ajax + POST как вывести в вид?

Сообщение svil »

js

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

$('.add-to-cart').on('click', function (e) {
    e.preventDefault();
    var qty = $('#qty').val();
    // url = e.currentTarget.href; // Линк берем из ссылки
    $.ajax({
        url: 'index?r=site/index',

        data: {qty: qty},
        type: 'GET',
        success: function(res){
            if(!res) alert('Ошибка!');
            console.log(res);
            //   console.log(data);
            $('#cart').html(res);
            //document.getElementById('#cart').innerHTML = (res);
        },
        error: function(){
            alert('Error!');
        }

    });

});
вид

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

<span>
<span><label class="minim">Количество:</label></span>
<input type="text" value="1" id="qty" />
<a href="<?= \yii\helpers\Url::to(['site/index'])?>"  class="btn btn-fefault add-to-cart">Добавить</a>
</span>
<div id="cart"></div>
контроллер

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

public function actionIndex()
    {
        $qty = Yii::$app->request->get('qty');
debug($_GET);
       $array_if = explode(',', $qty);


        $per1 = $array_if[0];
$per2=0;
        if ($per1>10) {$per2=23;}
     //   $per2 = $array_if[1];


        return $this->render('index', compact('per2'));

        }
Почему полностью всю страницу рендерит, а не только qty?
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Ajax + POST/GET как вывести в вид переменную без лишних тэгов?

Сообщение svil »

Самый простой способ PJAX оказывается http://ksetrin.com/example/pjax/pjax-example-5
Ответить