مدونة الويب 2.0

  • الرئيسية
  • تعريف بالمدونة
  • المصادر
  • تواصل معي
  • أخبار المدونة
  • أفكار
  • إضافات
  • برمجة
  • تصميم
  • تطوير
  • فعاليات
  • كتب
  • لقاءات
  • مدونات عربية
  • مشاريع
  • مهمات
  • مواقع

MVC وإكمال المتحكم الأول

September 6, 2008 - السبت 06 رمضان 1429 التصنيف: تطوير

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

السلام عليكم،

سنقوم اليوم بإكمال مابدأناه:

وسنقوم بإكمال قسم controllers … حيث سنكمل lists_controller.

ملاحظة: أرفقت لكم الملفات المطلوبة لأن إضافة تلوين النص بدأت تشوه الكودات ولا أعرف لمَ.
الملفات: الكوادت المستخدمة في الدرس.

قبل كل شيء ملاحظة مهمة جداً: قم بتغيير اسم الجدول lists في قاعدة البيانات إلى groups وأيضاً غير اسم lists_controller إلى groups_controller وغير المعلومات بداخله لتصبح:

<?php
class GroupsController extends AppController {
	var $name = "Groups";
}
?>

لماذا؟ لأني نسيت أن كلمة list كلمة محجوزة في لغة PHP لذلك لايصح أن نسمي أسماء المتحولات بكلمات اللغة المحجوزة كما تعرفون.

الأن سنضيف سطراً واحداً ليصبح المتحكم:

<?php
class GroupsController extends AppController {
	var $name = "Groups";
	var $scaffold;

}
?>

ماذا حدث الأن:
أول سطرين تم شرحهم أما السطر الثالث وهو:

	var $scaffold;

فهو يخبر الكيك بأن يستعمل الثقالة راجع النقطة السادسة في هذا المتحكم (controller) وسنجرب الخرج فوراً عبر طلب العنوان:

http://localhost/mhmat/groups

بالتأكيد لايوجد محتويات في الجدول لأننا لم نقم بإضافة شيء بعد!

جربوا الأن إضافة قائمة جديدة عن طريق الضغط على الرابط الموجود في أسفل الجدول بلون أحمر (New Group) وبعد إضافة قائمة جديدة يمكنكم تحريرها أو حذفها، كل هذا بأمر واحد!!! لاتفرحوا كثيراً فالرافعة لاتستخدم في التطبيقات ولكن فقط في التجارب لأنه لايمكن تقييدها أو التحكم بها أي لايمكن التحكم بمن يحق له الحذف أو الإضافة أو … هي فقط لعرض البيانات بطريقة سريعة.

سنقوم بحذف سطر الرافعة كي نكتب توابعنا الخاصة، احذفوا السطر الآن. سنكتب تابع index الذي يعرض جميع القوائم:

<?php
class GroupsController extends AppController {
	var $name = "Groups";
	function index() {
		$this->set("groups", $this->Group->find("all"));
	}
}
?>

هو عبارة عن سطر واحد حيث نقوم في هذا السطر بجلب جميع القوائم في جدول القوائم عن طريق الجملة:

$this->Group->find("all")

ونمررها كوسيط في تابع set الذي يأخذ وسيطين، الوسيط الأول هو اسم المتحول ولكن بدون $ والوسيط الثاني هي قيمة المتحول، أي بعبارة آخرى هو:

		$this->set("groups", $this->Group->find("all"));

مافائدة هذا التابع ولماذا لم نقم بإسناد المتحول بالطريقة الاعتيادية باستخدام معامل (=)! هذا التابع فائدته أنه يقوم بحفظ المتحول لاستخدامه في طبقة العرض (view) فلو اسندنا في الطريقة العادية (=) سيضيع المتحول عندما نخرج من الصفحة إلا إذا كان global ونحن لانريده global لذلك أضافوا هذا التابع الذي سترونه بكثرة وهو لتمرير متحول إلى طبقة العرض. وتذكروا أن هذا المتحول هو دائماً مصفوفة فحتى لو جلبنا قيمة واحدة من قاعدة البيانت تأتي على شكل مصفوفة. تذكروا هذا لأننا سنتعامل مع مصفوفة في طبقة العرض.

الأن سنقوم بإضافة تابع (دالة) لإضافة قائمة مهام جديدة … سنسمي التابع add

