[Catalyst] TT via AJAX

Roland Philibert rphilibert at aptina.com
Thu Apr 26 19:24:54 GMT 2012


Hi Will,

In your previous suggestion you had:

 =


                while ( my $rec =3D $rs->next ) {

                                my %fields =3D $self->get_important_values(=
 $rec );

                                push @{ $json->{data} }, { %fields );

                }

 =


...what is "get_important_values"? How to make sure that all the resultset =
is transferred to $json.

 =


Thanks for you help.

R

 =


 =


 =


From: will trillich [mailto:will.trillich at serensoft.com] =

Sent: 26 April 2012 14:02
To: The elegant MVC web framework
Subject: Re: [Catalyst] TT via AJAX

 =


Roland --

 =


The main thing is, a resultset isn't your data, it's a way to *get to* your=
 data. At some point your process needs to iterate thru the rows that your =
recordset would return, and that's the part you want in your data.

 =


It's not that you're rebuilding the data structure, you just want to get th=
e data you need, omitting the other housekeeping items that would clutter u=
p your results (and take time to encode).

 =


E.g.

 =


  DB<3> |x $rs

0  DBIx::Class::ResultSet=3DHASH(0xc1e8460)

   '_result_class' =3D> 'WT::Model::Model::Master'

   'attrs' =3D> HASH(0xc239ed8)

      'alias' =3D> 'me'

      'where' =3D> HASH(0xc1e55e0)

         'ix' =3D> '-1'

   'cond' =3D> HASH(0xc1e55e0)

      -> REUSED_ADDRESS

   'pager' =3D> undef

   'result_source' =3D> DBIx::Class::ResultSource::Table=3DHASH(0xbbaa400)

      '_columns' =3D> HASH(0xbbaa7c0)

         'cat' =3D> HASH(0xbb74b30)

            'data_type' =3D> 'VARCHAR'

            'default_value' =3D> undef

            'is_nullable' =3D> 1

            'size' =3D> 8

         'class' =3D> HASH(0xbb74cb0)

            'data_type' =3D> 'VARCHAR'

            'default_value' =3D> undef

            'is_nullable' =3D> 1

            'size' =3D> 4

...snip...300 or more lines later...snip...

               'sqlt_deploy_callback' =3D> 'default_sqlt_deploy_hook'

         'storage' =3D> DBIx::Class::Storage::DBI=3DHASH(0xbba4470)

            '_connect_info' =3D> ARRAY(0xb9ae738)

               0  HASH(0xac9f618)

                  'dsn' =3D> 'dbi:mysql:dbname=3Dwt'

                  'password' =3D> 'sekrit-goeth-thither'

                  'user' =3D> 'blahyaddablah'

            '_dbh_details' =3D> HASH(0xbba78b0)

                 empty hash

            '_dbh_gen' =3D> 0

            '_dbi_connect_info' =3D> ARRAY(0xab32940)

               0  'dbi:mysql:dbname=3Dwt'

               1  'blahyaddablah'

               2  'sekrit-goeth-thither'

               3  HASH(0xab32860)

                  'AutoCommit' =3D> 1

                  'PrintError' =3D> 0

                  'RaiseError' =3D> 1

                  'ShowErrorStatement' =3D> 1

            '_dbic_connect_attributes' =3D> HASH(0xab32860)

               -> REUSED_ADDRESS

            '_in_dbh_do' =3D> 0

            '_sql_maker' =3D> undef

            '_sql_maker_opts' =3D> HASH(0xbba78d0)

                 empty hash

            'savepoints' =3D> ARRAY(0xbba4480)

                 empty array

            'schema' =3D> WT::Schema=3DHASH(0xb93e380)

               -> REUSED_ADDRESS

            'transaction_depth' =3D> 0

      'source_name' =3D> 'Master'

      'sqlt_deploy_callback' =3D> 'default_sqlt_deploy_hook'

 =


Encoding all that recordset background gunk as JSON is not going to be usef=
ul. You just need your data, and $rs->next() is a clean way to get at that.

 =


 =


 =


On Thu, Apr 26, 2012 at 7:21 AM, Roland Philibert <rphilibert at aptina.com> w=
rote:

Hi Will,

Thanks for this, am not sure I understand though..

I don't really want to re-build the datastructure as the resultset $rs cont=
ains all relationships used by the template.

What I want to achieve is send back $body (from my rendered TT) via JSON ba=
ck to my $.ajax.

