Re: [Catalyst] stripping path parts and then redispatch?

2009-02-24 Thread Larry Leszczynski

On Tue, 24 Feb 2009 05:54 +0200, Octavian Râsnita orasn...@gmail.com
wrote:
 I think this solution should be put at least in a wiki if not in the POD 
 manual.
 
 Octavian

I'll be happy to give it a go, if someone can suggest appropriate places
to add this to the POD and/or wiki...

Larry



 
 - Original Message - 
 From: Larry Leszczynski lar...@emailplus.org
 To: Bill Moseley mose...@hank.org; Catalyst Framework 
 catalyst@lists.scsys.co.uk
 Sent: Tuesday, February 24, 2009 3:44 AM
 Subject: Re: [Catalyst] stripping path parts and then redispatch?
 
 
  Just wanted to pass along some solutions...
 
  To recap briefly:
 
  URLs are prefixed with the page language, e.g /en/foo/bar.  The
  language needs to be stripped off and stashed, and the remainder of the
  request processed as if the language part had not been there, e.g.
  /foo/bar.
 
  I was trying to use $c-go(/foo/bar), which works if there is a
  Foo::bar() action, but which breaks if the action is supposed to be
  Foo::default() with the argument bar (or Foo::Bar::default() with no
  arguments).
 
 
  1) Bill Moseley suggested a different approach which is seeming to work
  pretty well so far (thanks Bill), it involves subclassing
  MyApp-prepare_path() to tweak the path at beginning of processing,
  something like this:
 
   sub prepare_path
   {
   my $c = shift;
 
   $c-SUPER::prepare_path(@_);
 
   my @path_chunks = split m[/], $c-request-path, -1;
 
   return unless (   @path_chunks
   $valid_languages{$path_chunks[0]});
 
   # Pull off first path chunk:
   my $language = shift @path_chunks;
   $c-stash-{language} = $language;
 
   # Create a request path from the remaining chunks:
   my $path = join('/', @path_chunks) || '/';
 
   # Stuff modified request path back into request:
   $c-request-path($path);
 
   # Update request base to include whatever
   # was stripped from the request path:
   my $base = $c-request-base;
   $base-path($base-path . $language . '/');
   }
 
  A nice side effect is that tweaking $c-request-base to include the
  language means the language is automatically included when you call
  $c-uri_for().
 
 
  2) In the process of trying to get $c-go() to work for an arbitrary
  path, I found a way that seems to make it work consistently even if the
  path is supposed to hit a default action:
 
 # Create your request path to wherever:
 my $path = /foo/bar/baz;
 
 # Stuff modified request path back into request:
 $c-request-path($path);
 
 # Create a new $c-action using $c-request-path.
 # Updates $c-action and $c-request-args.
 $c-dispatcher-prepare_action($c);
 
 $c-go($c-action, $c-request-args);
 
  This should work for any of $c-forward(), $c-detach(), $c-visit(),
  $c-go().
 
 
  Thanks for all the suggestions,
  Larry
 
  ___
  List: Catalyst@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/ 
 
 
 ___
 List: Catalyst@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/

___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-24 Thread Tomas Doran


On 24 Feb 2009, at 18:49, Larry Leszczynski wrote:


I'll be happy to give it a go, if someone can suggest appropriate  
places

to add this to the POD and/or wiki...


How about here: http://dev.catalyst.perl.org/wiki/wikicookbook


 $c-SUPER::prepare_path(@_);



Tiny nit pick - you probably want to say $c-next::method(@_) rather  
than SUPER::.


I don't think it matters one jot in this case, but this is  
recommended as general practice :)


Cheers
t0m

___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-24 Thread Bill Moseley
On Wed, Feb 25, 2009 at 01:12:57AM +, Tomas Doran wrote:

 On 24 Feb 2009, at 18:49, Larry Leszczynski wrote:

 I'll be happy to give it a go, if someone can suggest appropriate  
 places
 to add this to the POD and/or wiki...

 How about here: http://dev.catalyst.perl.org/wiki/wikicookbook

  $c-SUPER::prepare_path(@_);


 Tiny nit pick - you probably want to say $c-next::method(@_) rather  
 than SUPER::.

Or what I sent to Larry:

$c-NEXT::prepare_path;

At what catalyst version can you use $c-next:: ?

-- 
Bill Moseley
mose...@hank.org
Sent from my iMutt


___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-23 Thread Larry Leszczynski
Hi Lars -

  I have an existing site, and want to add the page language to the URLs
  so that caching will work correctly, e.g. /foo/bar would now look like
  /en/foo/bar or /fr/foo/bar.
 
 Apart from the missing true return value from auto, this works:
 
 http://lists.scsys.co.uk/pipermail/catalyst/2009-February/021072.html

Thanks for the pointer.  But this approach only seems to work for Local
actions, not Private actions like default().  E.g. using these
controllers:

#

package MyApp::Controller::Foo;
use parent 'Catalyst::Controller';

sub default :Private {
my ($self, $c, @args) = @_;
$c-response-body(Foo args: @args);
}

sub bar :Local {
my ($self, $c, @args) = @_;
$c-response-body(Foo::Bar args: @args);
}

#

package MyApp::Controller::En;
use parent 'Catalyst::Controller';

sub default :Private {
my ($self, $c, @args) = @_;
my $path = $c-request-path;
$path =~ s{^en}{};
$c-go($path, []);
}

#

The paths /en/foo/bar or /en/foo/bar/arg1 work as expected, but if I
try to hit /en/foo I get an error message:

   Couldn't go to command /foo:
   Invalid action or component.

because the action name it wants is really /foo/default, not just
/foo.


For a path like /a/b/c, I would need to figure out whether to do this:

# Will hit:  A::Bwith arg 'c'
#   or:  A::B::C with no args
#
$c-go(/a/b/c, []);

vs this:

$c-go(/a/default, ['b', 'c']);

vs this:

$c-go(/a/b/default, ['c']);

?


I'm guessing there must be a way to use the Dispatcher to figure out,
for a given path, how to make go() work consistently, but I have not yet
found the trick for making this work...


Thanks!
Larry

___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-23 Thread Jason Gottshall

Larry Leszczynski wrote:

Hi Lars -


I have an existing site, and want to add the page language to the URLs
so that caching will work correctly, e.g. /foo/bar would now look like
/en/foo/bar or /fr/foo/bar.

Apart from the missing true return value from auto, this works:

http://lists.scsys.co.uk/pipermail/catalyst/2009-February/021072.html


Thanks for the pointer.  But this approach only seems to work for Local
actions, not Private actions like default().  E.g. using these
controllers:

#

package MyApp::Controller::Foo;
use parent 'Catalyst::Controller';

sub default :Private {
my ($self, $c, @args) = @_;
$c-response-body(Foo args: @args);
}


That construct is deprecated. You can do basically the same thing with:

  sub default : Path {
  ...
  }

See:
http://search.cpan.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod#Built-in_Private_Actions

--
Jason Gottshall
jgottsh...@capwiz.com


___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-23 Thread Larry Leszczynski
Hi Jason -

  I have an existing site, and want to add the page language to the URLs
  so that caching will work correctly, e.g. /foo/bar would now look like
  /en/foo/bar or /fr/foo/bar.
  Apart from the missing true return value from auto, this works:
 
  http://lists.scsys.co.uk/pipermail/catalyst/2009-February/021072.html
  
  Thanks for the pointer.  But this approach only seems to work for Local
  actions, not Private actions like default().  E.g. using these
  controllers:
  
  #
  
  package MyApp::Controller::Foo;
  use parent 'Catalyst::Controller';
  
  sub default :Private {
  my ($self, $c, @args) = @_;
  $c-response-body(Foo args: @args);
  }
 
 That construct is deprecated. You can do basically the same thing with:
 
sub default : Path {
...
}
 
 See:
 http://search.cpan.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod#Built-in_Private_Actions

Thanks, acknowledged.  However, changing default:Private to
default:Path doesn't solve the problem - the expected argument to
$c-go() for the path /foo is still /foo/default, which is not
obvious just from looking at the path.


Larry

___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-23 Thread Larry Leszczynski
Just wanted to pass along some solutions...

To recap briefly:

URLs are prefixed with the page language, e.g /en/foo/bar.  The
language needs to be stripped off and stashed, and the remainder of the
request processed as if the language part had not been there, e.g.
/foo/bar.

I was trying to use $c-go(/foo/bar), which works if there is a
Foo::bar() action, but which breaks if the action is supposed to be
Foo::default() with the argument bar (or Foo::Bar::default() with no
arguments).


1) Bill Moseley suggested a different approach which is seeming to work
pretty well so far (thanks Bill), it involves subclassing
MyApp-prepare_path() to tweak the path at beginning of processing,
something like this:

  sub prepare_path
  {
  my $c = shift;

  $c-SUPER::prepare_path(@_);

  my @path_chunks = split m[/], $c-request-path, -1;

  return unless (   @path_chunks
  $valid_languages{$path_chunks[0]});

  # Pull off first path chunk:
  my $language = shift @path_chunks;
  $c-stash-{language} = $language;

  # Create a request path from the remaining chunks:
  my $path = join('/', @path_chunks) || '/';

  # Stuff modified request path back into request:
  $c-request-path($path);

  # Update request base to include whatever
  # was stripped from the request path:
  my $base = $c-request-base;
  $base-path($base-path . $language . '/');
  }

A nice side effect is that tweaking $c-request-base to include the
language means the language is automatically included when you call
$c-uri_for().


2) In the process of trying to get $c-go() to work for an arbitrary
path, I found a way that seems to make it work consistently even if the
path is supposed to hit a default action:

# Create your request path to wherever:
my $path = /foo/bar/baz;

# Stuff modified request path back into request:
$c-request-path($path);

