Smf عربى

منتديات الدعم => القسم التعليمى => الموضوع حرر بواسطة: islam2hamy في 20 , ديسمبر, 2011 - 07:20:40 صباحاً

العنوان: كيفية التعامل مع الملف (( modification.xml ))
أرسل بواسطة: islam2hamy في 20 , ديسمبر, 2011 - 07:20:40 صباحاً
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله و بركاته

موضوع هذا الدرس هو شرح مفصل عن الملف ((modification.xml))


تعريفه :

    هو الملف الذى يحتوى على الأوامر الخاصة بإجراء تعديلات على ملفات المنتدى .

بداية و نهاية الملف :

    بداية الملف تحتوى على تعريف عن لغة الملف - والتى هو xml - ونوعه - أنه مود لمنتدى Smf - ثم اسم المود وصاحبه ثم رقم الإصدار الخاص به .

وهذا هو شكلها :

شفرة: [اختيار]
<?xml version="1.0"?>
<!DOCTYPE modification SYSTEM "http://www.simplemachines.org/xml/modification">

<modification xmlns="http://www.simplemachines.org/xml/modification" xmlns:smf="http://www.simplemachines.org/">
    <id>إسم المستخدم الذى أنت قمت بالتجسل به فى موقع الـ "simplemachines.org" :إسم المود</id>
    <version>رقم الإصدار الخاص بالمود</version>

وهذا هو شكل النهاية و هو كود إقفال للوسم مود :
شفرة: [اختيار]
</modification>

و الأن نأتى "للحشو" :
- ما هو بين البداية و النهاية - وهى الأوامر الخاصة بإجراء تعديلات على ملفات المنتدى .

وفى هذه النقطة نحتاج الى تحديد 3 عناصر هامة :

1- اسم و مسار الملف الذى سوف يتم إجراء التعديل عليه .
2 - نوع التعديل الذى سوف يتم (( إستبدال كود بكود أخر , إضافة كود بعد كود موجود بالملف , إضافة كود قبل كود موجود بالملف , إضافة كود بآخر الملف )) .
3 - الكود الأصلى الذى سوف يتم البحث عنه والذى هو موجود بالملف المراد تعديله , والكود الذى سوف يتم إضافته .

وهذه بعض المُتغيرات التى يفهمها البرنامج والتى تساعدك فى تسهيل عملية تحديد مسار الملف الذى سوف يتم تعديله :


اقتباس
  • $boarddir : وغيره من الملفات فى هذا المسار index.phpوهو يشير الى المسار الرئيسى للمنتدى حيث الملف
  • $sourcedir :  (  إلخ ...,Post.php, Admin.php)  حيث تجد الملفات /Sources  وهو يشير الى المجلد
  • $avatardir : حيث يمكنك إيجاد الصور الشخصية ./Avatars وهو يشير الى المجلد
  • $themedir:  وهو يشير إلى المجلد الخاص بالقالب - الإستايل - الرئيسى .
  • $themes_dir : وهو يشير الى المجلد الذى يحتوى على كل القوالب الخاصة بالمنتدى , بما فى ذلك القالب الرئيسى
  • $imagesdir : وهو يشير الى المجلد الخاص بالصورة للقالب الرئيسي .
  • $languagedir : وهو يشير الى المجلد الخاص بملفات اللغة الخاصة بالمنتدى .
  • $smileysdir : وهو يشير الى المجلد الخاص بالإبتسامات .

والان مع شرح هذه العملية "الحشو" :

1 - وهى تبدأ بمسار الملف كالمثال التالى :

شفرة: [اختيار]
<file name="$languagedir/Modifications.arabic-utf8.php">
هنا نكتب العملية
</file>

لاحظ معى اننا قمنا بإستخدام المُتغير "$languagedir" لكى نخبر البرنامج - المنتدى - بأن الملف الذى نريد تعديله موجود بمجلد اللغة ثم أخبرناه بإسم الملف وهو "Modifications.arabic-utf8.php"

و قبل إنهاء هذا الامر بـ "<" يمكننا وضع أمر أخر يخبره هل هذا التعديل مهم أم يمكنه تركه اذا لم يكن موجود وذلك بالكود (("error="skip))  ,او الكود  (("error="fatal)) إذا كان هذا التعديل مهم جدا ولا يجب الإستغناء عنه وعدم إكمال عميلة التثبيت و إظهار خطأ , أو ترك الكود بدون هذا الامر كما هو بالاعلى وهذا يعنى انه سوف يظهر خطأ لكن يمكنه الإستمرار فى تثبيت المود مع عدم تعديل هذه الجزءية .

