Создание записей в модели на основании другой модели
Добрый день! Занимаюсь реализацией уже второго проекта на базе вашего фреймворка. Спасибо вам за отличный продукт.
Необходима помощь с реализацией такой задачи:
Есть сайт, в нём две модели — Forms и Calls. В первую попадают данные (фио, телефоны, e-mail) из форм на сайте — например, заказ обратного звонка. Во вторую попадают данные о входящих звонках на телефоны компании — номера телефонов, длительность звонков, источники звонков (данные поступают на внутреннее API сайта от виртуальной АТС).
Хотим сделать простейшую CRM прямо на базе фреймворка, поэтому необходимо сделать удобную возможность конвертации лидов из Forms и Calls в заказы (Orders). То есть работать это должно примерно так — пользователь заполняет форму на сайте (ФИО, телефон), система кладёт данные в таблицу Forms (это уже реализовано). Нужно чтобы в Forms напротив каждой записи была кнопка "Конвертировать в Заказ" или что-то подобная, по нажатию которой данные из Forms переносились бы в Orders. То есть реальные заявки менеджер конвертировал бы в заказы. Как это лучше реализовать?
Артём, добрый день!
Попробуйте сделать так:
1. Добавьте в модели Forms и Calls поле с типом bool. Название поля "Конвертировать в Заказ". В общей таблице записей оно выглядит как галочка или кружок на который можно кликнуть, а при редактировании как чекбокс, но нас больше интересуют его иконка в общей таблице. При нажатии на иконку будет меняться состояние этого поля.
2. Добавьте в модели Forms и Calls метод beforeUpdate, который описан тут
http://mv-framework.ru/nastroika-modeli/ в нем проверяйте, если раньше в поле уже было 1, а сейчас 0, то возвращаем для этого поля 1 принудительно и ничего не делаем.
3. Если же в beforeUpdate поле меняется с 0 на 1, то на основе $new_fields создавайте запись в модели Orders как описано тут http://mv-framework.ru/upravlenie-zapisiami/
Тут главное в п.2 избежать возможности повторного случайного создания заказа, для надежности можно например хранить в заказах id источника и перед созданием еще проверять на дубли.
Неплохая идея. Благодарю за подсказку. Обязательно отпишу по результату.
Получилось наполовину. If условие срабатывает, данные при update встают в 1, если там был 1. А вот как правильнее написать else? Пробовал играться с объектом класса Record, но вываливает кучу ошибок. Либо потому что я из модели Forms обращаюсь к модели Orders, либо не знаю. Можно попросить вас написать код, как наиболее верно сделать в else - beforeUpdate модели Forms сделать проверку наличия SID в Orders схожего с ID в Forms и при его отсутствии перенести данные из $new_fields['name'] в поле name в Orders. Надеюсь понятно объяснил. Просто принципиально не ясно где взять текущий ID (у меня почему-то $new_fields['id'] не высвятил, хотя поле в таблице есть) и как через объект Record (верно ли с ним работать вообще в этой ситуации?) добавить в таблицу другой модели запись. Не хотел бы решать вопрос через db -> query :-)
protected function beforeUpdate($id, $old_fields, $new_fields) { if($old_fields['order'] && !$new_fields['order']) { return array('order' => 1); } else { $this -> db -> query("INSERT INTO orders (name, phone, source, sid) VALUES ('".$new_fields['name']."','".$new_fields['phone']."','1','".$new_fields['id']."')"); вот тут надо иначе! через Record или как-то ещё } }
Артём, в целом направление правильное, есть такие моменты:
1. id текущей записи находится в beforeUpdate($id,
2. т.к. в orders складываются записи сразу из двух моделей, то поле enum с внешним ключом не подойдет, и для проверки уже созданных заявок в orders можно сделать поле sid типом char и класть туда значения вида forms-24 и calls-42, где число это id записи в родительской модели, sid можно даже сделать скрытым полем и его будет не видно
А код в else примерно такой
$orders = new Orders(); if(!$orders -> countRecords(array("sid" => "forms-".$id))) { $record = $orders -> getEmptyRecord(); $record -> sid = "forms-".$id; $record -> name = $new_fields["name"]; $record -> phone = $new_fields["phone"]; $record -> create(); }
Спасибо, попробую. Ещё вопрос — а можно как-то сделать в древидной модели, чтобы записи, которые имеют родителя имели совершенно другие поля? Например есть модель Orders, в ней показываем заказы пользователей. А при клике на Orders мы попадали в её ветку, где можно создать запись, но с полями отличными от родительской Orders. Пробовал делать группировку many to one, но это не очень удобно, так как приходиться выходить из модели. Хотелось бы в пределе одной модели реализовать.
Оффтоп:
У вас тут http://mv-framework.ru/gruppa-group/ внизу ссылка на localhost ведёт.
Артём, максимум, что можно сделать это построить связанное дерево, там к древовидной модели можно привязать еще одну. Обычно используется для каталогов с разделами и товарами.
http://mv-framework.ru/dereviya/