Any example on how to this and I'd be very grateful.

 =


Thanks.

 =


From: will trillich [mailto:will.trillich at serensoft.com] =

Sent: 25 April 2012 14:53
To: The elegant MVC web framework
Subject: Re: [Catalyst] TT via AJAX

 =


Roland --

 =


Assuming your JSON view is trying to encode the 'result' item from your sta=
sh, first let's see why encoding a blessed object is fraught with peril.

 =


Try running your server in debug mode, and when you get to the ->stash() li=
ne, try "x $rs". You really want all that JSON-encoded?

 =


Blessed objects (such as a recordset or a request or a response) typically =
contain many, many layers that are often going to be overkill when encoding=
 stuff as JSON, when really you just want a few top-level items.

 =


So you should iterate through your objects and/or collections and create a =
hashref that contains plain primitives (or maybe a few more hashrefs or arr=
ayrefs when needed) instead of asking JSON to translate blessed objects tha=
t are dozens of layers deep.

 =


Instead of doing ...->stash( result =3D> [ $rs ] ) build your own data stru=
cture, by doing something like

 =


my $json =3D {

  data =3D> [],

  count=3D> $rs->count,

  other =3D> $self->blah,

};

while ( my $rec =3D $rs->next ) {

  my %fields =3D $self->get_important_values( $rec );

  push @{ $json->{data} }, { %fields );

}

$c->stash( result =3D> $json );

 =


 =


 =


On Wed, Apr 25, 2012 at 8:26 AM, Roland Philibert <rphilibert at aptina.com> w=
rote:

Hello all,

I'd like to render some HTML content being formatted from a  TT view via AJ=
AX.
Can anybody recommend a way to do that please?

 =


The method I am using now for AJAX  is REST controller and JSON View.

 =


...

sub ajaxaction :Local :ActionClass('REST') {}

 =


sub ajaxaction _GET {

 =


                my ($self, $c) =3D @_;

                my $rs =3D  $c->model(DN)->resultset(Table)->find(...);

                my $body =3D $c->view(MYTT)->render($c,'dir/temp.mailtt',$c=
->stash( result  =3D> [ $rs ] )); =DF this is the weird bit I guess.

                my @content =3D();

                push @content, $body;

                $self->status_ok(

                        $c,

                        entity =3D> \@content,

                );

}

sub end :Private {

        my ($self, $c) =3D @_;

        $c->forward("View::JSON");

}

 =


..but doing this I get the error:

 =


Caught exception in MyApp::View::JSON->process "encountered object 'MyApp::=
Model::DB::Table=3DHASH(0xdb2c330)', but neither allow_blessed nor convert_=
blessed settings are enabled at (eval 1606) line 151."

 =


Thanks for your help.

Roland

 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


 =


Aptina (UK) Limited, Century Court, Millennium Way, Bracknell, Berkshire, R=
G12 2XT. Registered in England No. 06570543.
 =

This e-mail and any attachments contain confidential information and are so=
lely for the review and use of the intended recipient. If you have received=
 this e-mail in error, please notify the sender and destroy this e-mail and=
 any copies.
 =



_______________________________________________
List: Catalyst at lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/





 =


-- =

"We act as though comfort and luxury were the chief requirements of life, w=
hen all that we need to make us happy is something to be enthusiastic about=
." -- Albert Einstein

Aptina (UK) Limited, Century Court, Millennium Way, Bracknell, Berkshire, R=
G12 2XT. Registered in England No. 06570543.
 =

This e-mail and any attachments contain confidential information and are so=
lely for the review and use of the intended recipient. If you have received=
 this e-mail in error, please notify the sender and destroy this e-mail and=
 any copies.
 =



_______________________________________________
List: Catalyst at lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/





 =


-- =

"We act as though comfort and luxury were the chief requirements of life, w=
hen all that we need to make us happy is something to be enthusiastic about=
." -- Albert Einstein


Aptina (UK) Limited, Century Court, Millennium Way, Bracknell, Berkshire, R=
G12 2XT. Registered in England No. 06570543.

This e-mail and any attachments contain confidential information and are so=
lely for the review and use of the intended recipient. If you have received=
 this e-mail in error, please notify the sender and destroy this e-mail and=
 any copies.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/catalyst/attachments/20120426/30a67=
82b/attachment.htm


More information about the Catalyst mailing list