كيفاش تصاوب Notes Application ب symfony framework الجزء الثالت

فهاد الجزء الثالت من كيفاش تصاوب Notes Application ب symfony framework غادي نشوفو الملفات الخاصين ب les notes ولي غادي يكون فيهم ل Model ول Controller والملفات لي غادي تكون فيهم الفورم ديال إضافة وتعديل note والملف لي غادي يكون هو الصفحة الرئيسية لي كتعرض كل les notes لي عندنا.

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


1- NotesController.php


فالمجلد app/src/AppBundle/controller كتزيد ملف جديد سميه NotesController.php هاد ل controller فيه ل les fonctions لي غادي يمكنو من التعامل مع les notes فأولا كاين indexAction لي كتسترجع les notes من قاعدة البيانات بواسطة Model Note لي غادي نزيدوه من بعد وكترسلهم للصفحة index لي غادي تمكن من عرض les notes ولي هي الصفحة الرئيسية ديال les notes ثم كاين addAction لي كتمكن من إضافة note فأولا كت créer ل form بل function createFormBuilder منبعد كتاكد واش الفورم validé يلا كان كتستقبل المعلومات لي ترسلو من الفورم ولي غادي تكون فالملف add.html.twig وكتزيدهم فقاعدة البيانات فالجدول notes ثم كاين editAction لي كتجبد note لي اختارها المستخدم من قاعدة البيانات ولي يلا ماكانتش كتعرض رسالة خطأ كانت كت créer ل form بل function createFormBuilder منبعد كتاكد واش الفورم validé يلا كان كتستقبل المعلومات لي ترسلو من الفورم ولي غادي تكون فالملف edit.html.twig منبعد كتقوم بالتعديل بالإعتماد على ل id ديال ل note ثم كاين deleteAction لي كتحدف note اختارها المستخدم بالإعتماد على لid ديالها وواحد القضية نسيت مقولتهاش فل CategoriesController.php لي هي les routes فعكس les frameworks لي شفنا قبل les routes كيتزادو فل controller وهنا غادي تلقاهم باديين ب @ فcommentaire وهادي هي الطريقة باش كنزيدو les routes ف symfony الكود ديال الملف هو :

                                    
                                        <?php

