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


فهاد لمشروع الجديد غادي نشوفو كيفاش نقادو notes app ب symfony المهم هنا ماشي هي ل app لمهم هو تعرف كيفاش تزيد تعدل وتحدف من قاعدة البيانات بإستعمال symfony ومنبعد يمكنلك تصاوب أي projet بغيتي المشروع بسيط المستخدم كيزيد des notes من بعد يمكنلو يعدلهم أو يمسحهم.

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

1- تحميل المشروع

أول حاجة غادي نمشيو للموقع الرسمي https://symfony.com/doc/current/setup.html من هنا غادي تلقى كيفاش تحمل symfony راه سبقلي شرحتو فدروس سابقة فقط كتinstaller composer منبعد كتمشي ل cmd كتدير لcommand cd c:\xammp\htdocs كنتي خدام ب wamp ولا easyphp كتمشي ل www منبعد كتدير هاد ل command composer create-project symfony/framework-standard-edition symfony_notes هنا سمية المشروع symfony_notes منبعد مكيكمل التحميل كتدخل لل project من http://localhost/symfony_notes/web/app_dev.php منبعد غادي تزيد قاعدة بيانات جديدة فphpmyadmin سميها notes الكود باش تزيد الجداول هو :

                                --
-- Structure de la table `category`
--

CREATE TABLE `category` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Structure de la table `note`
--

CREATE TABLE `note` (
  `id` int(11) NOT NULL,
  `category_id` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `description` longtext COLLATE utf8_unicode_ci NOT NULL,
  `adress` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `ville` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `day` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `time` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `date_ajout` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
                            

2- الإتصال بقاعدة البيانات

من بعد غادي نديرو الإتصال بقاعدة البيانات فيلا كنتي دخلتي سمية قاعدة البيانات ول user ولpassword فلinstallation غير نقز هاد المرحلة مكنتيش كتمشي للمجلد app/config وللملف parameters.yml وكتزيد سمية قاعدة البيانات و ل user و لpassword الكود ديال الملف هو :

                                # This file is auto-generated during the composer install
parameters:
    database_host: 127.0.0.1
    database_port: null
    database_name: notes
    database_user: root
    database_password: null
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mailer_user: null
    mailer_password: null
    secret: 12222333322233322333

                            

3- الصفحة الأساسية

فالمجلد app/resources/views كاين الملف base.html.twig هادا هو الملف الرئيسي لي غادي يكون فيه لcontenu ديال كل الصفحات لي غادي نزيدو من بعد وغادي يكون فيها روابط css وjavascript والقائمة ديال التصفح و twig هو moteur de templates كتخدم به symfony فهاد الملف هو la base ديال الصفحات ديالنا الكود ديالو هو :

                                <!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Symfony Notes{% endblock %}</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        {% block stylesheets %}
        {% endblock %}
        <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
    </head>
    <body>
        <nav class="navbar navbar-default">
            <div class="container">
                <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Symfony Notes</a>
                </div>
                <div id="navbar" class="collapse navbar-collapse">
                <ul class="nav navbar-nav">
                    <li><a href="{{ path('homepage')}}">Accueil</a></li>
                </ul>
                <ul class="nav navbar-nav">
                    <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Notes <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="{{path('list_notes')}}">Liste des notes</a></li>
                        <li><a href="{{path('add_note')}}">Ajouter une note</a></li>
                    </ul>
                    </li>
                </ul>
                <ul class="nav navbar-nav">
                    <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Catégories <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="{{ path('list_categories') }}">Liste des catégories</a></li>
                        <li><a href="{{ path('add_category') }}">Ajouter une catégorie</a></li>
                    </ul>
                    </li>
                </ul>
                </div><!--/.nav-collapse -->
            </div>
        </nav>

    <div class="container">
        {% for message in app.session.flashbag.get('success') %}
            <div class="alert alert-success">{{message}}</div>
        {% endfor %}
        {% block body %}{% endblock %}
    </div>
    {% block javascripts %}
    {% endblock %}
    <script
        src="https://code.jquery.com/jquery-3.2.1.min.js"
        integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
        crossorigin="anonymous">
    </script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    </body>
</html>

                            

4- CategoriesController.php

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

                                    <?php

namespace AppBundle\Controller;
use AppBundle\Entity\Category;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class CategoriesController extends Controller
{
    /**
     * @Route("/categories", name="list_categories")
     */
    public function indexAction(Request $request)
    {
        $categories = $this->getDoctrine()
            ->getRepository('AppBundle:Category')
            ->findAll();
        // replace this example code with whatever you need
        return $this->render('categories/index.html.twig', [
            'categories' => $categories,
        ]);
    }
    /**
     * @Route("/categories/add", name="add_category")
     */
    public function addAction(Request $request)
    {
        $categorie = new Category();
        //creating the form 
        $form = $this->createFormBuilder($categorie)
            ->add('name', TextType::class,array('label' => 'Nom :','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()) {
            $categorie = $form->getData();
            $date = new \DateTime("now");
            $categorie->setCreatedAt($date);
            $em = $this->getDoctrine()->getManager();
            $em->persist($categorie);
            $em->flush();
            $this->addFlash('success','Catégorie ajoutée');
            return $this->redirectToRoute('list_categories');
        }
        // replace this example code with whatever you need
        return $this->render('categories/add.html.twig', [
             'form' => $form->createView(),
        ]);
    }
    /**
    * @Route("/categories/edit/{id}", name="edit_category")
    */
    public function editAction(Request $request,$id)
    {
        $em = $this->getDoctrine()->getManager();
        $categorie = $em->getRepository('AppBundle:Category')->find($id);
        if (!$categorie) {
            throw $this->createNotFoundException(
                'Aucune catégorie avec ce id '.$categorieId
            );
        }
        $form = $this->createFormBuilder($categorie)
        ->add('name', TextType::class,array('label' => 'Nom :','attr'=>array('class'=>'form-control','style'=>'margin-bottom:15px')))
        ->add('save', SubmitType::class, array('label' => 'Modifier','attr'=>array('class'=>'btn btn-success')))
        ->getForm();
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $categorie = $form->getData();
            $em->flush();
            $this->addFlash('success','Catégorie modifiée');
            return $this->redirectToRoute('list_categories');
        }
        return $this->render('categories/edit.html.twig', [
             'form' => $form->createView(),
        ]);
    }
    /**
    * @Route("/categories/delete/{id}", name="delete_category")
    */
    public function deleteAction(Request $request,$id)
    {
        $em = $this->getDoctrine()->getManager();
        $categorie = $em->getRepository('AppBundle:Category')->find($id);
        if (!$categorie) {
            throw $this->createNotFoundException(
                'Aucune categorie avec ce id '.$id
            );
        }
        $em->remove($categorie);
        $em->flush();
        $this->addFlash('success','Catégorie supprimée');
        return $this->redirectToRoute('list_categories');
    }
}

                                

5- Category.php

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

                                    <?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

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

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $createdAt;


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

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

        return $this;
    }

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

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     *
     * @return Category
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

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

                                


إشترك في قناتنا على اليوتيوب

بحث في الموقع


إشترك للتوصل بالجديد