صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 28

الموضوع: [درس متقدم] كيفية بناء نظام MVC بسيط

  1. #1
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279

    [ درس متقدم ] كيفية بناء نظام MVC بسيط PHP5



    - بسم الله الرحمن الرحيم -

    السلام عليكم ورحمة الله وبركاته

    كنت وضعت فى توقيعي ان هناك هدية ( صغيرة ) لمطوري ال PHP5 وها هي بين ايديكم

    كيف تبني نظام ( Model – Controller – View )

    المعروف ب MVC و ( المستخدم فى جميع اطارات العمل FrameWorks )

    باستخدام PHP5 و أحد خصائص SPL ) Standard PHP Library )

    وهي مكتبة تحتوي على مجموعة من الواجهات و الكائنات لحل بعض المشاكل القياسية

    تحتاج لتطبيق هذا الدرس توفر نسخة PHP5 و مكتبة SPl المضافة افتراضيا فى نسخة PHP 5

    * انصحك باستخدام Xampp 1.6.3a - يحتوي على نسخة PHP 5.2.3

    وستجد هنا درس تسطيب xampp للاخ الفاضل اشرف السمهوري

    وان يكون لديك خلفية ولو بسيطة عن البرمجة الكائنية والوراثة

    فى هذا الدرس ستتعلم ما هي اساسيات اى نظام MVC اكثر نمط تصميم شيوعا لتطبيقات الويب الكبيرة

    وكيف تبني اساس هذا النظام من الصفر وكيفية التعامل معه .

    @@ الجزء الاول – المقدمة و نقطة اساس النظام @@
    ------------------------------------------------------------
    لنبدا بتوضيح احد اساسيات هذا النظام وهي ( صفحة واحدة تعالجنا { كلنا } :1power: )

    - هما مين { كلنا } دول :anger2:

    اقولك انا دول كل العمليات الى هيتم معالجتها لاظهار المحتوي الذي تريده

    فبدلا من ان تضع هذا السطر فى كل صفحة

    كود PHP:
    <?php
    include ("Global.php");
    // بقية محتويات الكود الخاص بهذا الملف 
    ?>
    سيكون عندنا صفحة تقوم بمعالجة كل العمليات لعرض المطلوب أى اننا لن نكون بحاجة لادراج ملف global.php مثلا فى كل ملف جديد نقوم بعمله

    سنقوم الان ببداية التطبيق ، قم بعمل مجلد فارغ وليكن MVC ثم انشئ ملف فارغ باسم index.php

    الان سنقوم بعمل بعض المهام التى سنحتاجها فى بداية معالجة العمليات ، قم بعمل مجلد includes
    وانشئ ملف startup.php بداخله
    ثم قم باضافة السطر التالى لملف ال index.php
    كود PHP:
    include_once("includes/startup.php"); 
    @ ------ نهاية الجزء الاول ----- @ يتبع .. :deal:





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل



  2. #2
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    @@ الجزء الثاني - مهام البدء و كائن التسجيل @@
    -----------------------------------------------------------

    الجزئية الاولي - مهام البدء :
    ---------------------------------
    ملف البداية يستخدم فى القيام ببعض مهام بداية التنفيذ العامة مثل تعريف الثوابت ،
    و تحديد مستوي الاخطاء المراد تفعيلها ، الحصول على المسار الخاص بالاطار

    سيكون الجزء الاول من ملف البداية startup.php بهذا الشكل
    كود PHP:
    <?php

    error_reporting 
    (E_ALL);

    $ver_error=' Sorry <br /> <h1> PHP 5 Only  !! </h1>' ;

    if (
    version_compare(phpversion(), '5''<') == true) { die ($ver_error); }

    define ('DS'DIRECTORY_SEPARATOR);

    $sitepath realpath(dirname(__FILE__) . DS '..' DS) . DS

    define ('site_path'$sitepath);
    فى السطر الاول قمنا باعداد مستوي الاخطاء لاظهار جميع الاخطاء
    لمزيد عن الاخطاء درس الاخطاء فى لغة PHP للاخ الفاضل أشرف السمهوري
    http://www.tm-world.net/forum/showthread.php?t=462

    ثم فى السطر الثاني قمنا بتنسيق رسالة تحذيرية لعرضها فى حالة عدم استخدام PHP5
    نظرا لان النظام يعتمد بشكل اساسي على بعض ادوات SPL المتوفرة فى PHP5 فقط

    فى السطر الثاالث نقوم بالتاكد من نسخة ال PHP اذا كانت اقل من 5 نقوم بايقاف التنفيذ
    مع اظهار الرسالة السابق تنسيقها فى السطر الثاني

    فى السطر الرابع نقوم بعمل ثابت DS يحتوي على فاصل الادلة DIRECTORY_SEPARATOR
    وهو الباك سلاش [ \ ] لاختصار كتابته ليس اكثر

    فى السطر الخامس نقوم بالحصول على مسار الموقع الحقيقي بهذه الطريقة
    نقوم فى البداية بمعرفة اسم المجلدdirname للملف الحالى __FILE__ وهو فى حالتنا هنا startup.php
    وسيكون اسم المجلد هو includes ثم نضيف \ ثم ال .. ليخرجونا للمجلد الاعلي من includes
    وهو المجلد الرئيسي لنا MVC كما ذكرنا سابقا عند انشاء index.php

    فى السطر السادس نقوم بعمل ثابت site_path يحتوي على قيمة المتغير المحتوي على مسار المجلد الرئيسي فى السطر الخامس $sitepath ليصبح عندنا الثابت site_path به مسار المجلد الرئيسي

    كل ما فى هذا الملف سيتم تنفيذه فى بداية اى تنفيذ لاى ملف فى النظام .

    يتبع بالجزئية الثانية من الجزء الثاني ... :deal:





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  3. #3
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    الجزئية الثانية – كائن التسجيل :
    ------------------------------------
    الجزء القادم هو احتياجنا لكائن تسجيل يقوم باحتواء كل البيانات العامة على النظام باكمله

    هذا الكائن سيضمن داخل كل الكائنات المستقلة الاخري فى النظام ويستخدم لنقل البيانات العامة فى مختلف انحاء النظام بدون الاحتياج لاستخدام المتغير المسبق التعريف $GLOBALS

    سنقوم بانشاء الكائن ( الكلاس ) هذا فى ملف خارجي وسنقوم باستدعائه ببساطة باستخدام include()
    ولكن هيا نستخدم واحدة من روائع PHP5 الجديدة وهي الدالة [ __autoload() ]

    هذه الدالة الساحرة تستخدم لتحميل الكائنات ( الكلاسات ) ، عندما تصادف PHP كائن غير موجود
    فتقوم اولا باستدعاء الدالة __autoload() ، ثم تقوم بالاعلان عن خطا اذا لم يكن موجودا .

    لنقم باضافة الكود الاتي الى ملف startup.php
    كود PHP:
    function __autoload($class_name
    {
            
    $filename strtolower($class_name) . '.php';

            
    $file site_path 'classes' DS $filename

            if (
    file_exists($file) == false
            { 
               return 
    false;
            }

            include (
    $file);

    تاخذ الدالة اسم الكلاس كمعطي لها ، ثم تتاكد من وجود ملف له نفس الاسم بداخل مجلد الكائنات الذي نقوم بعمله وتسميته مثلا classes . اذا لم تجد الملف الدالة سوف تقوم بايقاف التنفيذ واظهار خطا قاتل fatal error يتم ايضاح فيه ان االكلاس ( اسم الكلاس ) غير موجود ،
    واذا وجدت الملف ستقوم الدالة بتضمينه بواسطة include()

    @@ انشاء كائن التسجيل :
    -------------------------------
    كائن التسجيل كما قلنا سابقا فهو يضمن داخل كل الكائنات المستقلة الاخري ويقوم بنقل البيانات العامة فى مختلف انحاء النظام ، وهو كائن (كلاس) بسيط جدا ، ولا يحتاج اكثر من ثلاثة اساليب (نهج) methods.

    اولا نقوم بانشاء مجلد واسمه [ classes ] ثم نقوم بانشاء ملف جديد ونسميه [ regisrty.php ]
    ونضع الكود الاتي بداخله
    كود PHP:
    <?php
    class Registry {
        private 
    $vars = array();
    }
    ?>
    فى هذا السطر قمنا بانشاء الكائن ووضع خاصية vars على شكل مصفوفة وهي التى ستحوي البيانات التي سنقوم بتخزينها من خلال الكائن .
    نحن الان قمنا بعمل هيكل لكائن التسجيل ( Registry Class ) ، و كل ما نريد فعله هو اضافة بعض الاساليب ( النهج ) ، جميع كائنات التسجيل تحتاج الى اسلوب تخزين set() لتخزين البيانات ،
    واسلوب الإستخراجget() للحصول على البينات المخزنة ، ويمكننا ايضا اضافة اسلوب الحذف remove() ليقوم بحذف بعض البيانات المخزنة بالكائن ، سنضيف الكود الاتي الخاص بهذه الاساليب داخل الكائن :
    كود PHP:
    function set($key$var) {
         if (isset(
    $this->vars[$key]) == true) {
    $error='Unable to set var <font color="red"><b> '.$key.'</b></font> Already Set  !!';
     die(
    $error);
            } 
            
    $this->vars[$key] = $var;
            return 
    true;
    }
    function 
    get($key) {
            if (isset(
    $this->vars[$key]) == false) {
                    return 
    null;
            }
            return 
    $this->vars[$key];
    }
    function 
    remove($var) {
            unset(
    $this->vars[$key]);

    الاساليب بسيطة جدا كل الى بتقوم بيه ( تخزن ، تستخرج و تحذف ) البيانات من خاصية$var ، فى اسلوب التخزين set() نقوم ايضا بالتاكد اذا كان مفتاح البيانات المدخلة موجود من قبل ام لا ، فاذا كان موجود نقوم بالخروج من البرنامج واظهار خطا وهذا يحمي من الكتابة على البيانات الموجودة من قبل [ Overwriting ] .

    نحن الان بنينا كائن تسجيل كامل ولكن سنقوم باستخدام احد واجهات (وصلات) SPL وهي[ ArrayAccess]
    وتعمل على الوصول للكائن بطريقة المصفوفات ، لاحظ الكود الاتي ولا تضيفه [ يعتمد على الكائن السابق] :
    كود PHP:
    <?php
    $registry 
    = new Registry;
    $registry->set 'site' 'swalif.net' ) ;

    $registry->get ('site'); 

    $registry['site'];
     
    ?>
    فى السطر الاول نقوم بتعريف نسخة من كائن التسجيل ،
    فى السطر الثاني نقوم بادخال مفتاح site وقيمته swalif.net

    فى السطر الثالث نقوم بالحصول على قيمة المفتاح site باستخدام اسلوب الاستخراج get()

    اما فى السطر الرابع فهو المقصود وهو نفس عمل السطر الثالث ( الحصول على قيمة المفتاح site ) ولكن باستخدام ال ArrayAccess فهي تتعامل مع $registry كانه مصفوفة فى حين انه كائن ،
    و ال ArrayAccess لا تمتلك مميزات حقيقية ، هي فقط تختصر الكتابة بدلا من انك تستخدم ->get()،
    لاستخدام ال ArrayAccess يجب علينا تغيير السطر الخاص بتعريف الكلاس وهو

    كود PHP:
    class Registry 
    ليصبح
    كود PHP:
    Class Registry Implements ArrayAccess 
    الكلمة المفتاحية [ Implements ] تستخدم لتفيذ واجهة ( وصلة ) interface مثل ال ArrayAccess

    بتنفيذ ArrayAccess يجب اضافة اربع اساليب جديدة ثابتة للكائن معرفة مسبقا من خلال SPL
    قم باضافتهم اسفل الثلاث اساليب السابق ذكرهم
    كود PHP:
    function offsetExists($offset) {
            return isset(
    $this->vars[$offset]);

    function 
    offsetGet($offset) {
            return 
    $this->get($offset);
    }
    function 
    offsetSet($offset$value) {
            
    $this->set($offset$value);
    }
    function 
    offsetUnset($offset) {
            unset(
    $this->vars[$offset]);

    هذه الاساليب تشرح نفسها فالاولي تقوم بالتحقق من وجود المتغير والثانية تقوم باستخراج المتغير
    والثالثة تقوم بادخال المتغير وقيمته والرابعة تقوم بالحذف
    وللمزيد عنهم http://www.php.net/~helly/php/ext/sp...rayAccess.html
    وللمزيد عن ال SPL بصفحة عامة http://www.php.net/manual/en/ref.spl.php
    والمانوال الخاص باستخدامها وتشعباتها http://www.php.net/~helly/php/ext/spl/

    بعد ان قمنا باستكمال كائن التسجيل واضافة واجهة ArrayAccess فان طريقة ادخال البيانات واستخراجها
    اصبحت بالشكل التالي
    كود PHP:
    $registry->set ('name','mohamed');
    $registry['name'] = 'mohamed' ;
    echo 
    $registry->get ('name');
    echo 
    $registry['name']; 
    السطر الاول – ادخال البيانات بالطريقة العادية
    السطر الثاني - ادخال البيانات باستخدام Array Access
    السطر الثالث - استخراج البيانات بالطريقة العادية
    السطر الرابع - استخراج البيانات باستخدام Array Access
    ------
    يبقي الان اضافة هذا السطر فى نهاية ملف startup.php السالف ذكره ( بعد دالة autoload )
    كود PHP:
    $registry = new Registry
    انتهينا من كائن التسجيل واذا حاولت تجربة النظام فسيعمل بدون اخطاء ( ولكن لن يعرض شئ )
    @ ------ نهاية الجزء الثاني ----- @

    يتبع بالجزء الثالث :deal:





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  4. #4
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    @@ الجزء الثالث – النموذج The Model @@
    --------------------------------------------------

    [M] او Model هو جزء من MVC مسئول عن الاستعلام عن البيانات المراد عرضها من قاعدة البيانات او من اى مصدر اخر ثم يقوم بتقديمها للمتحكم Controller ، ويجب علينا ان نحصل على النموذج المناسب للطلب المقدم من المستخدم ولكن هنا سنقوم بطمس الفرق بين النموذج والمتحكم ، حيث يستخدم المتحكم مكتبة اتصال بقاعدة بيانات للاستعلام مباشرة من قاعدة البيانات بدلا من العديد من النماذج المختلفة فلذلك لن نتضمن النماذج فى نظامنا بشكل رسمي واذا استطعت ان تفهم فكرة عمل المتحكم عند شرحة فى الجزء الرابع سيمكنك ( اذا احببت ) القيام باضافة النماذج بنفس الطريقة .

    سنقوم هنا باضافة كود الاتصال بقاعدة البيانات لصفحتنا الرئيسية index.php داخل المجلد MVC
    يمكنك استخدام مكتبات الاتصال بقواعد البيانات المختلفة ولكن PHP5 ياتي معها مكتبة اتصال بقواعد البيانات قوية وهي [ PDO ] وساقوم باستخدامها هنا نظرا لوجود اتجاه رسمي من مطوري PHP لازالة اى مكتبات اتصال بقواعد البيانات غير PDO مثل [ OCI8 and MySQLi ] من الوضع الافتراضي واحالتهم الى PECL فى PHP6 واعتماد PDO بشكل رسمي كمكتبة الاتصال بقواعد البيانات فى PHP6 ،

    قوم باضافة هذا الكود الي index.php اذا كنت ستستخدم PDO واذا لم تريد استخدامها فقم باضافة كود الاتصال الخاص بالمكتبة التى تنوي استخدامها Mysqli ] [ مثلا :
    كود PHP:
    $db = new PDO('mysql:host=localhost;dbname=demo''[user]''[password]');
    $registry->set ('db'$db); 
    فى السطر الاول قمنا بعمل مقبض اتصال بقاعدة بيانات من نوع MySql باستخدام pdo
    قم بتغيير demo الى اسم القاعدة و user الى اسم المستخدم و password الى كلمة السر

    ثم فى السطر الثاني قمنا بتخزين هذا المقبض فى كائن التسجيل حتي نجعله متغير عام global و يتاح لنا استخدامه فى اى صفحة اخري من السكربت عن طريقة استخراجه من كائن التسجيل كما سبق شرحه .

    فبهذه الاضافة البسيطة نكون انهينا جزء النموذج الذي اتفقنا عليه بان لا يكون نماذج مختلفة فى درسنا هذا
    وسنبدا باضافة المتحكم Controller واضافة المتحكم هذه تعني اننا بحاجة لكائن المسارات المسئول عن تحميل المتحكم controller المطلوب من خلال المستخدم عن طريق الرابط

    @ - كائن المسار Router :
    ------------------------------ سيقوم هذا الكائن بتحليل الطلب القادم من المستخدم ثم تحميل المتحكم الصحيح للبدء بعرض المطلوب عرضه ، الخطوة الاولي هي عمل الهيكل الاساسي لكائن المسار واضافته فى ملف router.php بمجلد classes السابق انشائه وموجود به registry.php :
    كود PHP:
    Class Router {
            private 
    $registry;
            private 
    $path

            function 
    __construct($registry) {
                    
    $this->registry $registry;
            }       

    قمنا هنا ببناء هيكل كائن المسار وتحديد 3 خواص
    خاصية التسجيل وستحتوي على كائن التسجيل المسبق انشاؤه ، خاصية المسار وستحتوي علىالمسار الكامل للمتحكم ثم نقوم ببناء المشيد الذي ياخذ كائن التسجيل كمعطي ثم يقوم بتعيينه لخاصية التسجيل

    قم الان باضافة الكود الاتي الى صفحة index.php للقيام بتحميل كائن المسار
    كود PHP:
    $router= new Router($registry);
    $registry['router'] =  $router 
    فى السطر الاول قمنا بعمل نسخة من كائن المسار فى متغير router
    ثم قمنا بتسجيل قيمة المتغير router بالمفتاح router فى كائن التسجيل ليكون المتغير router عام ويمكن استخدامه بجميع الصفحات وهو يحوي بداخله نسخة من كائن المسار

    لنقوم باضافة الوسائل الاساسية فى كائن المسار ، اول وسيلة هي وسيلة setPath() ، والتي تستخدم لتحديد الدليل ( المجلد ) الذي سيحوي جميع عناصر التحكم controllers وسنقوم الان باضافتها الى ملف router.php داخل الكائن router من الكود الاتي :
    كود PHP:
     function setPath($path
    {
    $path trim($path'/\\');
            
    $path .= DS;

    if (
    is_dir($path) == false) {
            
    $perror'Invalid controller path '.$path;
            die(
    $perror);
            }

            
    $this->path $path;

    لنرجع الان الى ملف index.php ونقوم باضافة السطر التالى لتحديد مسار مجلد عناصر التحكم controllers
    كود PHP:
    $router->setPath(site_path.'controllers'); 
    وبهذا نكون قد قمنا بتحديد مسار مجلد عناصر التحكم ، سنكتب الان الوسيلة المسئولة عن تحميل عنصر التحكم المطلوب وهي وسيلة loading() وستقوم بتحليل الطلب القادم من المستخدم
    الجزئية الاولي من هذه الوسيلة كالاتي :
    كود PHP:
    function loading(){
            
    $this->getController($file,$controller,$action); 
    كما نري فان وسيلة التحميل loading() تستخدم وسيلة اخري وهي getController() للحصول على اسم عنصر التحكم واذا تم طلب تنفيذ دالة داخله والكود الاتي هو وسيلة getController()
    كود PHP:
    private function getController(&$file, &$controller, &$action) {
            
    $route = (empty($_GET['route'])) ? '' $_GET['route']; 
            if (empty(
    $route)) { $route 'index'; }
            
            
    $route trim($route'/\\');
            
    $parts explode('/'$route);

            
    $cmd_path $this->path;
            foreach (
    $parts as $part) {
                   
    $fullpath $cmd_path $part;
                            
                    if (
    is_dir($fullpath)) {
                            
    $cmd_path .= $part DS;
                            
    array_shift($parts);
                            continue;
                    }

                    if (
    is_file($fullpath '.php')) {
                            
    $controller $part;
                            
    array_shift($parts);
                            break;
                    }
            }
            if (empty(
    $controller)) { $controller 'index'; };

            
    $action array_shift($parts);
            if (empty(
    $action)) { $action 'index'; }
            
    $file $cmd_path $controller '.php';

    فى هذه الوسيلة تاخذ اولا قيمة المتغير $route ثم تقوم بتقسيمه الى اجزاء منفصلة باستخدام دالة explode() فاذا كان الطلب ( links/view ) فستقوم بتقسيمه الى مصفوفة array('links','view')

    ثم نقوم باستخدام حلقة تكرار foreach لاستخراج القيم من المصفوفة كل على حدي ثم التاكد من كونه مجلد ، فاذا كان مجلد نقوم باضافته الى مسار الملف ثم ننتقل للجزء التالي من المصفوفة مع حذف الجزء الذي يمثل مجلد من المصفوفة باستخدام array_shift وهكذا ، هذا يتيح لنا استخدام مجلدات فرعية داخل المجلد الرئيسي لعناصر التحكم controllers واذا كان الجزء التالي ليس مجلد ولكنه ملف نقوم بتعيين هذا الجزء لمتغير $controller ونحذف عنصر الملف من المصفوفة ثم نخرج من الحلقة لحصولنا على ملف عنصر التحكم المنشود ، بعد الحلقة نتاكد من ايجاد عنصر التحكم فاذا لم يتم ايجادة نقم باستخدام الافتراضي وتعيين القيمة الافتراضية ونطلق عليها هنا index الى $controller ثم نقوم بالحصول على الوسيلة المطلوبة الموجودة داخل عنصر التحكم ، فعنصر التحكم هو كائن يتكون من مجموعة وسائل مختلفة والمتغير action يشير الى الوسيلة المطلوبة من خلال المستخدم واذا لم نجد وسيلة تم تحديدها فنقوم بارجاع الوسيلة الافتراضية index وفى النهاية نقوم بتجميع المسار الكامل لملف عنصر التحكم ( المسار و اسم عنصر التحكم و الامتداد ) ، الان الطلب تم تحليله داخل الوسيلة الحاملة له وهي loading() فتقوم بتحميل عنصر التحكم و تنفيذ الوسيلة المطلوبة ، الكود الاتي يمثل وسيلة loading() كاملة بملف router.php :



    كود PHP:
    function loading() { 
            
    $this->getController($file$controller$action); 
          
      if (
    is_readable($file) == false) {
                    die (
    '404 File Not Found');
            }

            include (
    $file);
            
    $class 'Controller_' $controller;
            
    $controller = new $class($this->registry);

            if (
    is_callable(array($controller$action)) == false) {
                    die (
    '404 Action Not Found');
            }
            
    $controller->$action();

    فى السطر الاول نقوم باستدعاء وسيلة الحصول على عنصر التحكم وتم شرحها مسبقا
    ثم نتاكد من ملف عنصر التحكم موجود بالفعل فاذا كان موجود نقوم بتضمينه include واذا لم يكن نخرج رسالة خطا ثم نقوم بتعريف الكلاس بسابقة Controller ثم اسم الملف ثم نقوم بعمل نسخة من الكلاس لاستخدامها فى اخراج الوسيلة المطلوبة وبعد ذلك نقوم بالتاكد من ان الوسيلة المطلوبة هي دالة يمكن تفيذها داخل كائن عن طريق ادخالهم على شكل مصفوفة ثم تنفيذها واذا لم تكن نخرج رسالة خطا
    والان اكتملت وسيلة التشغيل الاساسية loading() سنقوم باضافة السطر الاتي الى نهاية index.php
    كود PHP:
    $router->loading (); 
    سننتقل الان الى عناصر التحكم Controllers

    @ ------ نهاية الجزء الثالث ----- @

    يتبع .... :deal:





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  5. #5
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    @@ الجزء الرابع – عنصر التحكم Controller @@
    -------------------------------------------------------
    هذا الجزء بسيط جدا ، فى البداية نقوم بعمل المجلد السابق اشارة اليه controllers ليحوي جميع عناصر التحكم ثم نقوم بانشاء ملف جديد باسم controller_base.php بداخل مجلد classes السابق انشاؤه
    ثم نضع بداخل هذا الملف controller_base.php الكود الاتي
    كود PHP:
    <?php 
    Abstract Class Controller_Base {
            protected 
    $registry;
            function 
    __construct($registry) {
                    
    $this->registry $registry;
            }
            abstract function 
    index();
    }
    ?>
    الكائن ده هيبقي هو الاب parent لكل كائنات عناصر التحكم الى هننشئها بعد كده وهو يقوم بانشاء نسخة من كائن التسجيل مرة واحدة حتي لا نقوم بنسخها فى كل عنصر تحكم انما ننشئها هنا مرة واحدة و عن طريق الوراثة ستعمم لكل كائنات عناصر التحكم الاخري و قمنا بجعله abstract و انشئنا وسيلة index وجعلناها abstract بحيث ان اى كائن هيورث من الكائن ده لازم يعرف الوسيلة index ولازم يعرفها فى نفس مستوي الظهور او اقل منه يعني لو عملنا الوسيلة index بمستوي protected يجب فى الكائنات الوارثة ان نقوم بتعريفها protected ايضا او public لكن لا يجوز تعريفها private وفائدة جعل هذه الوسيلة abstract هو ضمان احتواء كل كائن عنصر تحكم على وسيلة index .

    سنقوم الان بانشاء اول عنصر تحكم قم بانشاء ملف باسم index.php داخل المجلد controllers وقم باضافة الكود الاتي اليه :
    كود PHP:
    <?php 
    Class Controller_Index Extends Controller_Base {
            function 
    index() {
                    echo 
    'Hello Swalif :) ';
            }
    }
    ?>
    فبذلك قمنا بانشاء اول كائن عنصر تحكم ولاحظ بالسطر الاول تقوم بكتابة controller_ ثم اسم عنصر التحكم والذي سيكون على نفس اسم ملف عنصر التحكم ويجب انشاء وسيلة index وطبعا اذا لم نحدد مستوي ستحدد تلقائيا public وعند تشغيل النظام سيعمل بنجاح وهذا يعني ان كائن المسار الذي سبق وقمنا بانشاءه يعمل بكفاءة وقام بتحميل عنصر التحكم الصحيح وتنفيذ ما بداخله ، لنقوم بانشاء عنصر تحكم اخر ليتوافق مثلا مع طلب مثل links/view ، سنقوم بانشاء ملف باسم links.php داخل مجلد controllers
    وقم باضافة الكود الاتي اليه
    كود PHP:
    <?php 
    Class Controller_Links Extends Controller_Base {
            function 
    index() {
                    echo 
    'Hello , This Is The index of Links ';
            }
            function 
    view() {
                    echo 
    'Hi , This Is The Links View ';
            }
    }
    ?>
    ولنفترض ان المجلد الرئيسي للنظام اسمه MVC اكتب الرابط بالشكل الاتي
    http://localhost/MVC/index.php?route=links/view
    سيعرض لك الجملة Hi, This Is The Links View
    بانشاء عنصر تحكم جديد واى وسائل بداخله نكون انشئنا صفحة جديدة كاملة فى نظامنا ولا نحتاج الى include لاى ملف عام فى البداية ، الان جزء عناصر التحكم يعمل بسلام ننتقل الان لجزء العرض View

    @@ نهاية الجزء الرابع @@
    ------------------------------
    يتبع ... :deal:





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  6. #6
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    @@ الجزء الخامس- نظام العرض @@
    ------------------------------------------

    مثل نظام النموذج هناك العديد من الطرق المختلفة لانشاء نظام العرض ، يمكننا استخدام كائن المسار ليقوم بتحميل ملف باسم يبدا مثلا ب view_ ثم اسم يعبر عن محتواه مثل view_delete.php
    ولكن لنبقي على هذا الدرس بسيط سنقوم بانشاء كائن للقوالب بسيط جدا ليقوم بعرض القوالب .

    نقوم بانشاء ملف جديد باسم template.php فى مجلد classes ثم نقوم بوضع الكود الاتي بداخله :
    كود PHP:
    <?php 
    Class Template {
            private 
    $registry;
            private 
    $vars = array();
            
    function 
    __construct($registry) {
                    
    $this->registry $registry;
            }
    }
    ?>
    بنينا هنا الهيكل الاساسي لكائن القالب ، فى البداية انشئنا نسخة من كائن التسجيل فى المشيد وقمنا بتعريف خاصية vars والتى ستحتوي على المتغيرات وقيمها على هيئة مصفوفة ( مفتاح => قيمة )
    ويكون المفتاح هو المتغير ، الان سنضيف هذا الكود فى index.php قبل الجزء الخاص بكائن المسار router
    كود PHP:
    $template = new Template($registry);
    $registry->set ('template'$template); 
    قمنا هنا بانشاء نسخة من كائن القالب وبدوره سينشئ نسخة من كائن التسجيل ثم نقوم بتسجيل المتغير template وقيمته هي كائن القوالب لاستخدامه فى جميع الصفحات بشكل عام global

    نحتاج الان الى وسيلة ادخال بيانات لكائن القوالب set() لتخزين المتغيرات وقيمها لتعرضها فى القوالب
    ووسيلة لحذف البيانات المدخلة remove() لنقم باضافة الكود الاتي الى ملف template.php
    كود PHP:
    function set($varname$value$overwrite=false) {
            if (isset(
    $this->vars[$varname]) == true AND $overwrite == false) {     $Verror='Unable to set var <font color="red"><b> '.$varname.'</b></font> Already Set !!';
    die(
    $Verror);
                    return 
    false;
            } 
            
    $this->vars[$varname] = $value;
            return 
    true;
    }
    function 
    remove($varname) {
            unset(
    $this->vars[$varname]);
            return 
    true;

    كما نري وسيلة الادخال set() ووسيلة الحذف remove() وسائل بسيطة جدا تستخدم لادخال البيانات وحذفها من كائن القوالب ومشابهين لعملية الادخال والحذف فى كائن التسجيل الذي سبق شرحه

    الان يمكننا تخزين البيانات ، نحتاج الان الى وسيلة عرض show() لتقوم بعرض القوالب ، سنقوم بانشاء مجلد باسم templates داخل المجلد الرئيسي MVC وسيحتوي علىجميع ملفات القوالب ثم سنقوم باستخدام include() لتضمين ملفات القوالب والكود الاتي للوسيلة show() فى ملف template.php
    كود PHP:
    function show($name) {
            
    $path site_path 'templates' DS $name '.php'
            if (
    file_exists($path) == false) {
    $Terror='Template <font color="red"><b> '.$name.'</b></font> does not exist !!';
    die(
    $Terror);
                   }
            foreach (
    $this->vars as $key => $value) {
                    $
    $key $value;
            }
            include (
    $path);                

    اكتمل الان كائن القالب ويمكن استخدامه فى عرض القوالب داخل عناصر التحكم controllers
    ومثال على ذلك ننشئ ملف باسم swalif.php فى مجلد templates ثم اكتب به الكود الاتي :
    كود PHP:
    <br /> Hello , This Is Swalif Template <br />
    And I'm  <?php echo $my_name?>
    ثم قم بفتح ملف ال index.php بمجلد controllers والذي كان يحتوي على Hello Swalif فى وسيلة index
    قم بوضع هذا الكود داخل وسيلة index
    كود PHP:
            $this->registry['template']->set ('my_name''Mohamed – Hawy_PHP');
            
    $this->registry['template']->show('swalif'); 
    فى السطر الاول قمنا بتعيين مفتاح باسم my_name وقمنا بتعيين قيمة له وهي اسمي
    وبذلك استطيع ان اقوم بطباعة اسم الفتاح كمتغير ليخرج القيمة الذي قمت بتعيينها اليه
    ثم فى السطر الثاني استخدمت وسيلة show لعرض القالب الذي سبقت وسميته swalif
    طبعا تكتب اسمه هنا بدون الامتداد لان احنا فى وسيلة show بنضيف امتداد php يمكنك تغييره لاى امتداد

    اذا الكود الكامل لوسيلة index فى عنصر التحكم index الموجود داخل controllers هو :
    كود PHP:
    <?php 
    Class Controller_Index Extends Controller_Base {
            function 
    index() {
                    echo 
    'Hello Swalif :) ';
        
    $this->registry['template']->set ('my_name''Mohamed – Hawy_PHP');
        
    $this->registry['template']->show('swalif');
            }
    }
    ?>
    قم بالتجربة وقم بتغيير الاسم وقم بعمل متغيرات اخري وتعيين قيم اليها ولاستخدام المصفوفات
    كود PHP:
     $info = array ( "Mohamed" "Hawy_PHP" "3/11/1990" "ATSIT Student " ) ;
     
    $this->registry['template']->set ('my_info'$info); 
    وفى صفحة القالب
    كود PHP:
     print_r($my_info); 
    وسيقوم بعرض محتويات المصفوفة ، وبهذا يكون نظام MVC البسيط انتهي ويمكن استخدامه فى انشاء اى موقع ولكن هناك نقطة يجب علينا الاهتمام بها وهي حماية ملفاتنا فكل المجلدات الفرعية التى قمنا بانشائها مثل templates و controllers متاحين للعامة ويمكنهم الاطلاع على الملفات وتشغيلها بدون تشغيلها من النظام نفسه لذللك سنمنع الوصول لهذه المجلدات باستخدام ال htaccess
    سنكتب به السطر التالى
    كود PHP:
    Deny from ALL 
    واحفظه باسم .htaccess وضعه فى اى مجلد تريد منع الوصول لملفاته

    ونقطة اخري مفيدة ، الان يتم الوصول لعناصر التحكم بالشكل الاتي مثلا
    http://localhost/mvc/index.php?route=links/view
    ما رايكم فى جعل الوصول اليه بالشكل الاتي باستخدام mod_rewrite
    http://localhost/mvc/inks/view
    ضع الكود الاتي فى ملف .htaccess فى المجلد الاساسي mvc
    كود PHP:
    RewriteEngine on

    RewriteCond 
    %{REQUEST_FILENAME} !-f
    RewriteCond 
    %{REQUEST_FILENAME} !-d

    RewriteRule 
    ^(.*)$ index.php?route=$[L,QSA
    وبهذا ينتهي هذا النظام البسيط جدا ، هناك طرق عديدة ومختلفة لبناء هذا النظام وهذه الطريقة ربما لا تكون افضلهم ولكنه يظهر لكم قوة نظام MVC .

    ليس الهدف الاساسي من هذا الدرس ان تقوم ببناء نظام خاص بيك من الصفر فهذا سيتطلب جهد كبير ووقت ويمكنك فعلا استخدام ما ابتكره غيرك ويوجد العديد من اطارات العمل القوية مثل CodeIgniter

    ولكن الهدف الاساسي اذا كنت فعلا تستخدم او استخدمت او تفكر فى استخدام احد هذه الاطارات
    ان يكون لديك فكرة وخلفية بسيطة عن اساس عملها وهيكلها

    هذا الدرس ليس من ابداعي ولكنه درس قراته وقمت بتطبيقه والحمد لله اضفت اليه الكثير و قمت ببناء اطار عمل بسيط ولكن ما يميزه عن غيره بالنسبة لي انى انا الى بنيته وفاهم كل خطوة فيه ماشية ازاى
    وده تفضيل شخصي مش اكتر
    والدرس ده للكاتب Dennis pallett ورابط الدرس من هنا http://www.phpit.net/article/simple-mvc-php5/
    عندما قراته وفهمته وقمت بتطبيقة وبدات بالفعل فى الاضافة اليه و بدات فى اطار العمل الخاص
    فكرت فى انه ربما يفيد احد قرائته فقمت بوضعه بين ايديكم واتمني من الله ان ينال اعجابكم

    واذا اردت المزيد عن كيفية عمل اطارات العمل فانصحك بقراءة هذا الدرس لراسموس والد ال PHP
    http://toys.lerdorf.com/archives/38-...framework.html
    مش هو بردو ابوها

    وستجدوا كل الملفات والنظام كامل فى هذا الدرس فى المرفقات
    وان شاء الله قريبا هنزل نسخة من النظام مع تطبيق على استخدام مكتبة ال PDO باذن الله
    وبالنسبة لكلامي فوق عن( اعتماد مطوري PHP مكتبة PDO فى PHP6 مكتبة الاتصال بقواعد البيانات وتحويل الباقي الى PECL ) ليس من فراغ ولكنه من احداث اجتماع مطوري PHP فعلا لمناقشة اهم التغييرات التى ستحدث فى PHP6 مثل موضوع مكتبات قواعد البيانات السابق ذكره وحذف
    ال Register_globals و الSafe_mode وال magic_quotes والكثير من التعديلات بشكل رسمي واللينك
    http://www.php.net/~derick/meeting-n...nsions-to-pecl

    -------------------------------

    وفى النهاية فإن اصبت فمن الله عز وجل و إن أخطات فمن نفسي ومن الشيطان

    اخوكم محمد ،،

    لا يتبع ... :funny:





    الملفات المرفقة الملفات المرفقة
    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  7. #7
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2004
    المشاركات
    431


    بعد قرائة أول جزء فقط أحب أسجل حضوري وأقولك بشموهندس كبييييير بجد

    فعلاً الله أكبر عليك وبارك الله فيك وزادك من علمه


    لا تنسى "وما أتيته عن علم, ولكن الله يرزق من يشاء"





    __________________
    حازم خالد
    مبرمج، بعمل مواقع ويب وتطبيقات موبيل، هتلاقي شوية كورسات فيديو على YouTube بتاعي، وشوية كود على اكونت Github، ودي سيرتي فيها شوية حجات من شغلي، اخيراً كل لينكات السوشيال ميديا بتاعتي هنا.

  8. #8
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    جزاك الله كل خير يا مستر حازم منور الموضوع والله

    ومستني تعقيبك ونقدك واى اضافات من حضرتك بعد ما تقراه كله





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  9. #9
    عضو نشيط جدا
    تاريخ التسجيل
    May 2007
    المشاركات
    509


    حبيبي هاوي كع اني ما فهمت الكثير وما القصد من وراء نظام MVC الا انني فهمت الاكواد وآلية عملها .

    مشكور والى الامام .





    __________________
    EbNCaNa اخوكم ابن قانا

    [درس] قائمة بريدية بأسهل الطرق بواسطة PHP

    [توقيعك يجب أن لا يكون أطول من 400 حرف يتضمن تجاوز كود المنتدى] - الى متى المعاناة يا حضرة الأدارة ؟

  10. #10
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    -> EbNCaNa

    ارجع للجزء الاول " نقطة اساس النظام "

    واذا كنت تعاملت مع اى فريم وورك وقرات المانول بتاعه هتجد ان اساس ونواة اطار العمل هو ال MVC

    مشكور

    اخوك محمد ،،





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  11. #11


    بسم الله ما شاء الله عليك بجد
    الموضوع قيم جدا جدا
    و لو تسمح لي ممكن انقله للموقع الخاص بي مع حفظ حقوقك ككاتب للموضوع ؟

    و جزاك الله كل خير

    أحمد أبو النصر





    __________________
    أحمد أبو النصر
    Junior php Developer
    +20166196074

  12. #12
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    بسم الله ما شاء الله عليك بجد
    الموضوع قيم جدا جدا
    و لو تسمح لي ممكن انقله للموقع الخاص بي مع حفظ حقوقك ككاتب للموضوع ؟

    و جزاك الله كل خير

    أحمد أبو النصر
    جزاك الله كل خير يا اخ احمد

    و يشرفني طبعا نقله لموقعك ولا يهم حقوقي لكن المهم ذكر المصدر ( سوالف :shy: )


    محمد ،،





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  13. #13


    السلام عليكم ورحمة الله وبركاتة

    بارك الله فيك استاذ محمد فعلا ووفيت بهديتك وارجو ان تفيد بها ايضا فى مجتمع مطورى الويب العربى وجزاك الله خير على الشرح الرائع واتمنى لك المزيد من العلم والتقدم بأذن الله وانا كمان
    تحياتى لك : اخوك عمرو





    __________________

  14. #14
    عضو فعال
    تاريخ التسجيل
    Jun 2002
    المشاركات
    1,346


    بسم الله الرحمن الحيم
    وعليكم السلام ورحمة الله وبركاته
    ..
    ...
    درس رائع فعلاً... وإضافة جديدة إلى ما أعرفه عن PHP
    جزاك الله خيرا
    .
    .
    بالتوفيق ..






  15. #15
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    اقتباس المشاركة الأصلية كتبت بواسطة vB Master
    السلام عليكم ورحمة الله وبركاتة

    بارك الله فيك استاذ محمد فعلا ووفيت بهديتك وارجو ان تفيد بها ايضا فى مجتمع مطورى الويب العربى وجزاك الله خير على الشرح الرائع واتمنى لك المزيد من العلم والتقدم بأذن الله وانا كمان
    تحياتى لك : اخوك عمرو
    يارب تكون استفدت من الدرس ان شاء الله





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل






ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض