تالار گفتمان nCIS.ir

نسخه‌ی کامل: شی مدل (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام

آیا وقتی ما یک شی از مدل میسازیم ، این شی تمامی اطلاعات موجود درون آن جدول را درون خود ذخیره کرده است؟
خیر، هر شئ از هر مدل، توی معماری ActiveRecord فقط و فقط نماینده یک رکورد از جدول مربوطه است.
خب در جلسه 9 actionView فایل issueController رو ببینید
	public function actionView($id)
	{
		$issue=$this->loadModel($id , false);
		$comment=$this->createComment($issue);
		$this->render('view',array(
			'model'=>$issue,
			'comments' => $comment,
		));
	}
اینم از CreateComment
	protected function createComment($issue){
		$comment= new Comment;
		if(isset($_POST['Comment'])){
			$comment->attributes=$_POST['Comment'];
			if ($issue->addComment($comment)){
				Yii::app()->user->setFlash('commentSubmitted' , 'your comment has been send');
				$this->refresh();
			}
		}
		return $comment;
	}
و اینم View که داره کل کامنت ها رو نشون میده
<?php foreach($comments as $comment): ?>
<div class="comment">
      <div class="author">
		<?php echo $comment->author->username; ?>:
	</div>

	<div class="time">
		on <?php echo date('F j, Y at h:i a',strtotime($comment->create_time)); ?>
	</div>

	<div class="content">
		<?php echo nl2br(CHtml::encode($comment->content)); ?>
	</div>
     <hr>
</div><!-- comment -->
<?php endforeach; ?>
خوب این بخاطر اینه که توی کنترلر اومدیم تمام کامنتهای یک پست رو خوندیم و توی آرایه comments$ ریختیم. درواقع هر خونه از این آرایه یک شئ از کلاس ActiveRecord هست که معادل یک رکورد در جدول Comments محسوب میشه.
میشه بگید دقیقا کجا ؟

اینم از loadMoadel مون
	public function loadModel($id , $withComments=FALSE)
	{
		if ($withComments){
			$model=Issue::model()->with(array('comments'=>array('with'=>'author')))->findByPk($id);
		}else{
			$model=Issue::model()->findByPk($id);
		}
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}
کدی که شما برای ویو گذاشتین، comments.php_ هست درحالی که ما توی کنترلر ویوی view.php رو رندر کردیم. توی view.php خطوط 46 به بعد این کدها وجود داره:
<div id="comments">
    <?php if($model->commentCount >= 1): ?>
    <h3>
        <?php echo $model->commentCount > 1 ? $model->commentCount . ' comments' : 'One comment'; ?>
    </h3>

    <?php $this->renderPartial('_comments', array('comments' => $model->comments)); ?>

    <?php endif; ?>

    <h3>Leave a Comment</h3>

    <?php if(Yii::app()->user->hasFlash('commentSubmitted')): ?>

    <div class="flash-success">
        <?php echo Yii::app()->user->getFlash('commentSubmitted'); ?>
    </div>

    <?php else: ?>

    <?php $this->renderPartial('/comment/_form', array('model' => $comment)); ?>

    <?php endif; ?>
</div>
که اگه دقت کنید، به خوبی متوجه میشین که کجا، comments$ ساخته میشه و برای comments.php_ ارسال میشه.
منظورتون این خطه
 <?php $this->renderPartial('_comments', array('comments' => $model->comments)); ?>

باز اگه دقیقتر نگاه کنیم این کامنتا به وسیله متد createComment در actionView ساخته شده و درون createComment هم یک شی از مدل کامنت ساخته شده

هنوز واسم مبهمه کجا کل کامنتامون داره ساخته میشه؟
شما هربار که یک کامنت جدید ثبت میکنید، createComment صدا زده میشه ولی model->comments$ داره با کمک Relation تعریف شده توی مدل Issue کامنتهاش رو از دیتابیس میخونه و هیچ ارتباطی به createComment نداره.