ثم تكون نهياة التعديل على هذا الملف بالوسم (( </file> ))

2 - البدء فى عملية التعديل , وهى توضع بين هذا الوسم  :

شفرة: [اختيار]
<operation>
خاصية البحث و التعديل تكتب هنا
</operation>

3 - نوع التعديل وعملية البحث عن الكود الاصلى, وهى توضع بين هذا الوسم  :
شفرة: [اختيار]
<search position="نوع التعديل هنا">
<![CDATA[ الكود هنا ]]>
</search>

وكما وضحنا سابقا فهناك 4 أنواع من التعديلات (( إستبدال كود بكود أخر , إضافة كود بعد كود موجود بالملف , إضافة كود قبل كود موجود بالملف , إضافة كود بآخر الملف ))
وتكون بهذا الشكل
(( <search position="replace"> أو <search position="before"> أو <search position="after"> أو <search position="end" /> )) على الترتيب

ثم نقوم بوضع الكود الذى نريد البحث عنه داخل الامر (( <![CDATA[ الكود هنا ]]> )) ثم لإنهاء أمر البحث الوسم (( </search> )) إلا فى حالة "end" لانه يتم اغلاق الوسم فى نفس السطر بالعلامة"/" (( <search position="end" /> ))

ثم بعد ذلك نختم بالوسم الخاص بالتعديل الذى سوف يتم
شفرة: [اختيار]
<add>
  <![CDATA[ هنا نكتب التعديل الذى سوف يتم ]]>
</add>

وهذا شكل الأمر بالكامل :

شفرة: [اختيار]
<file name="$languagedir/إسم الملف.php">
   <operation>
     <search position="نوع التعديل هنا">
       <![CDATA[
الكود هنا
]]></search>
     <add>
       <![CDATA[
هنا نكتب التعديل الذى سوف يتم
]]></add>
   </operation>
</file>

لاحظ أنه :

يمكنك عمل اكثر من تعديل على نفس الملف و ذلك عن طريق بداية وسم (( <operation></operation> )) جديد بعد إنتهاء الوسم الاول ,
أيضا يمكنك التعديل على اكثر من ملف و ذلك عن طريق بداية وسم جديد (( </file> <file name=""> ))




وهذا هو مثال للملف النهائى لكى تطبق عليها ما تعلمناه مأخوذ من مود الألعاب الفلاش :

شفرة: [اختيار]
<?xml version="1.0"?>
<?xml-stylesheet href="modification.xsl" type="text/xsl"?>
<!DOCTYPE modification SYSTEM "http://www.simplemachines.org/xml/modification">

<modification xmlns="http://www.simplemachines.org/xml/modification" xmlns:smf="http://www.simplemachines.org/">
<!-- This information needs to be the same as that in the package-info.xml. -->
<id>Niko:Arcade</id>
<version>2.5 RC1</version>

<file name="$boarddir/index.php">
<operation>
<search position="after"><![CDATA[ elseif (empty($_REQUEST['action']))]]></search>
<add><![CDATA[ // Check for arcade actions
// IBPArcade v2.x.x Games support
elseif (isset($_REQUEST['act']) && strtolower($_REQUEST['act']) == 'arcade')
{
$_REQUEST['action'] = 'arcade';

if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'newscore')
$_REQUEST['sa'] = 'ibpsubmit2';

require_once($sourcedir . '/Arcade.php');
return 'Arcade';
}
// IBPArcade v3.x.x Games support
elseif (isset($_REQUEST['autocom']) && $_REQUEST['autocom'] == 'arcade')
{
$_REQUEST['action'] = 'arcade';

if (isset($_REQUEST['do']) && $_REQUEST['do'] == 'savescore')
$_REQUEST['sa'] = 'ibpsubmit3';
elseif (isset($_REQUEST['do']) && $_REQUEST['do'] == 'verifyscore')
$_REQUEST['sa'] = 'ibpverify';

require_once($sourcedir . '/Arcade.php');
return 'Arcade';
}
elseif (isset($_REQUEST['play']) && !isset($_REQUEST['game']))
{
$_REQUEST['game'] = $_REQUEST['play'];
unset($_REQUEST['play']);
$_REQUEST['sa'] = 'play';

require_once($sourcedir . '/Arcade.php');
return 'Arcade';
}
elseif (isset($_REQUEST['highscore']) && !isset($_REQUEST['game']))
{
$_REQUEST['game'] = $_REQUEST['highscore'];
unset($_REQUEST['highscore']);
$_REQUEST['sa'] = 'highscore';

require_once($sourcedir . '/Arcade.php');
return 'Arcade';
}
elseif ((isset($_REQUEST['game']) || isset($_REQUEST['match'])) && !isset($_REQUEST['action']))
{
require_once($sourcedir . '/Arcade.php');
return 'Arcade';
}
]]></add>
</operation>

