Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Will Hawes

On 13/03/07, Octavian Rasnita [EMAIL PROTECTED] wrote:

Hi,

I have a DBIC record object like
my $obj = $c-model(Database::Table)-find($id);

The table has very many fields and I would like to put their values in a TT
template without inserting them one by one in the stash.

So I would like to create a hash ref from $obj where the name of the field
is the key and the value from the table is the value in that hash, then use
$c-stash($hashref).

Is it possible to create that hash (ref) from $obj, or I need to do
something like

$c-stash-{obj} = $obj;

and in the template use [% obj.name1 %]... [% obj.name2 %]?

And by the way, which do you think is the recommended way?


I'd have thought the second one. $obj is essentially just a hash, so
I'm not sure what you'd stand to gain using the first method.

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Simon Wilcox
On Tue, 13 Mar 2007, Octavian Rasnita wrote:

 I have a DBIC record object like
 my $obj = $c-model(Database::Table)-find($id);

 The table has very many fields and I would like to put their values in a TT
 template without inserting them one by one in the stash.

 So I would like to create a hash ref from $obj where the name of the field
 is the key and the value from the table is the value in that hash, then use
 $c-stash($hashref).

I'm not sure why you would want to do this ?

 Is it possible to create that hash (ref) from $obj, or I need to do
 something like

 $c-stash-{obj} = $obj;

 and in the template use [% obj.name1 %]... [% obj.name2 %]?

I just put the object in the stash. TT abstracts the method/hash key
accessor issue for you so that [% obj.name1 %] will work whether obj is an
object with a name1 accessor or a hash with a name1 key.

Simon Wilcox

-- 
Digital Craftsmen Ltd
Exmouth House, 3 Pine Street, London. EC1R 0JH
t 020 7183 1410 f 020 7099 5140 m 07951 758698
w http://www.digitalcraftsmen.net/

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Octavian Rasnita

From: Simon Wilcox [EMAIL PROTECTED]


I just put the object in the stash. TT abstracts the method/hash key
accessor issue for you so that [% obj.name1 %] will work whether obj is an
object with a name1 accessor or a hash with a name1 key.



Ok, then I will use that way. I hoped that the first solution could be 
possible, because I don't want to use [% obj.name %] but only [% name %] if 
it works.


Octavian


___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Simon Wilcox
On Tue, 13 Mar 2007, Daniel McBrearty wrote:

 basically : an object IS a (blessed) hash.

Not necessarily, you can also bless scalars and arrays. A blessed array,
in particular can be a very effective way of improving performance for
certain types of data structures.

 You kind of need to understand this, if you don't already. It's worth
 having a read through the tutorials.

And buy Damian's book - Object Oriented Perl.

http://www.amazon.co.uk/Object-Oriented-Perl-Damian-Conway/dp/188491

Simon Wilcox

-- 
Digital Craftsmen Ltd
Exmouth House, 3 Pine Street, London. EC1R 0JH
t 020 7183 1410 f 020 7099 5140 m 07951 758698
w http://www.digitalcraftsmen.net/

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Kiki
Simon Wilcox wrote:
 Not necessarily, you can also bless scalars and arrays. A blessed array,
 in particular can be a very effective way of improving performance for
 certain types of data structures.
   
Strictly speaking you can bless any reference, although the most useful
are hashes and arrays.

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Simon Wilcox
On Tue, 13 Mar 2007, Octavian Rasnita wrote:

 From: Simon Wilcox [EMAIL PROTECTED]

  I just put the object in the stash. TT abstracts the method/hash key
  accessor issue for you so that [% obj.name1 %] will work whether obj is an
  object with a name1 accessor or a hash with a name1 key.
 

 Ok, then I will use that way. I hoped that the first solution could be
 possible, because I don't want to use [% obj.name %] but only [% name %] if
 it works.

Ah, I didn't understand that from reading your original post.

On Tue, 13 Mar 2007, Octavian Rasnita wrote:

 I have a DBIC record object like
 my $obj = $c-model(Database::Table)-find($id);

You will have to iterate over the accessors individually to put them into
the stash (I think) but you should be able to use DBIC to do most of the
thinking.  Something like (untested):

my $model = $c-model(Database::Table);
foreach my $column (@{$model-columns}) {
$column =~ s{me\.}{}; # strip the prefix DBIC adds
$c-stash-{$column} = $obj-$column;
}

I got the idea from reading the docs:
http://search.cpan.org/~jrobinson/DBIx-Class-0.07005/lib/DBIx/Class/ResultSet.pm#columns

You may need to adjust some of the above to get it to recognise $column as
an accessor.

Simon Wilcox

-- 
Digital Craftsmen Ltd
Exmouth House, 3 Pine Street, London. EC1R 0JH
t 020 7183 1410 f 020 7099 5140 m 07951 758698
w http://www.digitalcraftsmen.net/

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Octavian Rasnita
I know that an object is a blessed hash, but the DBIC objects are very 
complex, and I cannot use