function add() {
	if(!empty($this->data)) {
		if($this->Group->save($this->data)) {
			$this->Session->setFlash("تم حفظ القائمة");
			$this->redirect(array("action" => "index"));
		} else {
			$this->Session->setFlash("لم يتم الحفظ، حاول ثانية");
		}
	} else {
		$this->Session->setFlash("أضف قائمة جديدة");
	}
}

في شرح سريع لتابع الإضافة الذي كتبناه:

الشرط الرئيسي: يفحص إن كنت ترسل بيانات للكيك أم لا؟ إن كنت ترسل فسيحاول أن يحفظها. وإن لم تكن فسيظهر لك فورم مربع إضافة القائمة.

الشرط الثانوي يفحص في حال حفظ المعلومات فيخبرنا بأنه تم حفظ المعلومات (تذكر أن الكيك يحفظ المعلومات لوحده لاداعي لإنشاء query على قاعدة البيانتا وفتح socket في كل مرة وووو)

داخل جملة هذا الشرط الثانوي (أي في حال تحقق) يوجد سطرين السطر الأول هو تخزين جملة تخبر المستخدم بما تم عمله وهو أنه تم حفظ القائمة وهذه الجملة تخزن داخل السيشن.

أما عند عدم تحقق الشرط الثاني أي عند وجود بيانات لكن الكيك لم يستطع أن يحفظها، إعادة توجيه إلى مكان نحدده نحن. والذي الآن هو مربع Form الإضافة.

الأن علينا أن نقوم بتحضير الجزئين الآخرين وهما Model و View لهذا التابع add … سنقوم أولاً بتحضير Model حيث سنقوم بإنشاء ملف جديد داخل مجلد models اسمه group.php.

ملاحظة: اسم ملف model هو نفس اسم الجدول لكن بالمفرد واللاحقة هي PHP. وتذكروا أن الموديلات ستوضع في مجلد models تحت مجلد app.

سنقوم بكتابة مايلي داخل هذا الملف:

<?php
class Group extends AppModel {
	var $name = 'Group';
}
?>

لاحظوا مايلي:
- اسم الصنف هو نفس اسم الملف وهو اسم الجدول بالمفرد.
- سطر $name وضعناه لنفس السبب الذي ذكرناه في متحكم group، بسب التوافقية مع PHP4 فقط.

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

الأن سنتوجه إلى مجلد views طبقة العرض حيث انتهينا من طبقة المتحكمات وطبقة الموديلات وسنقوم بإنشاء مجلد باسم groups على خلاف مافعلنا في المتحكم و model حيث أنشأنا ملف فقط … سنسمي المجلد groups كما ذكرت.

وبعد هذا مباشرة سنتوجه إلى مجلد layouts الموجود تحت مجلد views وسنقوم بإنشاء الملف التالي:
default.ctp

ماهذا!!
مجلد layouts هو مجلد للقوالب وفي مشروعنا الصغير يوجد لدينا قالب واحد وهو الافتراضي default ولاحقته هي ctp (أظن أنها اختصار لـ Cake Template Page) … ونقوم بكتابة التالي داخله:

<html>
	<body>
		<h2>مهمات</h2>
		<?php echo $content_for_layout ?>
	</body>
</html>

لاحظ أن عبارة $content_for_layout سنقوم بعد قليل بالرجوع إليها والتكلم عن فائدتها …

نعود إلى مجلد groups داخل مجلد views الذي أنشأناه قبل قليل ننشىء ملف index.ctp الذي يستعمله تابع أو حدث index لعرض نتائجه التي وصلتنا في متحول groups هل تذكرونه؟ وسنكتب داخل الملف:

<?php foreach ($groups as $group): ?>
	<b><?php echo $group['Group']['groupname']; ?></b> |
	<?php echo $group['Group']['created']; ?>
	<br />
<?php endforeach; ?>

أولاً استعملنا حلقة foreach لكي ندور على المصفوفة $groups بواسطة متحول هو $group لاحظوا أن متحول $groups في طبقة المتحكم كتبناه بدون $ أما هنا فنكتبه مع $ قبله كما تعودنا في PHP.

بعد ذلك قمنا بعرض اسم القائمة وتاريخ إنشائها تذكروا أن تاريخ إنشائها يقوم الكيك لوحده بكتابته فقط قم بتسمية الحقل بـ created في الجدول داخل قاعدة البيانات.

