@Anarmus

Yii2. Pajax в GridView обновляет все строки, что делать?

Всем привет! С Yii2 знаком от силы дней 5.

Есть следующий код во вьюшке:
<?php Pjax::begin(); ?>
<?=
	GridView::widget([
        'dataProvider' => $products,
		'tableOptions' => [
			'class' => 'table table-striped table-bordered category-table'
		],
		'columns' => [
//....
			[
				'label' => 'Добавить',
				'format' => 'raw',
				'value' => function($data) use (&$result) {
					$cat = $data->attributes['Category'];
					$id = $data->attributes['ID'];
						if (!$result) {
							return Html::beginForm(['/site/category?name='.$cat],'post',['id'=>'add-prod-'.$id,'data-pjax'=>'0','class'=>'favorites-form']) . Html::hiddenInput('productID', $id) . Html::submitButton('Добавить', ['class' => 'mps button add-to-favorites']) . Html::endForm();
						}
						elseif ($result === 'Добавлено') {
							return '<p class="added">'.$result.'</p>';
						}
						elseif($result === 'Ошибка') {
							return '<p class="non-added"><a href="/site/category?name='.$cat.'">'.$result.'</a></p>';
						}
				}
			],
		],
    ]); ?>
<?php Pjax::end(); ?>


И в контроллере примерно следующее:
public function actionCategory($name)
{
	$products = Category::getCatProv($name);
	$result = '';
	if(isset($_POST['productID'])) {
		$getProduct = GetProduct::getProd(Yii::$app->request->post('productID'));
		$result = 'Ошибка';
	}
	else {
		$getProduct = '';
	}
	$userID = Yii::$app->user->id;
	if($getProduct && $userID) {
		$model = new AddFavorites();
//...
		if( $model->save() ) {
			$result = 'Добавлено';
		}
	}
	return $this->render('category',['products'=>$products,'result'=>$result]);
}


Что не так. При нажатии на кнопку "Добавить", форма отправляет в контролер ID товара и он добавляет его в базу, соответственно по замыслу , если запись произошла, то возвращается $result = 'Добавлено' и вместо кнопки отображается текст "Добавлено". Проблема в том, что при нажатии на кнопку добавить, в гриде у всех строк исчезает кнопка и появляется надпись "Добавлено". Кто-нибудь подскажет решение или ткнёт в ошибку?
  • Вопрос задан
  • 225 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Anarmus Автор вопроса
В общем, запилил пока заплатку. В контролер добавил $result_id вот так:
$result_id = '';
  if(isset($_POST['productID'])) {
    $getProduct = GetProduct::getProd(Yii::$app->request->post('productID'));
    $result_id = Yii::$app->request->post('productID');
    $result = 'Ошибка';
  }


И во вьюшке:
'value' => function($data) use (&$result, &$result_id) {
        $cat = $data->attributes['Category'];
        $id = $data->attributes['ID'];
        $form = Html::beginForm(['/site/category?name='.$cat],'post',['data-pjax'=>'0','class'=>'favorites-form']) . Html::hiddenInput('productID', $id) . Html::submitButton('Добавить', ['class' => 'mps button add-to-favorites']) . Html::endForm();
        if (!$result) {
            return $form;
        }
        elseif (($result === 'Добавлено') && ($result_id == $id)) {
            return '<p class="added"><a href="/site/category?name='.$cat.'">'.$result.'</a></p>';
        }
        elseif(($result === 'Ошибка') && ($result_id == $id)) {
            return '<p class="non-added"><a href="/site/category?name='.$cat.'">'.$result.	'</a></p>';
        }
        else {
            return $form;
        }
    }


Смотреть конечно тошно, но кое-как свою работу выполняет.
Как сделать, чтобы паякс выполнялся только из вызванной ячейки я так и не нашёл. Если кто знает как это должно работать и выглядеть, будут бесконечно благодарен.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы