alex
alex

Reputation: 490273

In Kohana 3, how can I tell the form helper to stop inserting 'index.php'

When I use the form::open in Kohana 3, I get this

<form action="/my-site/index.php/bla" method="post" accept-charset="utf-8"> 

Nowhere on my site do I rely on the index.php being there. I think it looks ugly. Is there an easy way to remove the index.php from it.

Obviously I know I could do a str_replace(), but I thought there may be a more elegant way?

Upvotes: 4

Views: 1337

Answers (4)

John Himmelman
John Himmelman

Reputation: 22000

In addition to Casper's response, here is the default KO3 .htaccess (renamed from example.htaccess) file that enables url rewriting.

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /kohana/

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b index.php/$0 [L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

Upvotes: 0

SpadXIII
SpadXIII

Reputation: 916

for Kohana3 it's done almost the same way as in Kohana2.x:

in application/bootstrap.php is an initialization call:

Kohana::init(array(
  'base_url'   => '/',
  'index_file' => FALSE // This removes the index.php from urls
));

This removes the index.php from all generated urls. No need to overload/edit any Kohana class.

Note that you'll have to use the .htaccess file

Upvotes: 7

sberry
sberry

Reputation: 132018

I haven't played with Kohana 3 except for a few minutes.

In Kohana 2 there is a config setting you can set to empty string

$config['index_page'] = '';

One of my co-workers is on the Kohana 3 development team so if you don't have a solid answer for this by tomorrow I can ask him. A quick look at form.php shows that the NULL value for action will get the value from Request::instance()->uri(), which in turn will get its values from the Route class. You could probably find the answer by just tracing back through the Routing instantiation to see what is getting set where. Otherwise, like I mentioned, I will ask my coworker tomorrow.

Upvotes: 1

Alix Axel
Alix Axel

Reputation: 154553

Kohana (as well as CodeIgniter and most of other frameworks) relies on the Front-Controller Pattern (index.php) so unless you deeply hacked it I cannot see how you don't need to rely on it.

After a quick look at the form::open() source:

public static function open($action = NULL, array $attributes = NULL)
{
    if ($action === NULL)
    {
        // Use the current URI
        $action = Request::instance()->uri;
    }

    if ($action === '')
    {
        // Use only the base URI
        $action = Kohana::$base_url;
    }
    elseif (strpos($action, '://') === FALSE)
    {
        // Make the URI absolute
        $action = URL::site($action);
    }

    // ...
}

I don't think it's possible without specifying a absolute URL. Might be a solution if you don't mind doing:

form::open('http://domain.com/my-site/bla');

Otherwise your best approach would be to str_replace() or override the it with an application helper.


If you edit the url helper (/system/classes/kohana/url.php) and change line 71 from this:

return URL::base(TRUE, $protocol).$path.$query.$fragment;

To this:

return URL::base(FALSE, $protocol).$path.$query.$fragment;

All index.php appearances should be gone.


I'm not sure if this will work, but in application/bootstrap.php change this:

Kohana::init(array('base_url' => '/kohana/'));

To this:

Kohana::init(array('base_url' => '/kohana/', 'index_file' => ''));

Upvotes: 6

Related Questions