0

テーブルをレンダリングするためにいくつかのdbレコードを隠しておく必要がある1つのコントローラーにアクションがあります。

2番目のコントローラーに非常によく似たテーブルを埋めるアクションがあるため、それ自体のスタッシュ内のデータは、最初のコントローラーに必要なものと同じです。

両方のコントローラーで大量のコードを複製せずに、一方のアクションを使用してもう一方の隠し場所を埋める方法はありますか?

編集: コードリクエストに応じて(多少簡略化されていますが、要点を理解する必要があります):

Contoller::ShoppingCartで

sub data : Chained('base') PathPart('') CaptureArgs(0) {
my ( $self, $c ) = @_;

my $query = DBRESULTS;
    my $count = 20;

$c->stash(
    data         => $items,
    dataRowCount => scalar @$items,
    totalCount   => $count,
    pageSize     => $pageSize,
);
}

Controller::Vendorで

sub viewform : Chained('row') Args(1) {
    my ( $self, $c, $view ) = @_;

    $c->stash(
        template => 'simpleItem.mas',
        view => $view,
    );
}

simpleItem.masテンプレートにはdata、dataRowCount、totalCount、pageSizeが必要なので、Controller :: ShoppingCart::pageDataからスタッシュを取得するのが理想的です。

4

2 に答える 2

1

$c->forward()必要な特定のアクションに簡単にアクセスできるはずです。

sub viewform : Chained('row') Args(1) {
    my ( $self, $c, $view ) = @_;

    $c->forward('Controller::ShoppingCart', 'data', [ @optional_args ]);

    $c->stash(
        template => 'simpleItem.mas',
        view => $view,
    );
}

forward()、 、detach()、の兄弟を含むgo()すべての悲惨な詳細visit()

于 2013-01-31T02:53:31.293 に答える
0

Root.pmこれらの db レコードを取得してそれらを隠し場所に入れる、たとえば in などの別の関数から両方のアクションを連鎖させることができます。

すなわち:

# in Root.pm
sub get_db_stuff :Path('') :Args(0) {
    my ( $self, $c ) = @_;

    #store stuff in stash
    $c->stash->{db} = #get db records
}

次に、アクションがある他のコントローラーで、次の2つの関数が必要になります。

sub base : Chained('/get_db_stuff') PathPrefix CaptureArgs(0) {}

sub use_db_stuff : Chained('base') PathPart Args(0) {
    my ( $self, $c ) = @_; 

    #db records now accessible through $c->stash->{db}
}
于 2013-01-30T05:55:06.247 に答える