حول الـ Momtaz Zones

هذه المقالة تحديث للمقالة السابقة (تصميم قالب ووردبريس باستخدام ممتاز) لتوضيح بعض النقاط الهامة بشأن النسخة الاخيرة للاطار – 1.3 -؛ تحديدا بخصوص نظام الـ Momtaz Zones والذي سنتعرف عليه بشيء من التفصيل في هذه المقالة باذن الله.

مقدمة

في اصدارات مُمتاز السابقة،أعتمد الإطار على نظام خطاطيف الووردبريس (WP Hooks) عند إدراج محتوى إضافي في ملفات القالب (دون تعديلها). أو بما يعرف في عالم تطوير قوالب الووردبريس Template Hooks.

الفائدة والغرض الأساسي منها كان تسهيل عملية إدراج المحتوى الإضافي عبر القوالب الفرعية والإضافات المصغرة. وعلى الرغم من أن نظام الـ WP Hooks يؤدي الغرض. إلا أن الإعتماد بشكل كلي عليه قد يتسبب في تعقيد عملية التطوير. فالمطور المبتدأ من الصعب عليه تتبع سير عملية التنفيذ، إضافة إلى ذلك فقد تواجه بعض الصعوبات عند تطوير القوالب الفرعية أو الإضافات المصغرة. فمن الصعب عليك برمجياً معرفة إن كان القالب يوفر خطاف لإضافة المحتوى بعد الترويسة أو بعد محتوى المقالة؟ .. أو التفرقة مابين الخطاطيف المستدعاة في ملفات القالب (Templates) أو الدوال؟ أو نواة الووردبريس؟!

إن المشكلة شائعة في مجتمع تطوير قوالب الووردبريس، ولكل مطور أو قالب طريقته الخاصة في حل الأمر. فهناك من يرى ضرورة توحيد أسماء الـ Template Hooks في جميع قوالب الووردبريس، والبعض يرى بان مطوري القوالب لا يجب عليهم إستخدام الـ WP Hooks بهذه الطريقة والإكتفاء بإستخدام الملفات Template Parts. وآخرون يرون أن على نواة الووردبريس توفير نظام جديد أو بعض الطرق التي قد تحل المعضلة!.

لذا. رأينا ضرورة تقديم نظام جديد في ممتاز 1.3 يوفر على المطورين الجهد في عملية التطوير، ووسيلة للتكيف مع أي تطوير محتمل لنواة الووردبريس في هذا السياق.

نظرة عامة

إن المحرك الأساسي للنظام هول كلاس Momtaz_Zones الذي يوفر بعض الدوال لتمكين تسجيل، إلغاء تسجيل، إستعراض وإستدعاء الـ Zones. ومن المحتمل إضافة المزيد من الدوال المساعدة في النسخ القادمة من مُمتاز.

Momtaz_Zones::get

عبر هذه الدالة، يمكنك جلب مصفوفة جميع الـ Zones الممكن إستخدامها في القالب أو جلب معلومات Zone معين.

مثال:

<pre dir="ltr"> <?php print_r( Momtaz_Zones::get() ); ?></pre>

يفترض، أن تحصل على مصفوفة شبيهة بهذه:

 Array
(
    [wrapper:before] => stdClass Object
        (
            [title] => قبل الغلاف
            [description] => 
            [id] => wrapper:before
        )

    [wrapper:after] => stdClass Object
        (
            [title] => بعد الغلاف
            [description] => 
            [id] => wrapper:after
        )
)

Momtaz_Zones::add_callback

الطريقة الجديدة لإضافة محتوى معين إلى الـ Zone هي عبر إستدعاء دالة Momtaz_Zones::add_callback وهي شبيهة جداً بطريقة عمل دالة الووردبريس المعروفة add_action.

مثال:

add_action( 'momtaz_init', 'hook_my_zones', 11 );

function hook_my_zones(){
	Momtaz_Zones::add_callback( 'primary_menu:after', 'get_search_form' );	
}

