Perrin Harkins wrote:
> Hi,
>
> I have some data which Id like to share between components. I'm
> fetching things from the database in a MasonX::WebApp class and then
> displaying it in my Mason templates. However, I'm including other
> components, and the included components need access to the data too.
> This results in me having to do pass it everywhere: <& foo.html, %ARGS
> %>.
>
> This seems like a poor solution. Is there an obvious way to deal with
> this? Maybe stuffing the data in $m->notes instead of %ARGS? It
> seems a little odd to put all my data there, but it might be less
> awkward.
>
I'm not sure if this is a bug or a feature but this works for me under
HTML::Mason 1.26:
1. Create stash.comp that has mutator ..getset which accesses a %Stash
variable created in the <%shared> block.
2. parent.comp calls stash.comp to get an object instance and calls
.set_data to store things
3. parent.comp then calls child.comp.
4. child.comp calls stash.comp to get an object instance and calls .get_data
Here is a minimal example:
__stash.comp__
<%shared>
my %Stash;
my $self = $m->base_comp;
</%shared>
<%init>
return $self;
</%init>
<%method .getset>
<%init>
my ($field, $value) = @_;
die "Cannot continue without field parameter"
unless defined $field;
$Stash{$field} = $value if @_ > 1;
return $Stash{$field};
</%init>
</%method>
__caller.comp__
<%init>
my $stash = $m->comp("stash.comp");
$stash->call_method('.getset', title => 'Test Page' );
</%init>
The title is:
[<% $stash->call_method('.getset', 'title') %>]<br>
test-stash-inner thinks the title is:
[<& 'test-stash-inner.comp' &>]<br>
Calling the method without an instance returns:
[<% $m->comp('stash.comp:.getset', 'title') %>]<br>
__test-stash-inner.comp__
% my $stash = $m->comp("stash.comp");
<% $stash->call_method('.getset', 'title') %>
__output__
The title is: [Test Page]
test-stash-inner thinks the title is: [Test Page ]
Calling the method without an instance returns: [Test Page]
Apparently items stored in the shared block are shared even when called
from other components. It's almost as if the shared block is a
singleton that persists for the duration of the request.
-- BenRifkah
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Mason-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mason-users