Размышления на тему создания записей и показа форм

Духовность™

Продвинутый новичок
Размышления на тему создания записей и показа форм

Классическая форма добавления записи в базу выглядит примерно так:

Код:
Если POST
    Проверить данные
        Данные верны
            Записать их в базу
                Если ID существует
                    обновление
                Иначе
                    вставка
        Данные не верны
            подставить значения из POST в переменные формы

Если иначе GET
    Если есть ID записи 
        Выбрать записи, поместить их в переменные для подстановки в формы
    Иначе
        Инициализировать переменные с пустыми значениями

Показать форму
Проблема: создавать пустые переменные в программе, делать проверку на ID и в зависимости от ID делать UPDATE или INSERT.

Ситуация.

Допустим, у нас в системе зарегистрировался пользователь. Пользователь хочет добавить на сайт какие-то данные (резюме, например). Пользователь кликнет на ссылку "добавить резюме" и ему показывается форма. Никакой учетной записи его резюме не создано, в таблице резюме нет записи с его ID. Она появится только тогда, когда пользователь введёт правильно все данные и нажмет кнопку "сохранить".

Что придумалось.

Кликая по ссылке "создать резюме" автоматически создается пустая запись в БД ассоциирующаяся с этим пользователем и только после этого мы делаем referer на форму добавления резюме. Т.е. фактически резюме уже создано, ему присовин ID. Отличие лишь в том, что поля формы пустые, по дефолту.

Чем выгодно: алгоритм сценария резюме теперь выглядит так:

Код:
Если POST
    Проверить данные
        Данные верны
            Записать их в базу
        Данные не верны
            подставить значения из POST в переменные формы

Если иначе GET
        Выбрать записи, поместить их в переменные для подстановки в формы

Показать форму
как видно, количество действий сократилось. Теперь сценарий занимается только тем, что работает на UPDATE. "Никаких проверок" на существование ID резюме, никаких ветвлений. Для больших и сложных программ это очень позитивно, ИМХО.

Ваши мнения слушаю.
 

atv

Новичок
как видно, количество действий сократилось.
и добавилось другое
автоматически создается пустая запись в БД ассоциирующаяся с этим пользователем и только после этого мы делаем referer
при том, что бизнес логика может не позволять хранить в базе пустые значения
 

AmdY

Пью пиво
Команда форума
В модели нужно совместить выборку-создание
Model::getObject($id);

function getObject($id=null) {
if ($id) ...
else return new self();
}

плюс ещё можно совместить заполнение формы, приду с работы брошу кусок кода из своего велосипеда, если не забуду.
 

Духовность™

Продвинутый новичок
AmdY
В модели (точнее, в маппере) у меня сделан такой метод

PHP:
    /*
    * Создает новый пустой объект, значениями которого 
    * являются default-значения полей из БД.
    * Данный метод необходим при заполнении полей путой формы - 
    * значения по умолчанию в БД становтся значениями по умолчанию html-формы.
    * Предопределяемый метод.
    * 
    * @param void
    * @return object
    */
    public function createNew()
    {
        $object = new $this->model_class_name();

        $this->setAttributeForModel($object, $this->getDefaultFieldsValues());

        return $object;
    }
он создает объект и заполняет его свойства default-значениями из СУБД. Это как раз сделано для того, что бы получать объект при запросе пустой формы.

Но это всё равно очень геморойно всё.
 

dimagolov

Новичок
triumvirat, INSERT ... ON DUPLICATE KEYS очень хорошо помогает от разделения вставки и редактирования. только не совсем мне понятно что ты будешь как уникальный ключ использовать при создании резюме, но это детали. можно и NULL кидать в ID при вставке, не проблема.
 

dimagolov

Новичок
ну это если по одному на юзера. только надо все-равно как-то отделять тех, у кого резюме отсутствует
 

Духовность™

Продвинутый новичок
dimagolov
при создании ставить флаг=0. а уже при попытке сохранить форму смотреть, заполнены ли данные. если заполнены - ставить флаг в 1.
 

dimagolov

Новичок
triumvirat, цепляй флаг этот в запись пользователя и не парься тогда отдельной таблицей для резюме
 

x-yuri

Новичок
так а в чем проблема с этим флагом? Почему просто NULL в качестве первичного ключа не указывать или id существующей записи (если обновление)?
 
Сверху