-2

在 Catalyst 中使用 HTML::Formhandler 我定义了一个基于数据库表 (item_class) 的表单。表单所做的是根据数据库中几个表(表单所基于的表除外)的内容设置前三个选择列表。看起来选择列出了所有获取(html)正确的选项。但是,在提交时,我总是会收到错误:“...”不是仅适用于字段的有效值:prg_id 和 mrk_id。

我的错误是什么?任何帮助是极大的赞赏。

我的表单定义:

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);
}
4

1 回答 1

0

选择字段根据字段的选项进行验证。不要将 '' 空选择放在字段选项中,而是使用 'empty_select' 字段属性设置它们:empty_select => 'some option label'。如果选择选项应该从数据库中自动生成,则需要使用关系名称,而不是列名称。

于 2014-10-22T20:08:03.477 回答