2012-08-13 60 views
3

我使用HTML::FormHandler與催化劑和我有這樣的領域:催化劑HTML :: formhandler通形式價值

has_field 'client_account_id' => (type => 'Select', options_method => 
\&options_account_id); 

我有3代表了與外鍵連接:

clients client_accounts login 
------- --------------- ----- 
id   client_id   client_account_id 

現在我想&options_account_id填充client_account_id字段與client_accounts只爲某些 client_id。這裏是我到目前爲止的方法:

sub options_account_id { 
    use my_app; 
    my $self = shift; 
    my @client_accounts = my_app->model('DB::ClientAccount')->search({ 
    'client_id' => $client_id}, 
    { 
     select => [ qw/id domain/ ],     ## SELECT 
    })->all; 

    my @options; 
    for(@client_accounts) { 
     push @options, { value => $_->id, label => $_->domain}; 
    } 
    return @options; 
} 

現在它不工作,因爲$ client_id變量不存在。我的問題是,有沒有辦法在創建新表單時以某種方式傳遞某個客戶端ID?還是有人知道有更好的方法來做到這一點?謝謝!

回答

4

提供的client_id的形式構造內部控制器:

has 'client_id' => (is => 'rw'); 

訪問這個屬性在你的方法:

sub options_account_id { 
my $self = shift; # self is client_account_id field so has no client_id method 
my $clientid = $self->form->client_id; # access parent to get client id 
} 
+0

太棒了!正是我在找的東西:) – srchulo 2013-01-17 19:27:51

0

如果您已經解決了這個問題,請分享您的解決方案嗎?到目前爲止,我可以找到這種方法:

將催化劑上下文傳遞給表單對象(儘管這應該避免每http://metacpan.org/pod/HTML::FormHandler::Manual::Catalyst#The-Catalyst-context),然後查詢傳遞的表單參數的上下文。表單本身會根據client_id動態地設置這些參數。

雖然這種方法混合了MVC,我不喜歡它。所以,如果你找到了更好的解決方案 - 請讓我知道。

ps:順便說一句,很高興看到奧斯汀的Catalyst開發者!

+0

我在窗體類MyApp::Form::MyFormPage

my $form = MyApp::Form::MyFormPage->new(client_id => $some_id); 

加屬性對不起,我從來沒有找到方法。但如果你這樣做,我會很感激一些幫助;) – srchulo 2012-11-08 07:49:27

+0

如果你沒有看到,現在有一個答案,@Pavel。 – srchulo 2013-01-27 04:41:26