Как изменить параметр в базе данных через кнопку в Yii2?

Имеется Yii2 Advanced, а также стандартный шаблон. Пытаюсь редактировать его под свои задачи, а именно тестовую фриланс площадку.
На данный момент создана база данных и идет вывод заданий на странице. Это представлено в следующем виде:
48c274a7e07746808d2ece122b4750dd.PNG
Выводятся лишь задания, у которых пункт available в базе данных равен нулю. Если он равен единице, то задание имеет исполнителя.
Когда пользователь нажимает на "Принять", то в идеале должен отправляться сигнал в контроллер, где в базе данных на соответствующем заказе изменяется available на единицу.
Проблема в том, что я никак не могу передать id заказа через нажатие кнопки. Изначально я пробовал работать с ней как с кнопкой, пытался использовать ActiveForm и прочее, однако ничего не вышло. Удалось вывести id заказа в Url, однако принять его в контроллере так и не смог. Буду благодарен любой помощи.
Код контроллера:
<?php

namespace frontend\controllers;

use yii\web\Controller;
use yii\data\Pagination;
use app\models\Orders;
use yii\helpers\Url;
use yii\web\Request;
class OrdersController extends Controller
{
    public function actionIndex()
    {
        $query = Orders::find();

        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);

        $orders = $query->orderBy('available')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('index', [
            'orders' => $orders,
            'pagination' => $pagination,
        ]);
    }
    public function actionTakeOrder() 
    {   $query = Orders::find();
        $request = Yii::$app->request;
        $get = $request->get(value);
        $query = orders::findOne($get);
        $Orders->available = 1;
        $customer->update();
    }
}

Код index.php
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;
use yii\bootstrap\ActiveForm;


$this->title = 'Поиск заказа';
?>
<h1>Доступные заказы</h1>
<ul>
<form action="OrdersController.php" method="post">
<table>
<?php foreach ($orders as $orders): ?>
<tr>
        <td><?= Html::encode("{$orders->header}") ?></td>
        <td><?= $orders->text ?></td>
        <td><?= $orders->size ?></td>
        <fieldset><td>
    	<?= Html::a('Принять', ['orders/index','value' => ($orders->id)], ['class'=>'btn btn-primary']) ;?>
    	</td>
    </fieldset>
    </tr>
<?php endforeach; ?>
</form>
</ul>
</table>
<?= LinkPager::widget(['pagination' => $pagination]) ?>

Код Orders.php (сгенерированый в Gii)
<?php

namespace app\models;

use Yii;

class Orders extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
        return 'orders';
    }

    public function rules()
    {
        return [
            [['user', 'header', 'text', 'size', 'available'], 'required'],
            [['user', 'size', 'available'], 'integer'],
            [['header'], 'string', 'max' => 60],
            [['text'], 'string', 'max' => 255]
        ];
    }


    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'user' => 'User',
            'header' => 'Header',
            'text' => 'Text',
            'size' => 'Size',
            'available' => 'Available',
        ];
    }
}
  • Вопрос задан
  • 877 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
1. У Вас за принятие заказа отвечает экшен TakeOrder а ссылка "принять" ведет на Index, сейчас так:
<?= Html::a('Принять', ['orders/index','value' => ($orders->id)], ['class'=>'btn btn-primary']) ;?>

а должно быть так
<?= Html::a('Принять', ['orders/take-order','value' => ($orders->id)], ['class'=>'btn btn-primary']) ;?>

2. Вы не верно обрабатываете параметр value из GET
сейчас:
$get = $request->get(value);
должно быть:
$get = $request->get('value');

P.S. гет параметры можно получать не обращаясь к объекту request, для этого достаточно объявить его в самом методе экшене, например так:
public function actionTakeOrder($value) {}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы