Grails - 使用调用创建预订的客户记录名称自动填充字段
Grails - auto populate field with customer record name that called create reservation
我正在使用 Grails 构建预订系统。
我有一个预订 Class 和一个客户 Class。存在一对(客户)对多(预订)的关系。我想确保只能在客户展示视图中进行新预订,因此我编辑了视图,使其成为您可以创建新预订的唯一位置。
这有效,创建预订表单也适用于客户和产品的下拉列表 select。我可以通过这种方式进行预订,但我必须选择客户 - 我希望客户字段自动填充我点击新预订按钮时的客户姓名。
目前在我的_form.gsp中(由预订create.gsp使用)我有下面这行给我上述select函数
<g:select id="customer" name="customer.id" from="${net.kanootours.Customer.list()}" optionKey="id" required="" value="${reservationInstance?.customer?.id}" class="many-to-one"/>
我认为部分:value="${reservationInstance?.customer?.id}" 会将字段设置为当前客户的值,但事实并非如此(该字段仅填充了第一个客户名称).
如何获取我从中调用新预订的客户记录的名称以填充到客户字段中?如果不是 g:select?
,在这种情况下应该使用的正确标签是什么?
对于最终结果,我只需要新预订中的客户名称,不需要将该名称更改为另一个名称的能力。
我曾尝试使用 g:field 和 g:fieldValue,但也无法使它们正常工作。
我还想到了将客户 ID 作为参数从调用中发送的可能性 g:link - 但我不确定如何处理它。
更新/解决方案:
下面的 Greggs 评论帮助我找到了解决方案以及 GRAILS 2:快速入门指南一书,Chpater "Forum Messages and UI Tricks"。
为了让它工作,我添加了以下内容:
预订中 _form.gsp :
<g:hiddenField name="customer.id" value="${customerInstance?.customer?.id}" />
<g:hiddenField name="customer.firstName" value="${customerInstance?.customer?.firstName}" />
<g:hiddenField name="customer.lastName" value="${customerInstance?.customer?.lastName}" />
N.B - I did not need all three - just the ID , but I used this for a better display title on the Reservation Create page.
我将我的客户展示页面(新预订 Link)中的 link 更改为:
<li><g:link controller="reservation" class="create" action="create"
params='["customer.id":"${customerInstance?.id}","customer.firstName":"${customerInstance?.firstName}","customer.lastName":"${customerInstance?.lastName}"]'>New Reservation</g:link></li>
这是我遇到最多问题的部分,因为 customer.id 部分在我尝试将其放入参数的每种格式中都抛出了很多错误。这是这本书帮助我的地方,它指出它需要用“”括起来,因为它有一个'。'在参数中。一旦我发现了这一点,我就可以解决任何其他问题
我也添加到预订创建视图:
<h1><g:message code="default.create.label" args="[entityName]" /> for ${reservationInstance?.customer?.firstName} ${reservationInstance?.customer?.lastName} ID: ${reservationInstance?.customer?.id}</h1>
我将其用作测试以确保正确传递参数。然后我可以努力确保 customer.id 字段被正确发送到控制器中的创建操作。
为此我使用了
<g:field type="text" name="customer.id"value="${reservationInstance?.customer?.id}" readonly="readonly"/>
我在这里做了一些猜测,因为我没有完全理解你的问题。所以我的假设是您在客户屏幕上,您想要单击新预订按钮并让客户已经关联到所述预订。如果这是真的,那么以下内容应该会让您朝着正确的方向前进。
在客户表格上:
<g:link controller="reservation" action="create" params="[customer.id: customer.id]">Create Reservation</g:link>
注册控制器
def create() {
// params.customer.id will auto populate in this reservation instance
def reservation = new Reservation(params)
...
}
报名表:
<g:hiddenField name="customer.id" value="${reservation.customer.id" />
Customer Name: ${reservation.customer.name}
在上面的代码中,Customer 将在 Reservation 对象中可用。然后,将 customer.id
存储为隐藏字段,这样当您将此预订提交给 RegistrationController.save()
操作时,它会再次使用正确的客户 ID 自动填充预订。如果您需要在 Reservation 中存储一些关于 Customer 的不同信息,同样的技术也适用。你只需要通过所有请求继续传递它。
我正在使用 Grails 构建预订系统。
我有一个预订 Class 和一个客户 Class。存在一对(客户)对多(预订)的关系。我想确保只能在客户展示视图中进行新预订,因此我编辑了视图,使其成为您可以创建新预订的唯一位置。
这有效,创建预订表单也适用于客户和产品的下拉列表 select。我可以通过这种方式进行预订,但我必须选择客户 - 我希望客户字段自动填充我点击新预订按钮时的客户姓名。
目前在我的_form.gsp中(由预订create.gsp使用)我有下面这行给我上述select函数
<g:select id="customer" name="customer.id" from="${net.kanootours.Customer.list()}" optionKey="id" required="" value="${reservationInstance?.customer?.id}" class="many-to-one"/>
我认为部分:value="${reservationInstance?.customer?.id}" 会将字段设置为当前客户的值,但事实并非如此(该字段仅填充了第一个客户名称).
如何获取我从中调用新预订的客户记录的名称以填充到客户字段中?如果不是 g:select?
,在这种情况下应该使用的正确标签是什么?对于最终结果,我只需要新预订中的客户名称,不需要将该名称更改为另一个名称的能力。
我曾尝试使用 g:field 和 g:fieldValue,但也无法使它们正常工作。
我还想到了将客户 ID 作为参数从调用中发送的可能性 g:link - 但我不确定如何处理它。
更新/解决方案:
下面的 Greggs 评论帮助我找到了解决方案以及 GRAILS 2:快速入门指南一书,Chpater "Forum Messages and UI Tricks"。
为了让它工作,我添加了以下内容:
预订中 _form.gsp :
<g:hiddenField name="customer.id" value="${customerInstance?.customer?.id}" />
<g:hiddenField name="customer.firstName" value="${customerInstance?.customer?.firstName}" />
<g:hiddenField name="customer.lastName" value="${customerInstance?.customer?.lastName}" />
N.B - I did not need all three - just the ID , but I used this for a better display title on the Reservation Create page.
我将我的客户展示页面(新预订 Link)中的 link 更改为:
<li><g:link controller="reservation" class="create" action="create"
params='["customer.id":"${customerInstance?.id}","customer.firstName":"${customerInstance?.firstName}","customer.lastName":"${customerInstance?.lastName}"]'>New Reservation</g:link></li>
这是我遇到最多问题的部分,因为 customer.id 部分在我尝试将其放入参数的每种格式中都抛出了很多错误。这是这本书帮助我的地方,它指出它需要用“”括起来,因为它有一个'。'在参数中。一旦我发现了这一点,我就可以解决任何其他问题
我也添加到预订创建视图:
<h1><g:message code="default.create.label" args="[entityName]" /> for ${reservationInstance?.customer?.firstName} ${reservationInstance?.customer?.lastName} ID: ${reservationInstance?.customer?.id}</h1>
我将其用作测试以确保正确传递参数。然后我可以努力确保 customer.id 字段被正确发送到控制器中的创建操作。
为此我使用了
<g:field type="text" name="customer.id"value="${reservationInstance?.customer?.id}" readonly="readonly"/>
我在这里做了一些猜测,因为我没有完全理解你的问题。所以我的假设是您在客户屏幕上,您想要单击新预订按钮并让客户已经关联到所述预订。如果这是真的,那么以下内容应该会让您朝着正确的方向前进。
在客户表格上:
<g:link controller="reservation" action="create" params="[customer.id: customer.id]">Create Reservation</g:link>
注册控制器
def create() {
// params.customer.id will auto populate in this reservation instance
def reservation = new Reservation(params)
...
}
报名表:
<g:hiddenField name="customer.id" value="${reservation.customer.id" />
Customer Name: ${reservation.customer.name}
在上面的代码中,Customer 将在 Reservation 对象中可用。然后,将 customer.id
存储为隐藏字段,这样当您将此预订提交给 RegistrationController.save()
操作时,它会再次使用正确的客户 ID 自动填充预订。如果您需要在 Reservation 中存储一些关于 Customer 的不同信息,同样的技术也适用。你只需要通过所有请求继续传递它。