YII JS Выполнить деиствия контроллера

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

YII JS Выполнить деиствия контроллера

Сообщение iZacNT »

Доброго времени суток!

Ситуация такая:
Есть Таблица Products(id_pr, и тд....). Есть таблица Customfields (id, Id_pr_cf (Id из таблицы Products), id_cust_fields)
Задумка такая. Каждому Продукту добавлять сопутствующий товар, id которых храню в таблице Customfields.

Застрял в каком месте! При создании нового продукта, есть поле (внутри тегов Pjax) Вывожу товары для выбора, с кнопкой "Добавить в сопутсвующие". Как я мыслю, при нажатии на кнопку, вызывается Js в котором отправляется Post запрос к функции контроллера

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

public function actionInsert()
    {
        Yii::$app->db->createCommand()
            ->insert('customfields',
        ['id_pr_cf'=>$_POST['id_pr_cf'],
            'id_cust_pr_cf'=>$_POST['id_cust_pr_cf'],
            ])->execute();
        return "Yes";
}
Javascript:

function sentPost($id_pr){

var idField=document.getElementById("products-id_pr").value;
$.post('./customfields/insert', { id_pr_cf: $id_pr, id_cust_pr_cf : idField};
}

Если смотреть Дебаггер. Javascript Выполняется. $_POST['id_cust_pr_cf'] и $_POST['id_pr_cf'] передаются. Но запись не добавляется.

Подскажите. Как правильно обратиться к функции контроллера. Или я в принципе не правильно действую. И нужно менять логику.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: YII JS Выполнить деиствия контроллера

Сообщение unknownby »

iZacNT писал(а): 2020.09.02, 22:20 Доброго времени суток!

Ситуация такая:
Есть Таблица Products(id_pr, и тд....). Есть таблица Customfields (id, Id_pr_cf (Id из таблицы Products), id_cust_fields)
Задумка такая. Каждому Продукту добавлять сопутствующий товар, id которых храню в таблице Customfields.

Застрял в каком месте! При создании нового продукта, есть поле (внутри тегов Pjax) Вывожу товары для выбора, с кнопкой "Добавить в сопутсвующие". Как я мыслю, при нажатии на кнопку, вызывается Js в котором отправляется Post запрос к функции контроллера

Если смотреть Дебаггер. Javascript Выполняется. $_POST['id_cust_pr_cf'] и $_POST['id_pr_cf'] передаются. Но запись не добавляется.

Подскажите. Как правильно обратиться к функции контроллера. Или я в принципе не правильно действую. И нужно менять логику.
Так должно работать

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

public function actionInsert()
{
	$post = \Yii::$app->request->post();
	$cust = new Customfields([
                'id_pr_cf' => $post['id_pr_cf'],
                'id_cust_pr_cf' => $post['id_cust_pr_cf'],
	]);
	$cust->save(false);

	return true;
}
Вопрос в том, зачем делать insert внутри контроллера Customfields, когда вы выполняете команду для таблицы Products. Логично было бы изменить actionInsert на actionTakeWithThis ("с этим берут") и выполнять его из контроллера Products. В момент нажатия мы ведь находимся в продуктах, а не сопутствующих, то зачем далеко лезть :)
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: YII JS Выполнить деиствия контроллера

Сообщение iZacNT »

Далеко так, потому что, я пробовал делать разными способами. создавл CRUD через GII. И пробовал обращаться к функции actionCreate. Создавал свои акшены actionInsert. Ни то, ни то не заработало. Предложенный Вами вариант тоже. Перенес его в Products. Вроде не совсем дурак. Но застрял.
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: YII JS Выполнить деиствия контроллера

Сообщение skynin »

ну смотрите

-- Ситуация такая:
-- Есть Таблица Products(id_pr, и тд....).
"нет такой таблицы". Должна быть AR

-- Есть таблица Customfields
"нет такой таблицы". Должна быть AR

-- (Id из таблицы Products), id_cust_fields)
В AR должна быть описана связь.
Как положено в идеологии Yii;

-- Задумка такая. Каждому Продукту добавлять сопутствующий товар,
Когда, как и по какому условию?

-- id которых храню в таблице Customfields.
За работу с данными в Yii отвечают AR. Модели.

И под их работу все остальное заточено.

Если вы мыслите таблицами - то и пишите чистым SQL
Если вы взяли фреймворк с такой-то идеологией - то осваивайте ее, а не пытайтесь и дальше "хранить в таблицах"

-- Вроде не совсем дурак. Но застрял.
Частое дело. Когда фреймворк не понят.

-- я пробовал делать разными способами. создавл CRUD через GII
-- И пробовал обращаться к функции actionCreate.
Не надо "пробовать". Надо разобраться как фреймворк ожидает что его будут применять.

Выделите время на пользу - медленно, спокойно прочтите Yii guide.
И добивайтесь чтобы ваш код был похож на тот что в нем,

А не кошмар этот:
Yii::$app->db->createCommand()->insert('customfields',
['id_pr_cf'=>$_POST['id_pr_cf'], 'id_cust_pr_cf'=>$_POST['id_cust_pr_cf'],])->execute();

Так можно конечно, просто такой код показателен что вы не знаете средств фреймворка.

Теперь к задаче, еще раз
-- Задумка такая. Каждому Продукту добавлять сопутствующий товар
Простая задумка.

действие контроллера принимает запрос
в нем
ищется Продукт
ищется СопутствующийТовар
если нашлись оба,
тогда
продукт->добавитьСопутствующийТовар(сопутствующийТовар);
продукт->сохранить(); // хотя может и не нужно будет, зависит от реализации добавитьСопутствующийТовар

То есть, записываете свою задумку как она звучит
Потом кодом, с пустой реализацией
Потом углубляетесь в реализацию
И там уже, может быть будут таблицы.

А если у вас и задумка о сопутствующих товарах и таблицах сразу в уме, то это примерно как пытаться вот написать комментарий, только HTMLом, в дебаг панели браузера.

1. Записываете русским языком, "тех задание для другого программиста"
2. По этому тех заданию пишете код в терминах классов и объектов
3. Потом пишите реализацию того, чего не хватает у этих классов и объектов.

И не будет застревания. Оно обычно на элементарных вещах - потому что в голове порядка нету :) А байты, стили CSS вместе со скидкой на товары.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Ответить