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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

Получается отправить данные, но они возвращаются во view и показываются alert. Как мне с этими данными в контроллере работать? я правильно понял из вашего примера, что они в переменной $post? И второй вопрос, в вашем примере добавляется ссылка

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

<?= Html::a('Отправить данные', ['/posts/create'], ['class' => 'send-ajax']) ?>
в ней я уже контроллер на свой изменил. У меня есть уже кнопка

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

            <?= Html::submitButton('  Создать', ['class' => 'btn btn-success btn-lg fa fa-thumbs-o-up', 'onclick' => 'TableParse();']) ?>
. Как мне правильно ваш скрипт включить по нажатию моей кнопки?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

Да, данные находятся в $post в виде массива, с ними и работаете дальше в контроллере.

Событие click срабатывает только при клике по ссылке которая имеет класс send-ajax. То есть, если не изменять скрипт, просто добавьте к своей ссылке данный класс. Url берется из этой же ссылки.

У вас вместо ссылки, кнопка. В этом случае скрипт нужно немного доработать.
Или если не критично то поставить вместо кнопки ссылку.
Вместо

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

<?= Html::submitButton('  Создать', ['class' => 'btn btn-success btn-lg fa fa-thumbs-o-up', 'onclick' => 'TableParse();']) ?>
Это

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

<?= Html::a(' Создать', ['/posts/create'], ['class' => 'btn btn-success btn-lg fa fa-thumbs-o-up send-ajax']) ?>
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

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

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

Сообщение Dominus »

Если кнопка используется в форме, то можно использовать событие beforeSubmit.
Что то вроде этого:

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

$('#signup-form').on('beforeSubmit', function (e) {
        e.preventDefault();

        let form = e.currentTarget,
            url = form.action,
            data = $(this).serialize(),
            success = $('.alert-success'),
            danger = $('.alert-danger'),
            info = $('.alert-info'),
            btnSend = $('#btn-signup'),
            fieldUsername = $('#signupform-username'),
            fieldEmail = $('#signupform-email'),
            fieldPassword = $('#signupform-password');

        $.ajax({
            url: url,
            dataType: 'json',
            type: 'POST',
            data: data,
            beforeSend: function (XMLHttpRequest) {
                success.css('display', 'none');
                danger.css('display', 'none');
                info.css('display', 'block');
            }
        }).done(function (response) {
            info.css('display', 'none');
            if (response.type == 'success') {
                $('.contact-text p').css('display', 'none');                 
                fieldUsername.css('display', 'none');
                fieldEmail.css('display', 'none');
                fieldPassword.css('display', 'none');
                btnSend.prop('disabled', true);
                
                success.css('display', 'block');
                success.html(response.message);               
            } else {
                danger.css('display', 'block');
                danger.html(response.message);
            }
        }).fail(function (response) {
            console.log(response);
        });
        return false;
    });
Это скрипт выдернут из формы регистрации ajax
Последний раз редактировалось Dominus 2018.08.30, 14:37, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

Спасибо, с кнопкой я разобрался. Мне непонятно, почему не происходит редирект по нажатию кнопки, а появляется только alert с сообщением. Что я имею ввиду. Часть данных со странички у меня собирается сразу в модель через ActiveForm, а табличку я собираю скриптом. Так вот по нажатию кнопки у меня происходила передача всех заполненных полей в контроллер массивом, где я их собирался обрабатывать, а вот с табличкой не получалось так, только через js, в котором я не силён)), да и вообще новичок в самом Yii. Ваш скрипт помог мне собранный js массив передать, но редиректа нет и я не могу уже его вызвать из контроллера и посмотреть, что в нём. Как бы сделать так, чтобы показывался результат не в alert, а был бы редирект и ,допустим, из контроллера я мог его просмотреть print_f? Что для этого мне вам надо показать из своего кода, чтобы вы могли мне подсказать?
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

Вот так сейчас выглядит действие из контроллера

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

public function actionCreate() {
        $oPosts = new Posts();
        $oAllWorkType = Work_type::find()->asArray()->all(); //передаём все виды работ
        $oCity = City::find()->asArray()->all();
        $oStreet = Street::find()->asArray()->all();
        $oDivision = Division::find()->asArray()->all();
        $oWorkType = new PostsModel();//объект, в котором будут храниться данные из формы posts/create
        $oAuthor = Author::find()->asArray()->all();
        $oCategorySvt = Category_svt::find()->all();
        $oFIO = Yii::$app->user->identity->fio;
    
            if (Yii::$app->request->isAjax)
            {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                 if ($post = Yii::$app->request->post('value'))
                 {
                  return implode(',', $post); 
                 }
            }
         if ($oWorkType->load(Yii::$app->request->post())) {
           echo '<pre>';print_r($oWorkType);
           die;
            return $this->render('index', [ 
                'posts' => $oWorkType,
                    
                ]);
        } else {
            return $this->render('create', [
                        'posts' => $oPosts,
                        'allworktype' => $oAllWorkType,
                        'worktype' => $oWorkType,
                        'author' => $oAuthor,
                        'categorysvt' => $oCategorySvt,
                        'fio' => $oFIO,
                        'city' => $oCity,
                        'street' => $oStreet,
                        'division' => $oDivision,
            ]);
        }
    }
Сейчас это находиться в таком состоянии...
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

alert с сообщением в скрипте показан как пример, какие данные приняты.
Что бы происходил редирект, то в контроллере вместо отправки ответа использовать редирект.

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

            if (Yii::$app->request->isAjax)
            {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                 if ($post = Yii::$app->request->post('value'))
                 {
                      // return implode(',', $post); 
                      // Выполняем действия с массивом $post
                      // Редиректим на index
                      return $this->redirect('index');
                 }
            }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

Это вид:

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

<?php
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\web\View;
use yii\widgets\ActiveForm;

/* @var $this View */

$this->title = 'Создание заявки';
$this->params['breadcrumbs'][] = ['label' => 'Все заявки', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="posts-create">

    <h1><?= Html::encode($this->title) ?></h1>

    <div class="posts-form">
        <?php $form = ActiveForm::begin(); ?>

        <div class="row">
            <div class="col-lg-4">
                <?php
                //вывод списка работ в DropList
                $items = ArrayHelper::map($allworktype, 'id', 'work_type');
                $params = [
                    'prompt' => 'Выберите тип работ...',
                ];
                echo $form->field($worktype, 'WorkType')->dropDownList($items, $params);
                ?> 
            </div>
        </div>
        <div class="table-title">Комплектность</div>           
        <div class="table-responsive">
            <table class="table table-bordered table-hover table-responsive">
                
                <thead>
                    <tr class="success" data-parent="0">
                        <th class="text-th">№</th>
                        <th class="text-th">Наименование</th>
                        <th class="text-th">Тип(модель)</th>
                        <th class="text-th">Инвентарный номер</th>
                        <th class="text-th">Заводской номер</th>
                        <th class="text-th">Дата ввода в эксплуатацию</th> 
                        <th></th>
                    </tr>
                </thead>
                
                <tbody id="dynamic">

                    <tr  class="input" data-parent="">
                        <td id="number" align="left" class="app-number" valign="bottom">1</td>
                        <td id="name_svt" name="name_svt" contenteditable="true" align="left" valign="bottom"></td>
                        <td id="type_svt" contenteditable="true" align="left" valign="bottom"></td>
                        <span id="type_svt_help" class="help"></span>                        
                        <td id="inv_num" contenteditable="true" align="left" valign="bottom"></td>
                        <td id="serial_num" contenteditable="true" align="left" valign="bottom"></td>
                        <td id="date" contenteditable="true" align="left" valign="bottom" style="width: 100px;"></td>
                        <td style="width: 80px;"><button type="button" class="add update-number" >+</button>
                            <button type="button" class="del update-number">-</button></td>
                    </tr>

                </tbody>
            </table>
        </div>
        <div class="row">
            <div class="col-lg-3">
            <?php
                //вывод списка городов в DropList
                $items = ArrayHelper::map($city, 'id', 'city');
                $params = [
                    'prompt' => 'Укажите город/нас.пункт...',
                ];
                echo $form->field($worktype, 'City')->dropDownList($items, $params);
                ?> 
            </div>
            <div class="col-lg-2">
            <?php
                //вывод списка улиц в DropList
                $items = ArrayHelper::map($street, 'id', 'street');
                $params = [
                    'prompt' => 'Укажите улицу...',
                ];
                echo $form->field($worktype, 'Street')->dropDownList($items, $params);
                ?> 
            </div>
            <div class="col-lg-2">
                <?= $form->field($worktype, 'Room')->textInput(['maxlength' => 5, 'style' => 'width:100px;']) ?>
            </div>
        </div>
        <div class="row">
            <div class="col-lg-6">
                <?= $form->field($worktype, 'TextProblem')->textarea(['rows' => 2, 'cols' => 5]) ?>
            </div>
        </div>
            <div class="col-lg-4">
               
            
                <?= $form->field($worktype, 'FIO')->textInput(['maxlength' => 100, 'style' => 'width:300px']) ?>            
            </div>
            <div class="col-lg-4">
                <?= $form->field($worktype, 'Phone')->textInput(['maxlength' => 15, 'style' => 'width:150px']) ?>
            </div>
        </div>
        <div class="row">
            <div class="col-lg-6">
                <?= $form->field($worktype, 'Result')->textarea(['rows' => 2, 'cols' => 5]) ?>
            </div>
            <div class="col-lg-4">
                <?= $form->field($worktype, 'Ispolnitel')->textInput(['value' => $fio])?>
            </div>  
        </div>
        <div class="row">
            <div class="col-lg-4">
                <div class="form-group field-postsmodel-date required">
                    <label class="control-label" for="postsmodel-date">Дата</label>
                    <input type="date" id="postsmodel-date" class="form-control" name="PostsModel[Date]" style="width:150px" required="true" /> 
                    <div class="help-block"></div>
                </div> 
            </div>

        </div>
         
        <div class="col-md-12">
            <?= Html::submitButton('  Создать', ['class' => 'btn btn-success fa fa-thumbs-o-up']) ?>
        </div>
        
        
        <?php ActiveForm::end(); ?>

    </div>
    <script>
   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);
				
			}
        }
        return TableList;
    }  
    $('.btn').click(function (e) {
        e.preventDefault();
        
        var link = e.currentTarget,
            url = '/posts/create',
            data = TableParse();
        
        $.ajax({
            url: url,            
            type: 'post',            
            data: {value: data},
        }).done(function (response) {
            alert('Получены данные ' + response);
        });
    });
  
    </script>
</div>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

А вообще, мне кажется что логика запутана))
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

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

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

Сообщение Dominus »

Для чего собирать данные из таблицы? По сути тут две зависимые модели.

Услуга и Данные заказчика
То есть Услуга имеет связь hasMany и Данные заказчика связь hasOne (если у заказчика может быть только одна услуга) иначе тоже hasMany
Последний раз редактировалось Dominus 2018.08.30, 15:05, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

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

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

Сообщение Dominus »

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

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

Сообщение Dominus »

Можете глянуть вэбинарчик https://elisdn.ru/blog/89/related-models-on-yii2
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Chaos-13
Сообщения: 9
Зарегистрирован: 2018.02.06, 08:14

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

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

спасибо, гляну обязательно.
Ответить