الأن سنقوم بإنشاء ملف add.ctp داخل مجلد groups داخل مجلد views، ونكتب داخله:

<?php echo $form->create('Group'); ?>
<fieldset>
	<legend>أضف قائمة جديدة</legend>
	<?php echo $form->input('groupname', array('label' => 'إسم القائمة')); ?>
</fieldset>
<?php echo $form->end('أضف'); ?>

شرح بسيط:

$form->create هي من ميزات الكيك الرائعة والتي تسمى automagic حيث يختصر عليك كتابة وسوم HTML عن طريق (helper) أو المساعد المسمى form حيث طلبنا منه أن ينشىء فورم جديد اسمه Group حيث تم تمرير الاسم كوسيط وهكذا سيفهم الكيك لوحده الباقي وسيقوم بتمرير البيانات إلى تابع أو حدث add الذي كتبناه قبل قليل.

الآن سنطلب العنوان التالي:

http://localhost/mhmat/groups/add

ونضيف اللائحة وسيعاد توجيه الصفحة إلى صفحة index …

وهنا نأتي إلى سؤال مهم وهو كيف يفسر الكيك العناوين؟
شاهدوا العنوان التالي:
http://localhost/{Application}/{Controller}/{Action}/{Parameter 1}/{Parameter 2, etc.}
حيث:
{Application} هو المجلد الموجود فيه تطبيق الكيك وفي تطبيقنا هو mhmat
{Controller} المتحكم الذي نطلبه وفي المثال السابق طلبنا المتحكم groups
{Action} الحدث المطلوب وفي مثالنا add
{Parameter 1} الباراميتر أو الوسيط الأول وفي مثالنا لايوجد وسطاء لتابع add
{Parameter 2} الوسيط الثاني وهكذا كلما وضعت / وبعدها قيمة ما تكون وسيط آخر

نعود الآن إلى عبارة:

<?php echo $content_for_layout ?>

سيتم استبدالها بالعرض المناسب أو دعنا نقل بال view المناسبة للحدث فمثلاً قمنا بطلب حدث add فسيقوم هذا الحدث باستدعاء ال view أو العرض المناسب وهو add.ctp

هذا كل شيء لليوم وبالمناسبة درس اليوم هو أساس الكيك فمن تابعه وطبقه فوراً فسيصبح طريقه سهلاً إن شاء الله لأن درس اليوم لخص مفهوم MVC وطريقة الكيك في تنفيذها.

شارك هذه التدوينة:
إضافة 'MVC وإكمال المتحكم الأول' إلى Del.icio.usإضافة 'MVC وإكمال المتحكم الأول' إلى diggإضافة 'MVC وإكمال المتحكم الأول' إلى Technoratiإضافة 'MVC وإكمال المتحكم الأول' إلى Stumble Uponإضافة 'MVC وإكمال المتحكم الأول' إلى Google Bookmarksإضافة 'MVC وإكمال المتحكم الأول' إلى FaceBookإضافة 'MVC وإكمال المتحكم الأول' إلى MySpaceإضافة 'MVC وإكمال المتحكم الأول' إلى Twitterإضافة 'MVC وإكمال المتحكم الأول' إلى FriendFeed
الوسوم: تدوينات رمضان, تعلم الكيك وتطوير المواقع بالبيت
أرسل هذه التدوينة لصديق أرسل هذه التدوينة لصديق
طباعة هذه التدوينة طباعة هذه التدوينة

    إقرأ أيضاً:

    • تنويه. للمشتركين بدورة الكيك
    • سؤال وجواب عن الكيك
    • الجدول الثاني tasks
    • ماهي JSON؟
    • استبيان الأسبوع الرابع

