Расширенная настройка форм CRUD и контроллеров в Play - PullRequest
6 голосов
/ 31 декабря 2011

Что мне нужно, так это возможность быстро (СУХОЙ!) Создавать формы для заданных моделей, но менее контролируемым образом, чем при использовании форм / моделей CRUD; например, благодаря возможности использовать теги crud без полных контроллеров / маршрутов crud или путем их строгой настройки.

Позвольте мне объяснить на примере.

У меня есть модель A, чем ссылки (ManyToOne) на 2 модели, B и C

class public A extends Model {
    public String name;
    @ManyToOne
    public A a;
    @ManyToOne
    public B b;
}

Я бы хотел написать следующие маршруты:

/A/{id}/B/               somecontroller
/A/{id}/C/               some(other?)controller

или даже лучше:

/A/{id}/{submodel}/      somecontroller

И в соответствующем HTML-представлении можно сделать что-то вроде:

<div>object.name</div>

#{form action:@save(object.b._key()), enctype:'multipart/form-data'}
    #{crud.form object.b /}
    <p class="crudButtons">
        <input type="submit" name="_save" value="&{'crud.save', type.modelName}" />
        <input type="submit" name="_saveAndContinue" value="&{'crud.saveAndContinue', type.modelName}" />
    </p>
#{/form}

Где 'object' - это не экземпляр "b" или "c", а "a", и я могу сказать #{crud.form /}, какую модель он должен отобразить (в данном случае, 'b')

Есть ли способ добиться чего-то подобного?

Вопрос можно решить либо:

  • есть ли простой #{form MODEL} #{/form} тег?!

или, будучи в состоянии как-то настроить больше CRUD, например.

  • есть ли способ изменить основной модуль crud и переопределить только нужные методы (не копируя все это!)?

Боюсь, я не смогу достичь этой цели, просто переопределив модель CRUD-контроллера, возможно, я ошибаюсь, но помимо чтения кода CRUD (который я делаю), официальный документ немного ограничен в том, какие методы можно переопределить и как ...

Похожие: как создать html-форму для модели в игровой рамке

Я также только что нашел эту ветку gmail , которая, кажется, идет в направлении настройки. Я надеялся на более готовое решение для такой типичной потребности ...

1 Ответ

10 голосов
/ 02 января 2012

Я нашел в этой игре! ветка гугл группы ответ, который я искал .. все уже есть, хотя и без документов!

Это так же просто, как использовать:

для отображения формы создания класса Model.

#{crud.form class:'models.ModelName' /} 

для отображения формы издания любого существующего экземпляра

#{curd.form object:anyInstance /} 

Тогда вы можете идти как хотите, но это мой шаблон для редактирования существующих объектов:

В вашем шаблоне

#{form @Controller.Action, method="POST" ... }

<input type="hidden" name="object.id" value="${myobject.ID}" />
#{crud.form object:gun.gunEngraving}
#{/crud.form}
<p>
<input type="submit" value="Save Changes" />
</p>
#{/form}

скрытый ввод устанавливает специальное поле "id" так, чтобы:

В вашем контроллере. Действие

function static void Action(routeParams, MyModel object) {
    some validation;
    object.save();
    render or renderTemplate or other action for redirect;
}

Это, конечно, упрощенный код, но мне действительно нравится этот шаблон, когда мне нужно быстро внедрить форму в представление и я не могу / не хочу использовать всю систему CRUD!

[Редактировать] Более продвинутый пользовательский CRUD совершенство

Тегам crud на самом деле не нужен модуль crud. Настолько, что в итоге я скопировал их все в свой проект, взломав их, чтобы добавить дополнительные интересные функции, такие как возможность изменить имя объекта в форме по умолчанию «объект» (я решил переопределить оригиналы, но Вы можете создать свой собственный, просто используя папку, отличную от tags/crud для пространства имен)

...