yii blog tutorial Problem

Hi,

I’m just using the yii blog tutorial and have some strange problems.

I’m now on side 19 and have done what the tutorial said.

PHP have some problems:


http://localhost/blog/index.php?r=post/create




PHP Error

Description


require(content.php) [<a href='function.require'>function.require</a>]: failed to open stream: No such file or directory

Source File


E:\Workspace\yii\framework\YiiBase.php(231)


00219: 

00220:         if(class_exists($alias,false) || interface_exists($alias,false))

00221:             return self::$_imports[$alias]=$alias;

00222: 

00223:         if(isset(self::$_coreClasses[$alias]) || ($pos=strrpos($alias,'.'))===false)  // a simple class name

00224:         {

00225:             self::$_imports[$alias]=$alias;

00226:             if($forceInclude)

00227:             {

00228:                 if(isset(self::$_coreClasses[$alias])) // a core class

00229:                     require(YII_PATH.self::$_coreClasses[$alias]);

00230:                 else

00231: require($alias.'.php');

00232:             }

00233:             return $alias;

00234:         }

00235: 

00236:         if(($className=(string)substr($alias,$pos+1))!=='*' && (class_exists($className,false) || interface_exists($className,false)))

00237:             return self::$_imports[$alias]=$className;

00238: 

00239:         if(($path=self::getPathOfAlias($alias))!==false)

