1. Introduction
    1. About Agavi
    2. MVC in Agavi
    3. Overview of Agavi
    4. Overview of Application Execution Flow
    5. A Word About Actions
    6. Application filesystem layout
    7. Overview of application configuration
  2. Setting Up The Initial Application
    1. Installing Agavi
    2. Creating an Agavi Project
    3. Finishing The Setup
    4. Finishing The Basic Setup
    5. Installing a New Copy of Your Application
  3. Adding First Code
    1. Creating A New module
    2. Creating A New Action
    3. Tying Things Together — An Introduction To Routing
    4. Fixing The Bloggie Routing
    5. Accessing Request Parameters and Validation Basics
    6. Handling Validation Errors
  4. Putting The M in MVC
    1. Creating A New Model
    2. Adapting The Actions and Views
    3. Custom Validators
  5. Polishing It Up
    1. Layers and Layouts
    2. Applying Our Layout
    3. What Are Slots?
    4. Adding The Post's Title To The URL
    5. Routing Callbacks
    6. Using Callbacks for the Title in URLs
  6. Connecting to a database
    1. The Database Manager
  7. Handling Output Variants
    1. Output Types
    2. Exception Templates
    3. Generating an RSS Feed
  8. Form Processing
    1. Adding a Post
    2. Editing a Post
    3. The Form Population Filter (FPF)
  9. Creating a User Authentication System
  10. Adding To The Master Template

Adding The Post's Title To The URL

Adding the post's title to the URL has multiple advantages. It allows the user to see where the URL is pointing to and search engines will improve your ranking.

The first thing we need to do is adapt our routing rules to allow for a second parameter in the URL. We'd like the title to be an optional part and we'll restrict it to word-chars and dashes only:

<route name=".post" pattern="^/(post:\d+)(-{title:[-\w]+})?" action="Post">
  <route name=".show" pattern="^$" action=".Show" />
</route>

Now that we made it possible to inject the title we just need to adapt the places where we generate the URLs to actually pass the title. Currently this is only in the Posts_IndexSuccessView [app/modules/Posts/views/IndexSuccessView.class.php], so let's change that. Remember that we only allowed word chars in the route, so we need to make shure that we only pass word chars in - we'll just replace anything that's not a word char by a dash:

<?php

class Posts_IndexSuccessView extends BlogPostsBaseView
{
  
  public function executeHtml(AgaviRequestDataHolder $rd)
  {
    $this->setupHtml($rd);
    $ro = $this->getContext()->getRouting();

    $this->setAttribute('_title', 'Latest Posts');
    
    
    $posts = array();
    
    foreach($this->getAttribute('posts') as $p)
    {
      $post = $p->toArray();
      $post['url'] = $ro->gen(
        'posts.post.show', 
        array(
          'post' => $p->getId(), 
          'title' => preg_replace('/\W/', '-', $p->getTitle())
        )
      );
      
      $posts[] = $post;
    }
    
    $this->setAttribute('posts', $posts);
  }
}

?>

Hmm. That works, but it might get a bit tedious to always remember that if you generate the URL to a post, you'll have to pass in the post-id and the title and replace all non-word chars by dashes. Well, surprise, there's a better way.