[Catalyst] More progress... Now dealing with form processing, and handling input data... seems to disappear before hitting the method

Joe Landman landman at scalableinformatics.com
Wed Dec 28 19:07:47 CET 2005


Following Andreas' advice, the dump of the all now displays!

What I did is add (to the main application module)

	sub end : Private {
	    my ( $self, $c ) = @_;
	    $c->forward('test::View::Mason');
	}

Good.  Now modify the list method in the test::Controller::db.pm

	sub list : Local {
	  use Data::Dumper;
	  my ( $self, $c ) = @_;
	  my (@all);
	  @all = test::Model::Database::Testing->search();
	  $c->stash->{stuff}=Dumper(@all);
	  push @{$c->stash->{data}}, at all;
	  $c->stash->{template}="test.html";
	  $c->forward( 'test::View::Mason');
	}

so that $c->stash->{data} has the stuff I want to display in the view, 
and then modify the view so that it does something with the incoming 
data ...

	<%args>
	 $stuff	=> undef
	 $data  => undef
	</%args>
	% use Data::Dumper;
	% my ($k,$string,$dump,$maxid);
	% $dump = Dumper($data);
	% $maxid=-10;
	in Test.html: Dumping....<br />
	<hr />
	<pre>
	 <% $stuff %>
	</pre>
	<hr />
	<!-- Dump of data = <% $dump %> -->
	<pre>
	% foreach (@{$data})
	%  {
	%    $string = undef;
	%    if ($maxid < $_->{_column_data}->{id}) { $maxid = 
$_->{_column_data}->{id}; }
	%    foreach $k (keys %{$_->{_column_data}})
	%      {
	%	 $string .= sprintf "| %s ",$_->{_column_data}->{$k};
	%      }
	  <% $string %>
	%  }
	</pre>

and we get (ignoring the dump)

	  | a | 1 | b
	  | c | 2 | d
	  | d | 3 | e

which is exactly what I wanted.

Great!

So to mix it up, now I want to add a tiny form at the end of this to add 
another row to the database.  So I appended

	<form action="add" method="post">
	 Name: <input type="text" name="name" value="" size=40 /> <br />
	 Size: <input type="text" name="size" value="" size=40 /> <br />
	 ID: <input type="text" name="id" value="<% $maxid+1 %>"   size=40 /> 
<br />
	 <input type="submit" value="submit">
	</form>

to the test.html, and created an add method in test::Controller::db.pm

	sub add : Local {
	  my ( $self, $c ) = @_;
	  my (@all,%all2);
	  %all2 =$c->parameters;
	  $c->stash->{stuff}=Dumper(\%all2);
	  $c->stash->{template}="test.html";
	  $c->forward( 'test::View::Mason');
	}

The idea is that $c->{parameters} is a hash of the incoming posted 
parameters.

Unfortunately, it seems to get lost somewhere.  I see it in the debug 
messages on the console


	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] 
**********************************
	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] * Request 1 (0.250/s) [26826]
	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] 
**********************************
	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] Body Parameters are:
	.---------------------------------------+--------------------------------------.
	| Key                                   | Value 
         |
	+---------------------------------------+--------------------------------------+
	| id                                    | 4 
         |
	| name                                  | asdasdasd 
         |
	| size                                  | asdasdasda 
         |
	'---------------------------------------+--------------------------------------'

	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] "POST" request for 
"db/add" from "192.168.1.32"
	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] Path is "db/add"
	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] Rendering component 
"/test.html"
	[Wed Dec 28 15:29:37 2005] [catalyst] [debug] Rendering component 
"/test.html"
	[Wed Dec 28 15:29:37 2005] [catalyst] [info] Request took 0.018545s 
(53.923/s)
	.------------------------------------------------------------------+-----------.
	| Action                                                           | 
Time      |
	+------------------------------------------------------------------+-----------+
	| -> test::View::Mason->process                                    | 
0.002368s |
	| /db/add                                                          | 
0.002898s |
	| -> test::View::Mason->process                                    | 
0.000978s |
	| /end                                                             | 
0.001180s |
	'------------------------------------------------------------------+-----------'


but it does not show up in the method call.  Is there some magic I need 
to do here?   I will look back over the Agave and other examples. 
Somewhat confused here.  Is there any way to force the debug screen even 
on successful calls?

Joe


Andreas Marienborg wrote:
> I saw your other post, but figured I would comment some bits :)
> 
> 
> On 28. des. 2005, at 07.46, Joe Landman wrote:
> 
>> I added a simple global list method to the db controller
>>
>>     sub list : Global {
>>         use Data::Dumper;
>>         my ( $self, $c ) = @_;
>>           my (@all);
>>           @all = test::Model::Database::Testing->search();
>>           $c->forward( 'test::View::Mason');
> 
> put this in the 'sub end : Private { } of your base application, so  you 
> dont have to do it for each controller you write :P This also  ensures 
> that everything you put in the stash is visible upon rendering.
> 
> You can also check out the DefaultEnd plugin, which is a grand idea :)
> 
>>           $c->stash->{stuff}=Dumper(@all);
> 
>>     }
>>
> 

-- 
Joseph Landman, Ph.D
Founder and CEO
Scalable Informatics LLC,
email: landman at scalableinformatics.com
web  : http://www.scalableinformatics.com
phone: +1 734 786 8423
fax  : +1 734 786 8452
cell : +1 734 612 4615



More information about the Catalyst mailing list