00240:         {

00241:             if($className!=='*')

00242:             {

00243:                 self::$_imports[$alias]=$className;


Stack Trace


#0 E:\Workspace\yii\framework\YiiBase.php(231): import()

#1 E:\Workspace\yii\framework\validators\CValidator.php(137): import()

#2 E:\Workspace\yii\framework\base\CModel.php(420): createValidator()

#3 E:\Workspace\yii\framework\db\ar\CActiveRecord.php(2183): Post->createValidators()

#4 E:\Workspace\yii\framework\db\ar\CActiveRecord.php(1039): CActiveRecordMetaData->getValidators()

#5 E:\Workspace\yii\framework\base\CModel.php(274): Post->getValidators()

#6 E:\Workspace\yii\framework\base\CModel.php(305): Post->getValidatorsForAttribute()

#7 E:\Workspace\yii\framework\web\helpers\CHtml.php(1025): Post->isAttributeRequired()

#8 E:\Workspace\blog\protected\views\post\_form.php(12): activeLabelEx()

#9 E:\Workspace\yii\framework\web\CBaseController.php(119): require()

#10 E:\Workspace\yii\framework\web\CBaseController.php(88): PostController->renderInternal()

#11 E:\Workspace\yii\framework\web\CController.php(701): PostController->renderFile()

#12 E:\Workspace\blog\protected\views\post\create.php(11): PostController->renderPartial()

#13 E:\Workspace\yii\framework\web\CBaseController.php(119): require()

#14 E:\Workspace\yii\framework\web\CBaseController.php(88): PostController->renderInternal()

#15 E:\Workspace\yii\framework\web\CController.php(701): PostController->renderFile()

#16 E:\Workspace\yii\framework\web\CController.php(640): PostController->renderPartial()

#17 E:\Workspace\blog\protected\controllers\PostController.php(74): PostController->render()

#18 E:\Workspace\yii\framework\web\actions\CInlineAction.php(32): PostController->actionCreate()

#19 E:\Workspace\yii\framework\web\CController.php(300): CInlineAction->run()

#20 E:\Workspace\yii\framework\web\filters\CFilterChain.php(129): PostController->runAction()

#21 E:\Workspace\yii\framework\web\filters\CFilter.php(41): CFilterChain->run()

#22 E:\Workspace\yii\framework\web\CController.php(952): CAccessControlFilter->filter()

#23 E:\Workspace\yii\framework\web\filters\CInlineFilter.php(59): PostController->filterAccessControl()

#24 E:\Workspace\yii\framework\web\filters\CFilterChain.php(126): CInlineFilter->filter()

#25 E:\Workspace\yii\framework\web\CController.php(283): CFilterChain->run()

#26 E:\Workspace\yii\framework\web\CController.php(257): PostController->runActionWithFilters()

#27 E:\Workspace\yii\framework\web\CWebApplication.php(332): PostController->run()

#28 E:\Workspace\yii\framework\web\CWebApplication.php(120): CWebApplication->runController()

#29 E:\Workspace\yii\framework\base\CApplication.php(133): CWebApplication->processRequest()

#30 E:\Workspace\blog\index.php(11): CWebApplication->run()



PostController.php




<?php


class PostController extends CController

{

	const PAGE_SIZE=10;


	/**

	 * @var string specifies the default action to be 'list'.

	 */

	public $defaultAction='list';


	/**

	 * @var CActiveRecord the currently loaded data model instance.

	 */

	private $_model;


	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

		);

	}


	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'list' and 'show' actions

				'actions'=>array('list','show'),

				'users'=>array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','update'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

		);

	}


	/**

	 * Shows a particular model.

	 */

	public function actionShow()

	{

		$this->render('show',array('model'=>$this->loadPost()));

	}


	/**

	 * Creates a new model.

	 * If creation is successful, the browser will be redirected to the 'show' page.

	 */

	public function actionCreate()

	{

		$model=new Post;

		if(isset($_POST['Post']))

		{

			$model->attributes=$_POST['Post'];

			if($model->save())

				$this->redirect(array('show','id'=>$model->id));

		}

		$this->render('create',array('model'=>$model));

	}


	/**

	 * Updates a particular model.

	 * If update is successful, the browser will be redirected to the 'show' page.

	 */

	public function actionUpdate()

	{

		$model=$this->loadPost();

		if(isset($_POST['Post']))

		{

			$model->attributes=$_POST['Post'];

			if($model->save())

				$this->redirect(array('show','id'=>$model->id));

		}

		$this->render('update',array('model'=>$model));

	}


	/**

	 * Deletes a particular model.

	 * If deletion is successful, the browser will be redirected to the 'list' page.

	 */

	public function actionDelete()

	{

		if(Yii::app()->request->isPostRequest)

		{

			// we only allow deletion via POST request

			$this->loadPost()->delete();

			$this->redirect(array('list'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}


	/**

	 * Lists all models.

	 */

	public function actionList()

	{

		$criteria=new CDbCriteria;


		$pages=new CPagination(Post::model()->count($criteria));

		$pages->pageSize=self::PAGE_SIZE;

		$pages->applyLimit($criteria);


		$models=Post::model()->findAll($criteria);


		$this->render('list',array(

			'models'=>$models,

			'pages'=>$pages,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$this->processAdminCommand();


		$criteria=new CDbCriteria;


		$pages=new CPagination(Post::model()->count($criteria));

		$pages->pageSize=self::PAGE_SIZE;

		$pages->applyLimit($criteria);


		$sort=new CSort('Post');

		$sort->applyOrder($criteria);


		$models=Post::model()->findAll($criteria);


		$this->render('admin',array(

			'models'=>$models,

			'pages'=>$pages,

			'sort'=>$sort,

		));

	}


	/**

	 * Returns the data model based on the primary key given in the GET variable.

	 * If the data model is not found, an HTTP exception will be raised.

	 * @param integer the primary key value. Defaults to null, meaning using the 'id' GET variable

	 */

	public function loadPost($id=null)

	{

		if($this->_model===null)

		{

			if($id!==null || isset($_GET['id']))

				$this->_model=Post::model()->findbyPk($id!==null ? $id : $_GET['id']);

			if($this->_model===null)

				throw new CHttpException(404,'The requested page does not exist.');

		}

		return $this->_model;

	}


	/**

	 * Executes any command triggered on the admin page.

	 */

	protected function processAdminCommand()

	{

		if(isset($_POST['command'], $_POST['id']) && $_POST['command']==='delete')

		{

			$this->loadPost($_POST['id'])->delete();

			// reload the current page to avoid duplicated delete actions

			$this->refresh();

		}

	}

}



Post-Model




<?php


class Post extends CActiveRecord

{

	/**

	 * The followings are the available columns in table 'Post':

	 * @var integer $id

	 * @var string $title

	 * @var string $content

	 * @var string $contentDisplay

	 * @var string $tags

	 * @var integer $status

	 * @var integer $createTime

	 * @var integer $updateTime

	 * @var integer $commentCount

	 * @var integer $authorId

	 */


	const STATUS_DRAFT		= 0;

	const STATUS_PUBLISHED	= 1;

	const STATUS_ARCHIVED	= 2;


	/**

	 * Returns the static model of the specified AR class.

	 * @return CActiveRecord the static model class

	 */

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'Post';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		return array(

			array('title', 'content', 'status', 'required'),

			array('title', 'length', 'max' => 128 ),

			array('status', 'in', 'range' => array(0,1,2)),

			array('tags', 'match', 'pattern' => '/*[\w\s,]+$/', 'message' => 'Tags can only contain word characters'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		return array(

			'author'	=> array( self::BELONGS_TO, 'User', 'authorId'),

			'comments'	=> array( self::HAS_MANY, 'Comment', 'postId', 'order' => '??.createTime'),

			'tagsFilter'=> array( self::MANY_MANY, 'Tag', 'PostTag(postId, tagId)',

				'together'	=> true,

				'joinType'	=> 'INNER JOIN',

				'condition'	=> '??.name=:tag',

			),

		);

	}


	public function safeAttributes()

	{

		return array('title', 'content', 'status', 'tags');

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id'=>'Id',

			'title'=>'Title',

			'content'=>'Content',

			'contentDisplay'=>'Content Display',

			'tags'=>'Tags',

			'status'=>'Status',

			'createTime'=>'Create Time',

			'updateTime'=>'Update Time',

			'commentCount'=>'Comment Count',

			'authorId'=>'Author',

		);

	}


	public function getStatusOptions()

	{

		return array(

			self::STATUS_DRAFT		=> 'Draft',

			self::STATUS_PUBLISHED	=> 'Published',

			self::STATUS_ARCHIVED	=> 'Archived',

		);

	}

	

	public function getStatusText()

	{

		$options = $this->statusOptions;

		return isset( $options[$this->status]) ? $options[$this->status] : "unknown ({$this->status})";

	}

}



I do not understand where is the problem?!!?

please help

thx

This line isn’t correct (the framework looks for a ContentValidator implementation):

array(‘title’, ‘content’, ‘status’, ‘required’),

Change it to:

array(‘title, content, status’, ‘required’),

/Tommy

omg ;D

thx you!!!

is it possible to get better informations about the errors?

A better debug mode?