25 تعليق في “MVC وإكمال المتحكم الأول”

  1. أبوبكر: September 7, 2008 - الأحد 07 رمضان 1429 في 11:09 ص

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


  2. أبوبكر: September 7, 2008 - الأحد 07 رمضان 1429 في 1:32 م

    السلام عليكم
    لقد قمت بالخطوات فعلا
    وكل شىء على مايرام
    غير أني عندما جربت الإضافة بالنظام الأول scaffold وجدت أنني لابد أن أجعل الـ id يزيد تلقائيا auto increment.
    ولكن باقي الأمور أظنها تبدو جيدة.


  3. خالد: September 7, 2008 - الأحد 07 رمضان 1429 في 1:55 م

    نعم أخي الكريم ويبدو أني نسيت أن أذكر هذا في تصميم قاعدة البيانات، ما رأيك لحد الآن بالكيك؟ رغم أن هذه التدوينة غير منظمة جيداً أي الأفكار غير مرتبة جيداً


  4. عبد الولي: September 7, 2008 - الأحد 07 رمضان 1429 في 7:24 م

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

    قمت بإعداد الكاك و لكن بعد أن قمت بتغيير إسم الجدول إلى groups ظهرت لي الرسالة التالية عند محاولة فتح الصفحة
    http://localhost/cake/groups
    Error: Database table groupss for model Groups was not found.
    مع العلم أن إسم الجدول هو groups و ليس groupss.


  5. خالد: September 7, 2008 - الأحد 07 رمضان 1429 في 7:43 م

    وعليكم السلام ورحمة الله وبركاته وتسلم أخي الكريم هذا أقل مايمكن … بالنسبة للخطأ فليس من الضروري أن يكون الجدول اسمه خاطىْ، تأكد من اسم المتحكم جيداً ومن اسم الموديل GroupModel الموديل مفرد وليست جمع


  6. عمر الدليمي: September 8, 2008 - الاثنين 08 رمضان 1429 في 6:24 ص

    كلامك رائع ولكن الكيك فيه عطل مزعج حقاً! أصمم له جدولاً في قواعد البيانات ولا يأخذه! إلا بعد مسح ملفات tmp.
    وتعرف كيفية الإزعاج عند الدخول إلى كل مجلد لتمسح ملفاته!
    سأبحث عن طريقة لتعطيل الكاش والtmp. إلى حين رفعها على النت :) .


  7. عمر الدليمي: September 8, 2008 - الاثنين 08 رمضان 1429 في 6:24 ص

    بالمناسبة هو سبب هذا الخطأ:
    Error: Database table groupss for model Groups was not found.
    مع العلم أن إسم الجدول هو groups و ليس groupss.

    ولم يصحح إلا بعد حذف الملفات المؤقتة!


  8. عمر الدليمي: September 8, 2008 - الاثنين 08 رمضان 1429 في 6:56 ص

    السلام عليكم <– ربما تحتاج لمسح تعليقاتي لكثرتها.
    أفضل وضع كود index.ctp مثل هذا كي نفصل بين التدوينات

    أما كود المتحكم فسيكون هكذا، كي لا يظهر خطأ “لم يتم حفظ القائمة” ونحن لم نفعل شيئاً أصلا، فقط نريد الإضافة:

    set('groups', $this->Group->find('all'));
    }
    function add() {
    if(!empty($this->data)) {
    if($this->Group->save($this->data)) {
    $this->Session->setFlash("تم حفظ القائمة");
    $this->redirect(array('action' => 'index'));
    } else {
    $this->Session->setFlash("لم يتم الحفظ، حاول ثانية");
    }
    } else {
    $this->Session->setFlash("أضف قائمة جديدة");
    }
    }
    }
    ?>


  9. خالد: September 8, 2008 - الاثنين 08 رمضان 1429 في 12:51 م

    أخي عمر طالما يوجد سطر في ملف core.php داخل مجلد config:
    Configure::write(‘Cache.disable’, true);

    فقط أزل التعليق عليه ودعه يعمل ;-)

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


  10. naish: September 11, 2008 - الخميس 11 رمضان 1429 في 6:24 ص

    رمضان كريم للجميع وكل عام وانتم بخير

    اخي الفاضل لقد وصلت لمدونتك الرائعه عن طريق google

    وقد اعجبت باسلوب طرحك فضلا عن تفاعل الاعضاء

    ولكن واجهتني مشكلة حيث ارغب ان اكون معكم في دورة الكيك ولكن لم استطع تحديد نقطه البداية اقصد الموضوع الاول

    لذا اقترح عليك اخي ترقيم المواضيع المتعلقة بدورة الكيك ابتداءا من الرقم واحد وهكذا

    وتقبل خالص تحياتي


  11. خالد: September 11, 2008 - الخميس 11 رمضان 1429 في 11:27 ص

    إن شاء الله سأفعل ذلك لكن المدونة الآن تمر بحالة “إعادة هيكلية كاملة”


  12. تعلم الكيك وتطوير المواقع بالبيت | مدونة الويب 2.0: October 3, 2008 - الجمعة 04 شوال 1429 في 5:47 ص

    [...] MVC وإكمال المتحكم الأول [...]


  13. الجدول الثاني tasks | مدونة الويب 2.0: October 3, 2008 - الجمعة 04 شوال 1429 في 5:57 ص

    [...] تحميل وتثبيت الكيك، بدأنا بأول متحكم وهو groups، وبعد ذلك أكملنا به وتناقشنا بمفهوم [...]


  14. مي: April 6, 2009 - الاثنين 11 ربيع الثاني 1430 في 1:17 ص

    انا عندي مشكله انا عملت الجاول ولما بدخل عليها من المتصفح
    http://localhost/cake/groups بيطلعلي رساله خطأ
    The requested URL /cake/groups was not found on this server.


  15. خالد: April 6, 2009 - الاثنين 11 ربيع الثاني 1430 في 4:57 ص

    ما اسم مجلد المشروع الذي تعملين عليه؟ هل هو cake؟ أم اسميته باسم آخر


  16. مي: April 6, 2009 - الاثنين 11 ربيع الثاني 1430 في 8:25 م

    اسم قاعده البيانات info وسميت المجلد info ايضا وحاولت ثانيا
    http://localhost/info مع العنوان ده بيظهر لي ان تم الاتصال بقاعهد البيانات بنجاح
    عند اضافه الجدول http://localhost/info/groups يظهر لي
    The requested URL /info/groups was not found on this server.
    شكرا جدا علي الرد لاني هتجنن


  17. خالد: April 6, 2009 - الاثنين 11 ربيع الثاني 1430 في 10:42 م

    يجب أن تضيفي باقي الطبقات:
    Controller and Views


  18. مي: April 7, 2009 - الثلاثاء 12 ربيع الثاني 1430 في 12:30 ص

    انا ضفت الController وModels بس لسا في مشكله وعلي فكره انا معدلتش الmor_rewrite بس فعلا مش بيعرض اي حاجه عن الجدول


  19. خالد: April 7, 2009 - الثلاثاء 12 ربيع الثاني 1430 في 3:26 م

    يبدو بالفعل أنه خطأ mod_rewrite هل اطلعت على:
    http://book.cakephp.org/view/37/Apache-and-mod_rewrite-and-htaccess


  20. مي: April 7, 2009 - الثلاثاء 12 ربيع الثاني 1430 في 8:44 م

    اشتغل بالفعل معي لما ظبطت mod_rewrite ومتشكره ليك جدا مستر خالد والي الامام ان شاء الله


  21. مؤيد المحمدي: June 18, 2009 - الخميس 25 جمادى الثانية 1430 في 8:05 م

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

    جزاك الله كل خير اخوي خالد فعلا دورة ممتازة وجهد تشكر عليه كل الشكر ..

    طبقت الدرس واشتغل مهاي تمام التمام ولاكن من خلال مافهمتك بهذه الدورة لطريقة عمل الكيك فهل من الأصح ان تكتب جملة (مهمات) الموجودة في default.ctp بداخل ملف index.ctp بالمثال السابق ؟

    لان default.ctp يعرض محتويات الصفحة الرئيسية بينما الجزء الخاص بالمهمات هو في index.ctp

    مجرد تساؤل لإثراء الموضوع ولمعرفة مقدار استيعابي لهذا الجزء من الدورة ..

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


  22. shaban: July 15, 2009 - الأربعاء 24 رجب 1430 في 11:08 ص

    لما بكتب http://localhost:8080/cake/groups
    بيقولى Not Found

    The requested URL /cake/groups was not found on this server.
    Apache/2.2.4 (Win32) PHP/5.2.3 Server at localhost Port 8080

    من فضلك عايز الحل


  23. خالد: July 15, 2009 - الأربعاء 24 رجب 1430 في 12:08 م

    ساويت صفحة index.ctip داخل مجلد views/groups ؟


  24. سمر: November 2, 2009 - الاثنين 15 ذو القعدة 1430 في 1:11 م

    لقد سميت قاعدة المعطيات taskaty

    وربطت الكيك مع قاعدة المعطيات
    وطلبت العنوان التالي :
    http://localhost/taskaty/groups

    فظهر لي الخطأ التالي
    Parse error: syntax error, unexpected T_CLASS in C:\apache2triad\htdocs\taskaty\app\controllers\groups_controller.php on line 2


  25. خالد: November 2, 2009 - الاثنين 15 ذو القعدة 1430 في 6:59 م

    ماهو محتوى ملف groups_controller.php؟