في الكود السابق قمنا بعمل دالة جديدة باسم hook_my_zones بداخلها استخدمنا الدالة Momtaz_Zones::add_callback والتي تأخذ بارمترين الاول عبارة عن اسم الـ zone والثاني عبارة عن اسم الدالة التي اريد إستدعائها في هذا الـ zone، في النهاية قمنا بتطبيق الدالة chook_my_zones على الخطاف المسمى momtaz_init مع وضع قيمة 11 – اكبر من الافتراضي 10 – في البارمتر الثالث لها للتأكيد على ان الدالة يتم تطبيقها بعد القالب الاساسي – الاطار – هذا لضمان ان الـ zones قد تم تسجيلهااولا بواسطة إطار العمل.

Momtaz_Zones::register

حسناً ماذا لو أردت إضافة zones جديدة بجانب الـ zones الذي يوفرها إطار العمل؟!. الامر يتم في خطوتين هما؛ تسجيل الـ zone الجديد في قائمة الـ zones الموجودة، ثم النداء على هذا الـ zone في المكان المناسب له في القالب.

ضع هذا الكود في ملف الـ functions.php الخاص بالقالب الفرعي الذي تعمل عليه:

add_action( 'momtaz_init', 'register_my_zones', 11 );

function register_my_zones() {

	Momtaz_Zones::register( 'footer:inside', array(
		'title' => __( 'Inside Footer', 'textdomain' ),
		'description' => __( 'A zone called inside footer', 'textdomain' ),
	) );

}

في الكود السابق قمنا بتطبيق الدالة register_my_zones على الخطاف المسمى momtaz_init داخل هذه الدالة استخدمنا دالة تسجيل الـ zone المسماة Momtaz_Zones::register التي تاخذ في البارمتر الأول منها اسم الـ zone والذي يجب أن يكون مختلفا عن اي اسم zone آخر مثلا استخدمنا footer:inside، والبارمتر الثاني للدالة نضع مصفوفة تحمل تفاصيل هذا الـ zone؛ هذه التفاصيل هي العنوان والوصف (إختياري).

الآن علينا النداء على هذا الـ zone في المكان المناسب له بالقالب، وذلك باستخدام الدالة Momtaz_Zones::call. مثال:

<?php Momtaz_Zones::call( 'footer:inside' ) ?>

Momtaz_Zones::deregister

أعتقد بان الفائدة منها واضح من العنوان، وظيفها هي إلغاء تسجيل zone معين وتعطيلها، فعند إلغاء تسجيل zone معين، لن يتم إستداء أي دالة مضافة لذاك الـ zone ولا يوجد داعي لإزالة كود الإستدعاء من ملفات القالب!. هذا السلوك مفيد جداً عند التعامل مع القوالب كبيرة الحجم أو عند تنفيذ تغييرات كثيرة لإطار العمل !

Momtaz_Zones::is_exists

دالة أخرى مفيدة، وظيفتها التاكد من الـ zone مسجلة أم لا، فعلى سبيل المثال لنفترض مثلاً بأنك ترغب بإضافة محتوى معين بعد القائمة الرئيسية؟ .. وإن لم تكن القائمة الرئيسية مفعلة فبعد الترويسة؟!

مثال:

add_action( 'momtaz_init', 'hook_my_zones', 11 );

function hook_my_zones(){
	if ( Momtaz_Zones::is_exists( 'primary_menu:after' ) ) {
		Momtaz_Zones::add_callback( 'primary_menu:after', 'get_search_form' );	
	} else {
		Momtaz_Zones::add_callback( 'header:after', 'get_search_form' );	
	}
}

الخاتمة

هناك العديد من المزايا الأخرى التي يوفرها إطار العمل مُمتاز. وسنتطرق إلى شرحها أكثر مستقبلاً. حتى الآن بإمكانك إستكشاف إطار العمل بنفسك ومشاركتنا تجاربك وإقتراحاتك في صفحة المشروع على الـ Github.

أضف تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *