You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					57 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					57 lines
				
				1.3 KiB
			| 
											8 years ago
										 | <?php
 | ||
|  | 
 | ||
|  | namespace frontend\widgets\post;
 | ||
|  | 
 | ||
|  | use core\entities\post\PostComment;
 | ||
|  | use core\entities\post\Post;
 | ||
|  | use core\forms\post\PostCommentForm;
 | ||
|  | use yii\base\InvalidConfigException;
 | ||
|  | use yii\base\Widget;
 | ||
|  | 
 | ||
|  | class CommentsWidget extends Widget
 | ||
|  | {
 | ||
|  |     /**
 | ||
|  |      * @var Post
 | ||
|  |      */
 | ||
|  |     public $post;
 | ||
|  | 
 | ||
|  |     public function init(): void
 | ||
|  |     {
 | ||
|  |         if (!$this->post) {
 | ||
|  |             throw new InvalidConfigException('Specify the post.');
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function run(): string
 | ||
|  |     {
 | ||
|  |         $form = new PostCommentForm();
 | ||
|  | 
 | ||
|  |         $comments = $this->post->getPostComments()
 | ||
|  |             ->orderBy(['parent_id' => SORT_ASC, 'id' => SORT_ASC])
 | ||
|  |             ->all();
 | ||
|  | 
 | ||
|  |         $items = $this->treeRecursive($comments, null);
 | ||
|  | 
 | ||
|  |         return $this->render('comments/comments', [
 | ||
|  |             'post' => $this->post,
 | ||
|  |             'items' => $items,
 | ||
|  |             'commentForm' => $form,
 | ||
|  |         ]);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * @param PostComment[] $comments
 | ||
|  |      * @param integer $parentId
 | ||
|  |      * @return CommentView[]
 | ||
|  |      */
 | ||
|  |     public function treeRecursive(&$comments, $parentId): array
 | ||
|  |     {
 | ||
|  |         $items = [];
 | ||
|  |         foreach ($comments as $comment) {
 | ||
|  |             if ($comment->parent_id == $parentId) {
 | ||
|  |                 $items[] = new CommentView($comment, $this->treeRecursive($comments, $comment->id));
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return $items;
 | ||
|  |     }
 | ||
|  | }
 |