<operation>
<search position="before"><![CDATA[ 'announce' => array('Post.php', 'AnnounceTopic'),]]></search>
<add><![CDATA[
'arcade' => array('Arcade.php','Arcade'),]]></add>
</operation>
</file>

<file name="$sourcedir/ManageSettings.php">
<operation>
<search position="after"><![CDATA[ );

// Are we getting info for the help section.]]></search>
<add><![CDATA[ // arcade = arcade (makes sense, right?)
'arcade' => array(
'url' => 'action=admin;area=arcade',
'settings' => array(
'arcadeEnabled' => 1,
),
),]]></add>
</operation>
</file>

<file name="$sourcedir/ManagePermissions.php">
<operation>
<search position="before"><![CDATA[ 'profile_remote_avatar' => array(false, 'profile', 'use_avatar'),]]></search>

<add><![CDATA[
'arcade_view' => array(false, 'arcade', 'arcade'),
'arcade_play' => array(false, 'arcade', 'arcade'),
'arcade_submit' => array(false, 'arcade', 'arcade'),
'arcade_comment' => array(true, 'arcade', 'arcade', 'arcade_moderate'),
'arcade_user_stats' => array(true, 'arcade', 'arcade', 'arcade_moderate'),
'arcade_edit_settings' => array(true, 'arcade', 'arcade', 'arcade_moderate'),
'arcade_create_match' => array(false, 'arcade', 'arcade'),
'arcade_join_match' => array(false, 'arcade', 'arcade'),
'arcade_join_invite_match' => array(false, 'arcade', 'arcade'),
'arcade_admin' => array(false, 'arcade', 'administrate'),
]]></add>
</operation>

<operation>
<search position="before"><![CDATA[ $context['non_guest_permissions'] = array(]]></search>
<add><![CDATA[
'arcade_admin',
'arcade_create_match',
'arcade_join_match',
'arcade_join_invite_match',
'arcade_comment',
'arcade_edit_settings',
'arcade_user_stats',]]></add>
</operation>
</file>

<file name="$sourcedir/Profile.php">
<operation>
<search position="after"><![CDATA[ 'issuewarning' => array(]]></search>
<add><![CDATA[
'arcadeChallenge' => array(
'label' => $txt['sendArcadeChallenge'],
'file' => 'Profile-Arcade.php',
'function' => 'arcadeChallenge',
'enabled' => !empty($modSettings['arcadeArenaEnabled']) && !empty($modSettings['arcadeEnabled']),
'permission' => array(
'own' => array(),
'any' => array('arcade_create_match'),
),
),
]]></add>
</operation>

<operation>
<search position="after"><![CDATA[ 'showposts' => array(]]></search>
<add><![CDATA[
'arcadeStats' => array(
'label' => $txt['arcadeStats'],
'file' => 'Profile-Arcade.php',
'function' => 'arcadeStats',
'enabled' => !empty($modSettings['arcadeEnabled']),
'permission' => array(
'own' => array('arcade_user_stats_any', 'arcade_user_stats_own'),
'any' => array('arcade_user_stats_any'),
),
),
]]></add>
</operation>

<operation>
<search position="after"><![CDATA[ 'forumprofile' => array(]]></search>
<add><![CDATA[
'arcadeSettings' => array(
'label' => $txt['arcadeSettings'],
'file' => 'Profile-Arcade.php',
'function' => 'arcadeSettings',
'enabled' => !empty($modSettings['arcadeEnabled']),
'permission' => array(
'own' => array('arcade_edit_settings_any', 'arcade_edit_settings_own'),
'any' => array('arcade_edit_settings_any'),
),
),
]]></add>
</operation>
</file>
</modification>

و فى الختام أتمنى أن يكون الشرح بسيط و مفيد
وما توفيقى إلا بالله