منتديات الدعم > القسم التعليمى
كيفية التعامل مع الملف (( modification.xml ))
(1/1)
islam2hamy:
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله و بركاته
موضوع هذا الدرس هو شرح مفصل عن الملف ((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>
--- نهاية الكود ---
و فى الختام أتمنى أن يكون الشرح بسيط و مفيد
وما توفيقى إلا بالله
تصفح
[0] فهرس الرسائل
الذهاب الى النسخة الكاملة