$c-stash($obj);

If I do that, the values from $obj hash reference are not put in the 
template like when $obj is a reference to a common hash.


That's why I want to find how to put the key/values from $obj into a common 
hash.


Is it possible to do that without specifying all the keys by name? Or at 
least is there a way to get all the keys from $obj, then loop and create a 
hash, something like:


my $hash;
foreach(@keys) {
$hash-{$_} = $obj-$_;
}

Thanks.

Octavian 



___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Daniel McBrearty

On 3/13/07, Kiki [EMAIL PROTECTED] wrote:

Simon Wilcox wrote:
 Not necessarily, you can also bless scalars and arrays. A blessed array,
 in particular can be a very effective way of improving performance for
 certain types of data structures.

Strictly speaking you can bless any reference, although the most useful
are hashes and arrays.



true. So it's perhaps more accurate to say you can put a ref to
anything ([EMAIL PROTECTED], blessed or not ... ) on the stash.

--
Daniel McBrearty
email : danielmcbrearty at gmail.com
www.engoi.com : the multi - language vocab trainer
BTW : 0873928131

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Daniel McBrearty

If I do that, the values from $obj hash reference are not put in the
template like when $obj is a reference to a common hash.



Impossible to know what you mean here without an example of the
template, but I commonly put DBIC objects on the stash, and call
methods on them with the dot operator in TT. TT is smart enough to
work out what needs to be done and do it

so whether the underlying code is

$obj-element;

or

$obj-{element};

[%- obj.element -%]