شاركنا برأيك؟

الرجاء الكتابة باللغة العربية الفصحى، وإذا كنت تريد كتابة سؤال حاول البحث في غوغل أولاً فغالباً ستجد عنده الخبر اليقين.

  • الأكثر قراءة
  • الأحدث
  • الأرشيف
  • تعلم الكيك وتطوير المواقع بالبيت
  • أفضل الأدوات لرفع الملفات
  • تنظيم الوقت البرمجي
  • مقدمة في CakePHP
  • أفكار ومواقع ويب 2 شهيرة
  • لماذا غوغل شريرة!
  • الخطوط العربية
  • هل تريد أن تكسب 1000 دولار؟
  • تصميم قاعدة البيانات
  • مواقع عربية بالدروبال
    1. كتب مطلوبة
    2. إصلاح علة أمنية في دروبال 7.3 و 7.4
    3. حل المشكلة أم الترقيع؟
    4. مراجعة كتاب 50 Tips and Tricks for MongoDB Developers
    5. تعريب الوحدات الإضافية
    6. البرامج العربية
    7. تعريب الدروبال 7 – العد التنازلي للنواة
    8. تعريب الدروبال 7 – اليوم الثالث
    9. تعريب الدروبال 7 – اليوم الثاني
    10. تعريب الدروبال 7 – اليوم اﻷول
    11. تعريب الدروبال 7
    1. يونيو 2011
    2. مايو 2011
    3. أبريل 2011
    4. مارس 2011
    5. فبراير 2011
    6. يناير 2011
    7. ديسمبر 2010
    8. نوفمبر 2010
    9. أكتوبر 2010
    10. أغسطس 2010
    11. مارس 2010
    12. فبراير 2010
    13. يناير 2010
    14. ديسمبر 2009
    15. سبتمبر 2009
    16. أغسطس 2009
    17. يوليو 2009
    18. يونيو 2009
    19. مايو 2009
    20. مارس 2009
    21. فبراير 2009
    22. يناير 2009
    23. ديسمبر 2008
    24. نوفمبر 2008
    25. أكتوبر 2008
    26. سبتمبر 2008
    27. أغسطس 2008
    28. يوليو 2008
    29. يونيو 2008
    • اشترك بآخر الأخبار RSS

      Feeds Counter

      أو

    • أشارك بتعريب دروبال 7

    • أراجع كتب Oreilly

      I review for the O'Reilly Blogger Review Program
    • أفضل هدية تقدمها لي

    • تقنية الطماطم

      I Use the Pomodoro Technique
    • عشرون عام لمشروع اللينكس

      I'll be celebrating 20 years of Linux with
