On Fri, 14 Sep 2001, Rasoul Hajikhani wrote:

> Hello,
> I am using template toolkit to generate dynamic content and I was
> wondering if there is any way to set a cookie after returning OK. Here
> is what I mean.
>
> 1-There are two scripts that check for access privileges of a user. One
> sets two cookies and the other (mine) sets three cookies.
>
> 2- My script checks for all the cookies and if it does not find the
> third one it should set it. But the catch is here:

The problem is that you don't show where is_allowed_todo gets called. I
guess in the template as in your comment. The solution is very simple.
Change is_allowed_todo to change status in $object or elsewhere. Now
change the handler to do;

  my $status = exists $object->{status}
        ? $object->{status}
        : OK;
  return $status;

does that solve your problem?

You return your status as the last thing in the handler, after the
template was processed, I don't see how can you have this problem

Even better solution would be to run is_allowed_todo from your code and
not template! Run is_allowed_todo, get the status and pass it to your
template as a variable.

One should avoid running code from the templates, as they are designed for
presentation not application logic.

> package some_package;
>
> # apache packages
>
> use vars qw($r);
>
> sub handler{
>
>       $r = Apache::Request->new(shift);
>       #code here
>       $object->{is_allowed_todo} = \&is_allowed_todo;
>
>       $template = Template->new();
>       $remplate->process($file,$object);
>       return OK;
> }
>
> sub is_allowed_todo
> {
>       my ($args)      = shfit;
>       # args are the arguments that I get from my .html file
>       # [% is_allowed_todo('<A HREF="....>' %]
>
>       my $status      = __PACKAGE__->SUPER::is_allowed_todo($r);
>
>       if ($status)
>       {
>               # do this
>       }
>       else
>       {
>               # do that
>       }
> }
> 1;
>
> # The SUPER
>
> package some_other;
>
> sub is_allowed_todo
> {
>       my $r   = shift;
>
>       my $cookies = Apache::Cookie->new($r)->parse();
>       my @webaccess = $cookies->{'webaccess'} ?
> $cookies->{'webaccess'}->value() : ();
>
>         unless ($webaccess[MIS_APPS::RHS::Constants::ONE()]);
>         {
>                 my $user                =
> $cookies->{'webuname'}->value();
>                 my $job                 = $cookies->{'webjob'}->value();
>
>                 ($code,$status,$dept)   = get_userinfo($user,$job);
>
>                 Apache::Cookie->new(  $r,
>                                 -name           => 'webaccess',
>                                 -value          => {
>                                                         'department'
> => $dept,
>                                                         'access'
> => $status,
>                                                    },
>                                 -domain         => '.rhythm.com',
>                                 -expires        => '+24h',
>                                 -path           => '/'
>                               )->bake;
>         }
>       return $status;
> }
>
> But my problem is that I have already returned OK in my handler. How can
> I set another cookie when I have already opened the data stream to the
> client browser? I hope I have been clear... :)
> Any comments will be greatly appreciated.
> -r
>



_____________________________________________________________________
Stas Bekman              JAm_pH     --   Just Another mod_perl Hacker
http://stason.org/       mod_perl Guide  http://perl.apache.org/guide
mailto:[EMAIL PROTECTED]   http://apachetoday.com http://eXtropia.com/
http://singlesheaven.com http://perl.apache.org http://perlmonth.com/


Reply via email to