works. (Maybe it always uses the second version - as I've never had a
problem, I've never looked ...

So I don't really get what the problem is here.

--
Daniel McBrearty
email : danielmcbrearty at gmail.com
www.engoi.com : the multi - language vocab trainer
BTW : 0873928131

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Simon Wilcox
On Tue, 13 Mar 2007, Octavian Rasnita wrote:

 That's why I want to find how to put the key/values from $obj into a common
 hash.

It sounds like this might be a bad design decision. Why would you not want
to group your template variables ?

As your app grows you'd be much more likely to see one key trample on
another from a different object.

 Is it possible to do that without specifying all the keys by name? Or at
 least is there a way to get all the keys from $obj, then loop and create a
 hash, something like:

 my $hash;
 foreach(@keys) {
 $hash-{$_} = $obj-$_;
 }

Yes, see my earlier post. You can get the columns from the ResultSet
object.

S.

-- 
Digital Craftsmen Ltd
Exmouth House, 3 Pine Street, London. EC1R 0JH
t 020 7183 1410 f 020 7099 5140 m 07951 758698
w http://www.digitalcraftsmen.net/

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Octavian Rasnita

From: Simon Wilcox [EMAIL PROTECTED]


You will have to iterate over the accessors individually to put them into
the stash (I think) but you should be able to use DBIC to do most of the
thinking.  Something like (untested):

my $model = $c-model(Database::Table);
foreach my $column (@{$model-columns}) {
   $column =~ s{me\.}{}; # strip the prefix DBIC adds
   $c-stash-{$column} = $obj-$column;
}


Ok, thank you. This is what I needed.


You may need to adjust some of the above to get it to recognise $column as
an accessor.


I hope I won't have any problem, or I think I can use 
$obj-get_column($column).


Thank you all.

Octavian


___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Dave Howorth
Daniel McBrearty wrote:
 basically : an object IS a (blessed) hash.
 
 http://perldoc.perl.org/perlboot.html
 
 You kind of need to understand this, if you don't already. It's worth
 having a read through the tutorials.

As others have pointed out, objects can also be created by blessing
other references.

In the context of the original question, it's also worth remembering
that an object is not the same as a hash as far as TT is concerned. It
unifies the syntax to call accessors and to access the members of a
hash. But it does *not* let you access arbitrary elements in a blessed
hash as Perl does. In TT, you can only use the methods.

Which is generally a Good Thing, but occasionally can be surprising.

Cheers, Dave

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Carl Johnstone
Is it possible to do that without specifying all the keys by name? Or at 
least is there a way to get all the keys from $obj, then loop and create a 
hash, something like:


my $hash;
foreach(@keys) {
$hash-{$_} = $obj-$_;
}



You're asking for trouble with something like that. Create a DB column 
called template and BOOM!


You're almost certainly better off doing this on the template side of 
things:


[% FOREACH obj %]
Name: [% name %]
[% END %]

Will do the same as:

Name: [% obj.name %]

as long as there is only one obj.

Carl


___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Octavian Rasnita

From: Simon Wilcox [EMAIL PROTECTED]


You will have to iterate over the accessors individually to put them into
the stash (I think) but you should be able to use DBIC to do most of the
thinking.  Something like (untested):

my $model = $c-model(Database::Table);
foreach my $column (@{$model-columns}) {
   $column =~ s{me\.}{}; # strip the prefix DBIC adds
   $c-stash-{$column} = $obj-$column;
}



I have tried that, but it gave the following error:

Can't locate object method columns via package DBIx::Class::ResultSet

What am I doing wrong?

Thanks.

Octavian


___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Octavian Rasnita

From: Daniel McBrearty [EMAIL PROTECTED]


Impossible to know what you mean here without an example of the
template, but I commonly put DBIC objects on the stash, and call
methods on them with the dot operator in TT. TT is smart enough to
work out what needs to be done and do it

so whether the underlying code is

$obj-element;

or

$obj-{element};

[%- obj.element -%]

works. (Maybe it always uses the second version - as I've never had a
problem, I've never looked ...

So I don't really get what the problem is here.


Hi,

The problem appears when I want to use only [% element %] and not [% 
obj.element %] in templates.
And I want to use the first way because there are very many variables and it 
is more simple.


Octavian


___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Daniel McBrearty

Hi,

The problem appears when I want to use only [% element %] and not [%
obj.element %] in templates.
And I want to use the first way because there are very many variables and it
is more simple.



As others have said, I think this is going to bite you in the arse
later. K-I-S-S. It seems we have differing definitions of simple
though.



--
Daniel McBrearty
email : danielmcbrearty at gmail.com
www.engoi.com : the multi - language vocab trainer
BTW : 0873928131

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Bogdan Lucaciu
On Tuesday 13 March 2007 15:06, Octavian Rasnita wrote:
  my $model = $c-model(Database::Table);
  foreach my $column (@{$model-columns}) {
     $column =~ s{me\.}{}; # strip the prefix DBIC adds
     $c-stash-{$column} = $obj-$column;
  }

 I have tried that, but it gave the following error:

 Can't locate object method columns via package DBIx::Class::ResultSet

 What am I doing wrong?


it's $resultset-result_source-columns

-- 
Bogdan Lucaciu
http://www.wiz.ro

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Dave Rolsky

On Tue, 13 Mar 2007, Dave Howorth wrote:


In the context of the original question, it's also worth remembering
that an object is not the same as a hash as far as TT is concerned. It
unifies the syntax to call accessors and to access the members of a
hash. But it does *not* let you access arbitrary elements in a blessed
hash as Perl does. In TT, you can only use the methods.


Huh? That's not true at all. In fact, TT2 does exactly the opposite. If I 
do this in my template:


 [% object.something %]

It tries to call a method something() on that object. However, if that 
method does not exist and the object is a blessed hash, then TT2 
helpfully looks up something as a hash key. Of course, if that key 
does not exist, TT2 will helpfully just keep going without a warning or 
error. This helpful behavior has cost me many hours of debugging.


And yes, I know there's a mode for TT2 where you can make it barf on any 
instance of undef in a template substitution, but that's often _too_ 
strict.



-dave

/*===
VegGuide.Orgwww.BookIRead.com
Your guide to all that's veg.   My book blog
===*/

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Matt Lawrence

Bogdan Lucaciu wrote:

On Tuesday 13 March 2007 15:06, Octavian Rasnita wrote:
  

my $model = $c-model(Database::Table);
foreach my $column (@{$model-columns}) {
   $column =~ s{me\.}{}; # strip the prefix DBIC adds
   $c-stash-{$column} = $obj-$column;
}
  

I have tried that, but it gave the following error:

Can't locate object method columns via package DBIx::Class::ResultSet

What am I doing wrong?




it's $resultset-result_source-columns

  


Alternatively, get_columns will return a hash (not a reference!) of the 
current row.


$c-stash-{obj }= { $row-get_columns };

Note that this hash contains uninflated values, if you want column 
inflation you'll need to loop.


Matt

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Octavian Rasnita

From: Matt Lawrence [EMAIL PROTECTED]
Alternatively, get_columns will return a hash (not a reference!) of the 
current row.


$c-stash-{obj }= { $row-get_columns };


Oh thanks. Finally I've used
$c-stash-{obj} = $obj;
and I've modified the template, because it seems that it is a better design.

What I thought that I need was something like:
$c-stash({ $row-get_columns });

And I'm happy that I also found about this method.

Note that this hash contains uninflated values, if you want column 
inflation you'll need to loop.


Please tell me what it means column inflation.

Thanks.

Octavian


___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] putting an object in the stash

2007-03-13 Thread Eden Cardim

On 3/13/07, Octavian Rasnita [EMAIL PROTECTED] wrote:

Please tell me what it means column inflation.


Check the docs for DBIx::Class::InflateColumn

--
Eden Cardim
Instituto Baiano de Biotecnologia
Núcleo de Biologia Computacional e Gestão de Informações Biotecnológicas
Laboratório de Bioinformática
--
you seem to think that 'close enough' is close enough...
please learn to be 'literal' around programming.
merlyn - on irc.freenode.net#perl

___
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/