-2
在Catalyst中使用HTML :: Formhandler我定义了基于数据库表(item_class)的表单。表单所做的是根据数据库中几个表格的内容(不同于表格所基于的表格)设置前三个选择列表。它看起来像选择列表都获得(html)正确的选项。然而,在提交时,我总是得到错误:'...'不仅仅是字段的有效值:prg_id和mrk_id。HTML :: Formhandler错误:'...'不是有效值
我的错误是什么?任何帮助是极大的赞赏。
我的表单定义:
package BskExt::Form::HMbestellingProducten;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
with 'HTML::FormHandler::Render::Table';
use namespace::autoclean;
has 'wpl_id' => (is => 'rw');
has '+item_class' => (default => 'NewHmbestellingenproducten');
has_field 'wklloc_id' => (type => 'Select', label => 'Winkel(locatie)s');
#has_field 'prg_id' => (type => 'Select', label => 'Productgroep', label_column => 'naam', accessor => 'prg');
has_field 'prg_id' => (type => 'Select', label => 'Productgroep', error_messages => { select_invalid_value => undef });
#has_field 'mrk_id' => (type => 'Select', label => 'Merk', label_column => 'naam', accessor => 'mrk');
has_field 'mrk_id' => (type => 'Select', label => 'Merk');
has_field 'productnaam' => (type => 'Text', label => 'Product *', size => 32, maxlength => 40, required => 1, messages => { required => 'Verplicht' }, validate_method => \&CatFormFieldValidate::validate_name_ext);
has_field ' ' => (type => 'Submit', id => 'submit', value => 'Ga door');
#
# The select list for wklloc_id is set by options_wklloc_id which has been omitted from
# this listing as it made the listing (much) too long
#
sub options_mrk_id
{
my ($self) = shift;
my (@mrk_select_list);
undef(@mrk_select_list);
push @mrk_select_list, { value => '', label => 'Kies eerst een productgroep' };
return @mrk_select_list;
}
sub options_prg_id
{
my ($self) = shift;
my (@prg_select_list);
undef(@prg_select_list);
push @prg_select_list, { value => '', label => 'Kies eerst een winkel(-locatie)' };
return @prg_select_list;
}
我的表单模板:
<script>
$(function() {
$("#wklloc_id").click(function() {
$("#prg_id").load("WinkelLocatieProductgroepen?wklloc_id=" + $("#wklloc_id").val());
});
});
$(function() {
$("#prg_id").click(function() {
$("#mrk_id").load("ProductgroepMerken?wklloc_id=" + $("#wklloc_id").val() + "&prg_id=" + $("#prg_id").val());
});
});
</script>
<p></p>
[%# Render the HTML::FormHandler Form %]
[% form.render %]
(的显著部分)我的控制器:
sub create : Chained('base') PathPart('create') Args(0) {
my ($self, $c) = @_;
my $hmbestprod = $c->model('DB::NewHmbestellingenproducten')->new_result({});
return $self->form($c, $hmbestprod,'new');
}
sub form
{
my ($self, $c, $hmbestprod, $action) = @_;
my ($form,$klant_info,$uc_action);
$uc_action = uc($action);
$klant_info = $c->model('BskExt')->KlantInfo($c->session->{"klt_id"}||0);
$form = BskExt::Form::HMbestellingProducten->new(wpl_id => $$klant_info{"wpl_id"});
# Set the template
$c->stash(template => 'hmbestellingproducten/form.tt2', action => $uc_action, form => $form);
$form->process(
use_init_obj_over_item => 1,
item => $hmbestprod,
init_object => { "aantal" => 1 },
params => $c->req->params);
return unless $form->validated;
# Set a status message for the user & return to list
$c->response->redirect($c->uri_for($self->action_for('list')));
}
#
# This helps jQuery to set the content of the ProductgroepMerken form list
#
sub ProductgroepMerken :Chained('base') :PathPart('ProductgroepMerken') :Args(0)
{
my ($self, $c) = @_;
my ($optstr,$prg_id,$productgroepmerken,$wklloc_id);
$c->log->debug("ProductgroepMerken\n");
$prg_id = $c->request->params->{"prg_id"};
$wklloc_id = $c->request->params->{"wklloc_id"};
#
# The result: $productgroepmerken contains (at first glance) valid values. These values are not in any way (directly)
# related to the FORM item_class 'NewHmbestellingenproducten'
#
$productgroepmerken = $c->model ('BskExt')->ProductgroepMerken($wklloc_id,$prg_id);
undef($optstr);
foreach (@$productgroepmerken)
{
$optstr .= '<option value="'.$_->{"id"}.'">'.$_->{"naam"}.'</option>';
}
$c->log->debug("optstr= $optstr\n");
$c->response->body($optstr);
}
#
# This helps jQuery to set the content of the WinkelLocatieProductgroepen form select list
#
sub WinkelLocatieProductgroepen :Chained('base') :PathPart('WinkelLocatieProductgroepen') :Args(0)
{
my ($self, $c) = @_;
my ($optstr,$productgroepen,$wklloc_id);
$c->log->debug("WinkelLocatieProductgroepen\n");
$wklloc_id = $c->request->params->{"wklloc_id"};
#
# The result: $productgroepen contains (at first glance) valid values. These values are not in any way (directly)
# related to the FORM item_class 'NewHmbestellingenproducten'
#
$productgroepen = $c->model ('BskExt')->WinkelLocatieProductgroepen($wklloc_id);
$c->log->debug("productgroepen= \n".Dumper($productgroepen)."\n\n");
undef($optstr);
foreach (@$productgroepen)
{
$optstr .= '<option value="'.$_->{"id"}.'">'.$_->{"naam"}.'</option>';
}
$c->log->debug("optstr= $optstr\n");
$c->response->body($optstr);
}
您可以缩小问题范围并隔离导致问题的脚本的特定部分吗?我和其他人可能会被这里发布的大量代码推迟。 – 2014-10-02 07:59:30
对不起。我认为这可能有助于展示问题的背景。我将删除多余的代码。我的问题与我能够说出的一样精确/精确。 – 2014-10-02 13:24:16
当这些选择字段的选项与表单的结果集集合中的(选择)字段的字段(定义)不直接相关时,它看起来像使用HTML :: Formhandler选择字段是不可能的根据。 然而,当模板中提供表单的html时,完全可以做到完全相同的事情。 在我看来,这是一个遗憾,因为它迫使人们放弃HTML :: Formhandler字段/表单验证的好功能以及随之而来的统一用户界面。没有(好)的方法来做到这一点? – 2014-10-03 21:33:18