The Linux Foundation!
    • وسوم

      Ajax css IDE jQuery php SEO TinyMCE أخبار المدونة أذكار أطر العمل أفكار أمازون إدارة المحتوى إدارة محتوى إضافات استبيان الأجاكس الأمان الاختبارات الآلية الكيك اللغة العربية برمجة تحديثات تحميل تدوينات رمضان تصميم تطوير تعريب تعلم الكيك وتطوير المواقع بالبيت تكتيك تنظيم الوقت جوائز حديث دروبال دعاية فايرفوكس فرص عمل كتب مسابقات مشاريع مهمات مواقع نصائح هندسة برمجيات وورد بريس

    حول المدونة

    • 2008-2012 مدونة الويب 2.0.
    • يمكنك نقل المحتويات أو اقتباس أي جزء منها ويفضل ذكر المصدر.
    • من الممكن أن تساعدك خريطة الموقع.

    عروض العمل

    • يمكنك أن تناقشني حول عروض العمل للمدونات أو لمواقع الويب 2.0.
    • أيضاً يمكنك استشارتي في وضع التفاصيل لمدونة أو لفكرة مشروع جديد.
    • سيرتي الذاتية على My Linkedin Profile

    تواصل معي

    • خالد الحوراني مطور ويب 2.0
    • تابع أخباري على My Twitter account
    • أو راسلني فوراً

    Switch to our mobile site