# Create a new $c-action using $c-request-path.
# Updates $c-action and $c-request-args.
$c-dispatcher-prepare_action($c);

$c-go($c-action, $c-request-args);

This should work for any of $c-forward(), $c-detach(), $c-visit(),
$c-go().


Thanks for all the suggestions,
Larry

___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-23 Thread Octavian Râsnita
I think this solution should be put at least in a wiki if not in the POD 
manual.


Octavian

- Original Message - 
From: Larry Leszczynski lar...@emailplus.org
To: Bill Moseley mose...@hank.org; Catalyst Framework 
catalyst@lists.scsys.co.uk

Sent: Tuesday, February 24, 2009 3:44 AM
Subject: Re: [Catalyst] stripping path parts and then redispatch?



Just wanted to pass along some solutions...

To recap briefly:

URLs are prefixed with the page language, e.g /en/foo/bar.  The
language needs to be stripped off and stashed, and the remainder of the
request processed as if the language part had not been there, e.g.
/foo/bar.

I was trying to use $c-go(/foo/bar), which works if there is a
Foo::bar() action, but which breaks if the action is supposed to be
Foo::default() with the argument bar (or Foo::Bar::default() with no
arguments).


1) Bill Moseley suggested a different approach which is seeming to work
pretty well so far (thanks Bill), it involves subclassing
MyApp-prepare_path() to tweak the path at beginning of processing,
something like this:

 sub prepare_path
 {
 my $c = shift;

 $c-SUPER::prepare_path(@_);

 my @path_chunks = split m[/], $c-request-path, -1;

 return unless (   @path_chunks
 $valid_languages{$path_chunks[0]});

 # Pull off first path chunk:
 my $language = shift @path_chunks;
 $c-stash-{language} = $language;

 # Create a request path from the remaining chunks:
 my $path = join('/', @path_chunks) || '/';

 # Stuff modified request path back into request:
 $c-request-path($path);

 # Update request base to include whatever
 # was stripped from the request path:
 my $base = $c-request-base;
 $base-path($base-path . $language . '/');
 }

A nice side effect is that tweaking $c-request-base to include the
language means the language is automatically included when you call
$c-uri_for().


2) In the process of trying to get $c-go() to work for an arbitrary
path, I found a way that seems to make it work consistently even if the
path is supposed to hit a default action:

   # Create your request path to wherever:
   my $path = /foo/bar/baz;

   # Stuff modified request path back into request:
   $c-request-path($path);

   # Create a new $c-action using $c-request-path.
   # Updates $c-action and $c-request-args.
   $c-dispatcher-prepare_action($c);

   $c-go($c-action, $c-request-args);

This should work for any of $c-forward(), $c-detach(), $c-visit(),
$c-go().


Thanks for all the suggestions,
Larry

___
List: Catalyst@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/ 



___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-22 Thread Larry Leszczynski
Hi Tomas -

  I'm using Catalyst 5.8.5 so I can make use of any of forward, detach,
  visit, go, etc.
 
 Not helpful to your main email, but there is no such version as 5.8.5?
 
 I assume you mean 5.8000_05, which is a developer release?

Yes, that's what I meant, sorry.

Larry

___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-22 Thread Tomas Doran


On 22 Feb 2009, at 22:28, Larry Leszczynski wrote:

I'm using Catalyst 5.8.5 so I can make use of any of forward, detach,
visit, go, etc.


Not helpful to your main email, but there is no such version as 5.8.5?

I assume you mean 5.8000_05, which is a developer release?

Cheers
t0m


___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-22 Thread Bill Moseley
On Sun, Feb 22, 2009 at 03:28:48PM -0700, Larry Leszczynski wrote:
 I'd like to be able to capture and strip off the language, in e.g.
 MyApp::Controller::Root::auto(), and then either forward or redispatch
 to the existing controllers, but haven't been able to come up with a way
 of generating the forwarding path/args that consistently works for all
 action types.  E.g., how do I know if I should dispatch to action
 /foo/bar, or action /foo with argument bar?

I'm sure there's better approach, but I've simply overridden
prepare_path and then removed the prefix (e.g. the language) from the
path, set a flag, and then appended it on $req-base.

-- 
Bill Moseley
mose...@hank.org
Sent from my iMutt


___
List: Catalyst@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/


Re: [Catalyst] stripping path parts and then redispatch?

2009-02-22 Thread Lars Balker Rasmussen
On Sun, Feb 22, 2009 at 11:28 PM, Larry Leszczynski
lar...@emailplus.org wrote:
 I have an existing site, and want to add the page language to the URLs
 so that caching will work correctly, e.g. /foo/bar would now look like
 /en/foo/bar or /fr/foo/bar.  (The language is user-selected, not
 from browser prefs, so setting the Vary: Accept-Language response
 header won't help.)

Apart from the missing true return value from auto, this works:

http://lists.scsys.co.uk/pipermail/catalyst/2009-February/021072.html
-- 
Lars Balker RasmussenConsult::Perl

___
List: Catalyst@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/