How can I change Yii views default fileExtension

Yii default views fileExtension is ‘.php’,

but I wante use ‘.html’.

How can I change it?

Help me!

http://www.yiiframework.com/doc/guide/1.1/en/topics.url

see point 2. [urlSuffix]

Thanks bettor!

But I am afraid you didn’t understand my meanning.I mean the view file’s fileExtension(the files under /protected/views/ or /themes/classic/views/),not the url fileExtension.

do you have other suggestions?

first of all, yii redirect all the dynamic request (controller/action) to index.php

if you don’t like user to see index.php, you can hide it as per @bettor suggested;

2nd, there’s not much chance when you will call something.php directly when using yii;

3rd, to me it’s doable though dangerous. reason by default .html will be rendered as is in most if not all the webservers: IIS, Apache, Nginx you name it. you could change web-server’s setting tread .html as .php script,

but

WHY?

===

forget about my above comment when i read your question again.

short answer: view files are not pure html file, it needs php to render those dynamic contents.

you can use some kind of template engine, but it will not be part of yii

Thanks for your suggestion, rootbear!

After google and read the source code carefully,I solve this problem(Maybe it is not)!

I rewrite the resolveViewFile(in class CController) method !I will show my code below!




<?php


class BaseController extends CController

{

	public $fileExtension='.html';

	

	public function resolveViewFile($viewName,$viewPath,$basePath,$moduleViewPath=null)

	{

		if(empty($viewName))

			return false;

	

		if($moduleViewPath===null)

			$moduleViewPath=$basePath;

	

		if(($renderer=Yii::app()->getViewRenderer())!==null)

			$extension=$renderer->fileExtension;

		else

		{

			if(!empty($this->fileExtension))

			{

				$extension = $this->fileExtension;

			}else

			{

				$extension='.php';

			}

		}

	

		if($viewName[0]==='/')

		{

			if(strncmp($viewName,'//',2)===0)

				$viewFile=$basePath.$viewName;

			else

				$viewFile=$moduleViewPath.$viewName;

		}

		else if(strpos($viewName,'.'))

			$viewFile=Yii::getPathOfAlias($viewName);

		else

			$viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName;

	

		if(is_file($viewFile.$extension))

			return Yii::app()->findLocalizedFile($viewFile.$extension);

		else if($extension!=='.php' && is_file($viewFile.'.php'))

			return Yii::app()->findLocalizedFile($viewFile.'.php');

		else

			return false;

	}

}



I define a BaseController rewrite the resolveViewFile!And I define a Public Property $fileExtension;

The extension default is ‘.php’,here I through judge the $fileExtension empty to determine use ‘.php’ or ‘.html’!

Then let my controller extend BaseController!

Sorry for my poor English!

Hope can help who needs!

because the original chinese topic of this one is locked( when i am answering ) so I copy my answer from there , if you do not know chinese pleas pass by :lol:

 完全没有必要的事  因为yii的view 只是一个中间页面 最终都是会被解析为html 扩展名只是面向设计者的

常规的html页面 改名为php文件也是有效的 。 你如果是为了和美工配合(可见即可得的设计)或者只是为了某种智能提示 如果觉得必要的话自己实现一个渲染器ViewRender类扩展自CViewRender 并在配置文件中安装 扩展名可以自己指定 还有一种方法 是复写Controller(全站都要继承自它才行 但是第三方程序不一定会符合要求)




public function resolveViewFile($viewName,$viewPath,$basePath,$moduleViewPath=null)

{

    if(empty($viewName))

        return false;


    if($moduleViewPath===null)

        $moduleViewPath=$basePath;


    if(($renderer=Yii::app()->getViewRenderer())!==null)

        $extension=$renderer->fileExtension;

    else

        $extension='.php';

    if($viewName[0]==='/')

    {

        if(strncmp($viewName,'//',2)===0)

            $viewFile=$basePath.$viewName;

        else

            $viewFile=$moduleViewPath.$viewName;

    }

    else if(strpos($viewName,'.'))

        $viewFile=Yii::getPathOfAlias($viewName);

    else

        $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName;


    if(is_file($viewFile.$extension))

        return Yii::app()->findLocalizedFile($viewFile.$extension);

    else if($extension!=='.php' && is_file($viewFile.'.php'))

        return Yii::app()->findLocalizedFile($viewFile.'.php');

    else

        return false;

}






把该方法复写掉:

$extension=’.php’; 改为后缀为你自己的 然后继承自它 但最好还是实现自己的渲染器 因为在Widget中也会用碰到后缀问题 总之你要全局决定(yii在安装viewRender后可以同时支持 自定义后缀视图 和php------在前者找不到时用php做后缀)实现自己的视图渲染器也不是太复杂:




<?php


class MyViewRenderer extends CApplicationComponent implements IViewRenderer

{

	

	public $fileExtension='.html';


	

	

	/**

	 * Renders a view file.

	 *

	 * This method is required by {@link IViewRenderer}.

	 *

	 * @param CBaseController $context the controller or widget who is rendering the view file.

	 * @param string $sourceFile the view file path

	 * @param mixed $data the data to be passed to the view

	 * @param boolean $return whether the rendering result should be returned

	 * @return mixed the rendering result, or null if the rendering result is not needed.

	 * @throws CException

	 */

	public function renderFile($context,$sourceFile,$data,$return)

	{

		if($return){

                 return $context->renderInternal($sourceFile,$data,$return);

              }else{

$context->renderInternal($sourceFile,$data,$return);

               }

	}


	

}




请自行测试 安装方法 参照SmartyViewRender :smartyViewRener

I don’t test it :D

谢谢啊!其实正如你说的这个地方不是特别必要,不过我也通过重写resolveViewFile方法解决了!呵呵!