0

Can someone help with an example of how to use external files(css,Javascript and images) in Kohana 3.2.2

3 Answers 3

1

Here is what I did: in /classes/controller/hello.php

    <?php defined('SYSPATH') OR die('No Direct Script Access');


     Class Controller_Hello extends Controller_Template
     {

      public $template = 'site'; // Default template



       public function action_index()
       {
         $this->template->styles = array('media/css/style.css'=>'screen');

         //$this->template->scripts = array('assets/js/jqtest.js');


       }

      public function before()
       {
        parent::before();

        if($this->auto_render)
         {
         // Initialize empty values

          $this->template->styles = array();
          $this->template->scripts = array();

         }

       }

       /**
        * Fill in default values for our properties before rendering the output.
       */
     public function after()
     {
      if($this->auto_render)
      {
      // Define defaults
       $styles = array('media/css/style.css' => 'screen');
       //$scripts = array(‘http://ajax.googleapis.com/ajax/libs/jquery/1.3.2.js');

      // Add defaults to template variables.

         $this->template->styles=array_reverse(array_merge
         ($this->template->styles,$styles));


       //$this->template->scripts =array_reverse(array_merge
        ($this->template->scripts, $scripts));
         }
       // Run anything that needs to run after this.
       parent::after();

     }

 }

And then in your view,you just need to use this /application/views/site.php

   <head>
       <?php 
       foreach($styles as $file => $type)
       { 
       echo HTML::style($file, array('media' => $type)), ""; 

   }    
   ?>    
  </head>

To add an image to your view

    <li class="social"><?php echo html::image('media/images/phone.png');?>
Sign up to request clarification or add additional context in comments.

Comments

0

Depends on if you want to run them through your controller or not. An example controller if you wanted to load media files using HMVC.

/classes/controller/media.php

class Controller_Media extends Controller {

    protected $config = NULL;

    public function before()
    {
        parent::before();

        $this->config = Kohana::$config->load('media');

    }

    public function action_css()
    {
        $this->handle_request(
            'style',
            $this->request->param('path'),
            $this->config['styles']['extension']
        );
    }

    public function action_js()
    {
        $this->handle_request(
            'script',
            $this->request->param('path'),
            $this->config['scripts']['extension']
        );
    }

    public function action_img()
    {
        $image = $this->config['images']['directory'].$this->request->param('path');
        $extension = $this->find_image_extension($image);

        $this->handle_request(
            'image',
            $this->request->param('path'),
            $extension
        );
    }

    protected function handle_request($action, $path, $extension)
    {
        $config_key = Inflector::plural($action);
        $file = $this->config[$config_key]['directory'].$path;

        if ($this->find_file($file, $extension))
        {
            $this->serve_file($file, $extension);
        }
        else
        {
            $this->error();
        }
    }

    protected function find_file($file, $extension)
    {
        $path_parts = pathinfo($file);
        return Kohana::find_file('media', $path_parts['dirname']."/".$path_parts['filename'], $extension);
    }

    protected function find_image_extension($file)
    {
        foreach ($this->config['images']['extension'] as $extension)
        {
            if ($this->find_file($file, $extension) !== FALSE)
            {
                return $extension;
            }
        }

        return FALSE;
    }

    protected function serve_file($file, $extension)
    {
        $path = $this->find_file($file, $extension);

        $this->response->headers('Content-Type', File::mime_by_ext($extension));
        $this->response->headers('Content-Length', (string) filesize($path));
        $this->response->headers('Cache-Control','max-age=86400, public');
        $this->response->headers('Expires', gmdate('D, d M Y H:i:s \G\M\T', time() + 86400));
        $this->response->body(file_get_contents($path));
    }

    protected function error()
    {
        throw new HTTP_Exception_404('File :file not found.', array(
            ':file' => $this->request->param('path', NULL),
        ));
    }

}

/config/media.php

return array(
    'styles' => array(
        'directory'       => 'css/',
        'extension'       => 'css',
    ),
    'scripts' => array(
        'directory'       => 'js/',
        'extension'       => 'js',
    ),
    'images' => array(
        'directory'       => 'img/',
        'extension'       => array('png', 'jpg', 'jpeg', 'gif', 'ico', 'svg'),
    ),
);

routes.php

Route::set('media', 'media/<action>(/<path>)', array(
        'path' => '.*?',
    ))
    ->defaults(array(
        'controller' => 'media',
        'action' => 'index',
    ));

2 Comments

thanks Mike...am quite a newbie with the framework..is the route.php same as bootstrap.php or what exactly? and how will you call this from the view and the controller that is linked to the view. Thanks in advance.
Yes sorry the route is actually the bootstrap we just separated it because it was so large. The controller is initiated when your img, CSS or js src is /media/img/file name.jpg for example
0

Your default .htaccess should handle anything in your root directory without any additional code.

/webroot 
--> application/
--> modules/
--> system
--> css/
--> scripts/

Anything called from http://domain.com/css will properly look in css/ because of the .htaccess rule to look for existing files/folder first and then load the index.php from Kohana.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.