كيفاش تصاوب blog ب nette framework الجزء الثاني

فهاد الجزء الثاني من كيفاش تصاوب blog ب nette framework غادي نكملو الملفات لي غادي يمكنونا من عرض المواضيع لي عندنا فقاعدة البيانات فالصفحة الرئيسية وأيضا غادي نزيدو الملفات لي غادي يمكنو من عرض موضوع واحد اختارو المستخدم.

نظرة سريعة بالفيديو


1- الملف default.latte


فالمجلد Homepage كاين الملف default.latte لي هو الصفحة الرئيسية ديالنا ولي كتستقبل المواضيع لي ترسلو من لfonction renderDefault وكنخدم ب foreach باش كنعرض المعلومات الخاصة بكل موضوع ثم كاين الرابط ليكيوجه الأدمن للصفحة الخاصة بإضافة موضوع جديد وأيضا مشاهدة موضوع اختارو ولي غادي نزيدوهوم من بعد الكود ديال الملف هو :

                                    
                                        
{block content}
<div class="container">
<div class="pull-right">
<a n:href="Post:create" class="btn btn-primary" n:if="$user->loggedIn">Nouveau post</a>
</div>
</div>
<div id="content">
	<div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-default">
                 <h1 n:block="title" class="text-center text-success">Les derniers posts</h1>
                {foreach $posts as $post}
                <div class="post">
                    <h2>{$post->title}</h2>
                    <div>{$post->body}</div>
                    <div class="label label-danger">{$post->created_at|date:'F j, Y'}</div>
                    <a n:href="Post:show $post->id">Voir</a>
                </div>
                {/foreach}
            </div>
        </div>
    </div>
</div>
                                    
                                

2- الملف PostPresenter.php


فالمجلد presenters لي هما لcontrollers عند لframeworks لخرين غادي نزيد ملف جديد نسميه PostPresenter.php هادا ل controller فيه لfonctions لي غادي يمكنو من التعامل مع المواضيع فأولا كاين renderShow لي كتسترجع موضوع اختارو المستخدم بالإعتماد على لid ديالو وكتسترجع التعليقات الخاصة بهاد الموضوع وكترسلهم للصفحة show لي غادي تمكن من عرض موضوع ثم كاين createComponentCommentForm لي كانزيدو بها الفورم لي كيمكن من إضافة تعليق ولي غادي تكون فالملف show ثم كاين commentFormSucceeded ولي كتزيد تعليق فقاعدة البيانات فالجدول الخاص بالتعاليق ثم كاين createComponentPostForm لي كانزيدو بها الفورم لي كيمكن من إضافة موضوع ولي غادي تكون فالملف create ثم كاين postFormSucceeded لي كتحقق واش ترسل لid ديال الموضوع يلا ترسل فكيعني بلي المستخدم كيدير تعديل على موضوع كتعدلو مكانش لid يعني المستخدم كيزيد موضوع كتزيدو ثم كاين actionEdit لي كتحقق واش الأدمن مكونيكطي مكنش كتردو للصفحة الرئيسية كان كتعمر الفورم ديال التعديل بالمعلومات الخاصة بالموضوع لي غادي يعدل الأدمن ثم كاين actionCreate لي كتفرض على الأدمن انه يكون مكونيكطي باش يضيف شي موضوع الكود ديال الملف هو :

                                    
                                        <?php
namespace App\Presenters;

use Nette;
use Nette\Application\UI\Form;