namespace AppBundle\Controller;
use AppBundle\Entity\Category;
use AppBundle\Entity\Note;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class NotesController extends Controller
{
    /**
     * @Route("/notes", name="list_notes")
     */
    public function indexAction(Request $request)
    {
        $categories = $this->getDoctrine()
            ->getRepository('AppBundle:Note')
            ->findAll();
        // replace this example code with whatever you need
        return $this->render('notes/index.html.twig', [
            'notes' => $categories,
        ]);
    }
    /**
     * @Route("/notes/add", name="add_note")
     */
    public function addAction(Request $request)
    {
        $note = new Note();
        //creating the form 
        $form = $this->createFormBuilder($note)
            ->add('category_id', EntityType::class,array('label' => 'Catégorie :','class'=>'AppBundle:Category','choice_label'=>'name','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('name', TextType::class,array('label' => 'Titre :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('description', TextareaType::class,array('label' => 'Déscription :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('adress', TextType::class,array('label' => 'Adresse :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('ville', TextType::class,array('label' => 'Ville :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('day', TextType::class,array('label' => 'Jour :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('time', TextType::class,array('label' => 'Heure :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('save', SubmitType::class, array('label' => 'Ajouter','attr'=>array('class'=>'btn btn-success')))
            ->getForm();
        //get form data
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $note = $form->getData();
            $date = new \DateTime("now");
            $note->setDateAjout($date);
            $em = $this->getDoctrine()->getManager();
            $em->persist($note);
            $em->flush();
            $this->addFlash('success','Note ajoutée');
            return $this->redirectToRoute('list_notes');
        }
        // replace this example code with whatever you need
        return $this->render('notes/add.html.twig', [
             'form' => $form->createView(),
        ]);
    }
    /**
    * @Route("/notes/edit/{id}", name="edit_note")
    */
    public function editAction(Request $request,$id)
    {
        $em = $this->getDoctrine()->getManager();
        $note = $em->getRepository('AppBundle:Note')->find($id);
        if (!$note) {
            throw $this->createNotFoundException(
                'Aucune note avec ce id '.$id
            );
        }
        $form = $this->createFormBuilder($note)
            ->add('category_id', EntityType::class,array('label' => 'Catégorie :','class'=>'AppBundle:Category','choice_label'=>'name','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('name', TextType::class,array('label' => 'Titre :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('description', TextareaType::class,array('label' => 'Déscription :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('adress', TextType::class,array('label' => 'Adresse :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('ville', TextType::class,array('label' => 'Ville :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('day', TextType::class,array('label' => 'Jour :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('time', TextType::class,array('label' => 'Heure :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
            ->add('save', SubmitType::class, array('label' => 'Modifier','attr'=>array('class'=>'btn btn-success')))
            ->getForm();
        //get form data
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $note = $form->getData();
            $em->flush();
            $this->addFlash('success','Note modifiée');
            return $this->redirectToRoute('list_notes');
        }
        // replace this example code with whatever you need
        return $this->render('notes/edit.html.twig', [
             'form' => $form->createView(),
        ]);
    }
    /**
    * @Route("/notes/delete/{id}", name="delete_note")
    */
    public function deleteAction(Request $request,$id)
    {
        $em = $this->getDoctrine()->getManager();
        $note = $em->getRepository('AppBundle:Note')->find($id);
        if (!$note) {
            throw $this->createNotFoundException(
                'Aucune note avec ce id '.$id
            );
        }
        $em->remove($note);
        $em->flush();
        $this->addFlash('success','Note supprimée');
        return $this->redirectToRoute('list_notes');
    }
}

                                    
                                

2- Note.php


فالمجلد app/src/AppBundle/Entity زيد ملف جديد سميه Notes.php ولي غادي يكون هو ل model لي هضرنا عليه من قبل ولي غادي يكون فيه لgetters وsetters لي غادي يمكنو من استرجاع وتعديل الحقول ديال الجدول notes فهنا خاص les variables تكون عندهم نفس إسم الحقل وكتبع نفس طريقة باش كتبتهم انا او يمكنلك تستعمل لcmd باش تصاوبهم بإستعمال symfony فقط كتنفد هاد لكوموند php bin/console doctrine:generate:entity وكتبع شنو كيقولولك للمزيد من التفاصيل شوف الرابط من هنا https://symfony.com/doc/current/doctrine.html خدمتي بالملف لي عطيتك خص الحقول لي عندك فالجدول تكون مسميهم نفس إسم les variables لي فل model Note وواحد الحاجة أخيرة ولي نسيتها فالملف Category.php مهضرتش عليها هي la relation مابين الجدول notes و categories فهنا ف Note.php تحت لvariable id كاينة la relation ديالنا فيها ManyToOne ولي كتعني بلي كل Category غادي تكون عندها بزاف ديال les notes الكود ديال االملف هو :

                                    
                                        <?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Note
 *
 * @ORM\Table(name="note")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\NoteRepository")
 */
class Note
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="notes")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $categoryId;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text")
     */
    private $description;

    /**
     * @var string
     *
     * @ORM\Column(name="adress", type="string", length=255)
     */
    private $adress;

    /**
     * @var string
     *
     * @ORM\Column(name="ville", type="string", length=255)
     */
    private $ville;

    /**
     * @var string
     *
     * @ORM\Column(name="day", type="string", length=255)
     */
    private $day;

    /**
     * @var string
     *
     * @ORM\Column(name="time", type="string", length=255)
     */
    private $time;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_ajout", type="datetimetz")
     */
    private $dateAjout;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set categoryId
     *
     * @param integer $categoryId
     *
     * @return Note
     */
    public function setCategoryId($categoryId)
    {
        $this->categoryId = $categoryId;

        return $this;
    }

    /**
     * Get categoryId
     *
     * @return int
     */
    public function getCategoryId()
    {
        return $this->categoryId;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Note
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     *
     * @return Note
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set adress
     *
     * @param string $adress
     *
     * @return Note
     */
    public function setAdress($adress)
    {
        $this->adress = $adress;

        return $this;
    }

    /**
     * Get adress
     *
     * @return string
     */
    public function getAdress()
    {
        return $this->adress;
    }

    /**
     * Set ville
     *
     * @param string $ville
     *
     * @return Note
     */
    public function setVille($ville)
    {
        $this->ville = $ville;

        return $this;
    }

    /**
     * Get ville
     *
     * @return string
     */
    public function getVille()
    {
        return $this->ville;
    }

    /**
     * Set day
     *
     * @param string $day
     *
     * @return Note
     */
    public function setDay($day)
    {
        $this->day = $day;

        return $this;
    }

    /**
     * Get day
     *
     * @return string
     */
    public function getDay()
    {
        return $this->day;
    }

    /**
     * Set time
     *
     * @param string $time
     *
     * @return Note
     */
    public function setTime($time)
    {
        $this->time = $time;

        return $this;
    }

    /**
     * Get time
     *
     * @return string
     */
    public function getTime()
    {
        return $this->time;
    }

    /**
     * Set dateAjout
     *
     * @param \DateTime $dateAjout
     *
     * @return Note
     */
    public function setDateAjout($dateAjout)
    {
        $this->dateAjout = $dateAjout;

        return $this;
    }

    /**
     * Get dateAjout
     *
     * @return \DateTime
     */
    public function getDateAjout()
    {
        return $this->dateAjout;
    }
}

                                    
                                

3- الملف notes/add.html.twig


فالمجلد app/resources/views زيد مجلد جديد سميه notes فيه زيد ملف جديد سميه add.html.twig هادا الملف لي غادي تكون فيه الفورم لي غادي تمكنا من إضافة note فقاعدة البيانات بواسطة fonction addAction لي زدناها فالملف NotesController.php والفورم لي صاوبنا تما ورسلناها لهاد الملف هي لي كتعرض فهاد الملف الكود ديال الملف هو:

                                      
                                        {% extends 'base.html.twig' %}

{% block body %}
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title">Ajouter une note</h3>
                </div>
                <div class="panel-body">
                    {{ form_start(form) }}
                    {{ form_widget(form) }}
                    {{ form_end(form) }}
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block stylesheets %}

{% endblock %}
                                      
                                    

4- الملف notes/edit.html.twig


فالمجلد notes فيه زيد ملف جديد سميه edit.html.twig هادا الملف لي غادي تكون فيه الفورم لي غادي تمكنا من تعديل note فقاعدة البيانات بواسطة fonction editAction لي زدناها فالملف NotesController.php والفورم لي صاوبنا تما ورسلناها لهاد الملف هي لي كتعرض فهاد الملف الكود ديال الملف هو:

                                        
                                            {% extends 'base.html.twig' %}

{% block body %}
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title">Modifier une note</h3>
                </div>
                <div class="panel-body">
                    {{ form_start(form) }}
                    {{ form_widget(form) }}
                    {{ form_end(form) }}
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block stylesheets %}

{% endblock %}
                                        
                                    

5- الملف notes/index.html.twig


دائما فالمجلد notes فيه زيد ملف جديد سميه index.html.twig لي هو الصفحة الرئيسية ديال les notes ولي كتستقبل les notes لي ترسلو من لfonction indexAction لي فالملف NotesController.php وكنخدم ب for باش كنعرض المعلومات الخاصة بكل note ثم كاين الروابط ليكيوجهو المستخدم للصفحات الخاصة بتعديل أو حدف note الكود ديال الملف هو :

                                        
                                            {% extends 'base.html.twig' %}

{% block body %}
  <div class="container-fluid">
    <section class="col .col-xs-12 .col-sm-6 .col-md-8 col-lg-12 main">
        <h3 class="text-primary">Notes</h3><hr>
        <table class="table table-striped table-bordered table-responsive">
            <thead>
            <tr><th>Nom</th><th>Catégorie</th><th>Déscription</th><th>Adresse</th><th>Ville</th><th>Jour</th><th>Heure</th><th>Action</th></tr>
            </thead>
            <tbody>
               {% for note in notes %}
                <tr>
                    <td>{{note.name}}</td>
                    <td>{{note.categoryId.name}}</td>
                    <td>{{note.description|slice(0,20) ~ '...' }}</td>
                    <td>{{note.adress}}</td>
                    <td>{{note.ville}}</td>
                    <td>{{note.day}}</td>
                    <td>{{note.time}}</td>
                    <td> 
                        <a href="{{ path('edit_note',{'id':note.id})}}" class="btn btn-warning">Modifier</a>
                        <a href="{{ path('delete_note',{'id':note.id})}}" class="btn btn-danger">Supprimer</a>
                    </td>
                </tr>
               {% endfor %}
            </tbody>
        </table>
    </section>
{% endblock %}

{% block stylesheets %}

{% endblock %}
                                        
                                    

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