Error In Building A Blog From The Yii Blog Tuutorial

Hello.

I have been trying to follow the blog tutorial, and am stuck in a place. }

I get the error "Fatal error: Call to undefined method Lookup::items() in C:\xampp\htdocs\ablog\protected\views\post\_form.php on line 41" — when i try to Update a post, or create a new Post.

This is the section of the blog tutorial i am currently in - http://www.yiiframework.com/doc/blog/1.1/en/post.create

I have been doing exactly as it was specified. Below is my entire _form.php ->


<?php

/* @var $this PostController */

/* @var $model Post */

/* @var $form CActiveForm */

?>


<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'post-form',

	// Please note: When you enable ajax validation, make sure the corresponding

	// controller action is handling ajax validation correctly.

	// There is a call to performAjaxValidation() commented in generated controller code.

	// See class documentation of CActiveForm for details on this.

	'enableAjaxValidation'=>false,

)); ?>


	<p class="note">Fields with <span class="required">*</span> are required.</p>


	<?php echo $form->errorSummary($model); ?>


	<div class="row">

		<?php echo $form->labelEx($model,'title'); ?>

		<?php echo $form->textField($model,'title',array('size'=>60,'maxlength'=>128)); ?>

		<?php echo $form->error($model,'title'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'content'); ?>

		<?php echo $form->textArea($model,'content',array('rows'=>6, 'cols'=>50)); ?>

		<?php echo $form->error($model,'content'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'tags'); ?>

		<?php echo $form->textArea($model,'tags',array('rows'=>6, 'cols'=>50)); ?>

		<?php echo $form->error($model,'tags'); ?>

	</div>


	<div class="row">

		<?php echo $form->dropDownList($model,'status',Lookup::items('PostStatus')); ?>

        </div>


	<div class="row buttons">

		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->

…and my Post.php ->


<?php


/**

 * This is the model class for table "tbl_post".

 *

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

 * @property integer $id

 * @property string $title

 * @property string $content

 * @property string $tags

 * @property integer $status

 * @property integer $create_time

 * @property integer $update_time

 * @property integer $author_id

 *

 * The followings are the available model relations:

 * @property Comment[] $comments

 * @property User $author

 */

class Post extends CActiveRecord

{

    

    const STATUS_DRAFT=1;

    const STATUS_PUBLISHED=2;

    const STATUS_ARCHIVED=3;

	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'tbl_post';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

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

			array('status, create_time, update_time, author_id', 'numerical', 'integerOnly'=>true),

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

			array('tags', 'safe'),

			// The following rule is used by search().

			// @todo Please remove those attributes that should not be searched.

			array('id, title, content, tags, status, create_time, update_time, author_id', 'safe', 'on'=>'search'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

{

    return array(

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

        'comments' => array(self::HAS_MANY, 'Comment', 'post_id',

            'condition'=>'comments.status='.Comment::STATUS_APPROVED,

            'order'=>'comments.create_time DESC'),

        'commentCount' => array(self::STAT, 'Comment', 'post_id',

            'condition'=>'status='.Comment::STATUS_APPROVED),

    );

}


	/**

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

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'title' => 'Title',

			'content' => 'Content',

			'tags' => 'Tags',

			'status' => 'Status',

			'create_time' => 'Create Time',

			'update_time' => 'Update Time',

			'author_id' => 'Author',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 *

	 * Typical usecase:

	 * - Initialize the model fields with values from filter form.

	 * - Execute this method to get CActiveDataProvider instance which will filter

	 * models according to data in model fields.

	 * - Pass data provider to CGridView, CListView or any similar widget.

	 *

	 * @return CActiveDataProvider the data provider that can return the models

	 * based on the search/filter conditions.

	 */

	public function search()

	{

		// @todo Please modify the following code to remove attributes that should not be searched.


		$criteria=new CDbCriteria;


		$criteria->compare('id',$this->id);

		$criteria->compare('title',$this->title,true);

		$criteria->compare('content',$this->content,true);

		$criteria->compare('tags',$this->tags,true);

		$criteria->compare('status',$this->status);

		$criteria->compare('create_time',$this->create_time);

		$criteria->compare('update_time',$this->update_time);

		$criteria->compare('author_id',$this->author_id);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}


	/**

	 * Returns the static model of the specified AR class.

	 * Please note that you should have this exact method in all your CActiveRecord descendants!

	 * @param string $className active record class name.

	 * @return Post the static model class

	 */

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}

        

        

        public function normalizeTags($attribute,$params)

        {

            $this->tags=Tag::array2string(array_unique(Tag::string2array($this->tags)));

        }

        

        public static function string2array($tags)

        {

            return preg_split('/\s*,\s*/',trim($tags),-1,PREG_SPLIT_NO_EMPTY);

        }

        

        public static function array2string($tags)

        {

            return implode(', ',$tags);

        } 

                    

        public function getUrl()

        {

            return Yii::app()->createUrl('post/view', array(

                'id'=>$this->id,

                'title'=>$this->title,

            ));

        }

        

        public function beforeSave()

        {

            if(parent::beforeSave())

            {

                if($this->isNewRecord)

                {

                    $this->create_time=$this->update_time=time();

                    $this->author_id=Yii::app()->user->id;

                    

                }

                else

                    $this->update_time=time();

                return true;

            }

            else

                return false;

        }

        

        public function afterSave()

        {

            parent::afterSave();

           Tag::model()->updateFrequency($this->_oldTags, $this->tags);

        }

        

        private $_oldTags;

        

        protected function afterFind()

        {

            parent::afterFind();

            $this->_oldTags=$this->tags;

        }

}

Could someone please tell me where i went wrong?

Thanks!

The error is in the view file, so you should start by posting that.

The error message suggests that you’ve either missed or done something wrong in this section of the guide.

Was the exact error,i got it, many thanks!

Hello again,

That did work well, and the posts are updated in the database too, but when i click on the submit update button, i get this screen (and the DB gets updated :|)

Any ideas?

Your models classname above is Post with the method array2string.

And what is ‘Tag’?

Is it a instanceof Post or is it a model that extends Post?

Shouldn’t it be


$this->tags=self::array2string(array_unique(self::string2array($this->tags)));

instead of


$this->tags=Tag::array2string(array_unique(Tag::string2array($this->tags)));

Make sure you’ve done this bit from this section of the guide:

If you have any further problems, you should go back over each section of the guide to make sure that you’ve done everything that’s required.

Thank you for the reply brother, but that didn’t work :(

Wow Keith, thanks again man, you’re a champ. I agree it’s my mistake again, for not following the tutorial properly.

Have a nice day!