class PostPresenter extends Nette\Application\UI\Presenter
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderShow($postId)
    {
        $post = $this->database->table('posts')->get($postId);
        if (!$post) {
            $this->error('Post introuvable');
        }
        $this->template->post = $this->database->table('posts')->get($postId);
        $this->template->post = $post;
        $this->template->comments = $post->related('comments')->order('created_at');
    }
    protected function createComponentCommentForm()
    {
        $form = new Form; // means Nette\Application\UI\Form
        $form->addText('name', 'Nom:')
            ->setRequired('Veuillez entrer votre nom');
        $form->addEmail('email', 'Email:')->setRequired('Veuillez entrer votre email');
        $form->addTextArea('content', 'Commentaire:')
            ->setRequired('Veuillez entrer votre commentaire');
        $form->addSubmit('send', 'Publier');
        $form->onSuccess[] = [$this, 'commentFormSucceeded'];
        return $form;
    }
    public function commentFormSucceeded($form, $values)
    {
        $postId = $this->getParameter('postId');
        $this->database->table('comments')->insert([
            'post_id' => $postId,
            'name' => $values->name,
            'email' => $values->email,
            'body' => $values->content,
        ]);
        $this->flashMessage('Commentaire ajouté', 'success');
        $this->redirect('this');
    }
    protected function createComponentPostForm()
    {
        $form = new Form;
        $form->addText('title', 'Titre:')
            ->setRequired();
        $form->addTextArea('body', 'Déscription:')
            ->setRequired();
        $form->addSubmit('send', 'Valider');
        $form->onSuccess[] = [$this, 'postFormSucceeded'];
        return $form;
    }
    public function postFormSucceeded($form, $values)
    {
        $postId = $this->getParameter('postId');
        if($postId){
            $post = $this->database->table('posts')->get($postId);
            $post->update($values);
        }else{
            $post = $this->database->table('posts')->insert($values);
        }
        $this->flashMessage('Post publié', 'success');
        $this->redirect('show', $post->id);
    }
    public function actionEdit($postId)
    {
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }
        $post = $this->database->table('posts')->get($postId);
        if (!$post) {
            $this->error('Post introuvable');
        }
        $this['postForm']->setDefaults($post->toArray());
    }
    public function actionCreate()
    {
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }
    }
    
}
                                    
                                

3- الملف create.latte


فالمجلد template كنزيد مجلد جديد سميه post فيه زيد ملف جديد سميه create.latte هادا الملف لي غادي تكون فيه الفورم لي غادي تمكنا من إضافة موضوع لقاعدة البيانات وهي لي زدنا فل fonction createComponentPostForm لي زدناها فالملف PostPresenter.php فهنا فلnette framework باش نزيد الفورم كنزيد فقط هاد السطر {control postForm} لي كيعرض الفورم فالملف الكود ديال الملف هو:

                                      
                                        {block content}
<div class="container">
<div class="pull-right">
<a href="Homepage:edit" class="btn btn-primary">Modifier post</a>
</div>
</div>
<div id="content">
	<div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-default">
                <h1 n:block="title" class="text-center text-primary">Ajouter un post</h1>
                <div class="post">
                  <div class="row">
                     <div class="col-md-6 col-md-offset-3">
                     {control postForm}
                     </div>
                  </div>
                </div>
            </div>
        </div>
    </div>
</div>
                                      
                                    

4- الملف edit.latte


فالمجلد post فيه زيد ملف جديد سميه edit.latte هادا الملف لي غادي تكون فيه الفورم لي غادي تمكنا من تعديل موضوع فقاعدة البيانات وهي لي زدنا فل fonction createComponentPostForm لي زدناها فالملف PostPresenter.php فهنا فلnette framework باش نزيد الفورم كنزيد فقط هاد السطر {control postForm} لي كيعرض الفورم فالملف فهنا كنخدم بنفس الفورم فقط فالتعديل كيتم ملء الحقول بالمعلومات الخاصة بالموضوع لي غادي تعدل الكود ديال الملف هو:

                                        
                                            {block content}
<div class="container">
<div class="pull-right">
<a href="Homepage:edit" class="btn btn-primary">Modifier post</a>
</div>
</div>
<div id="content">
	<div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-default">
                <h1 n:block="title" class="text-center text-primary">Modifier un post</h1>
                <div class="post">
                  <div class="row">
                     <div class="col-md-6 col-md-offset-3">
                     {control postForm}
                     </div>
                  </div>
                </div>
            </div>
        </div>
    </div>
</div>
                                        
                                    

كلمات مفاتيح :