Simple Machines Community Forum

SMF Support => Language Specific Support => العربية (Arabic) => Topic started by: islam2hamy on December 20, 2011, 12:21:47 AM

Title: كيفية التعامل مع الملف (( modification.xml ))
Post by: islam2hamy on December 20, 2011, 12:21:47 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله و بركاته

موضوع هذا الدرس هو شرح مفصل عن الملف ((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 - الكود الأصلى الذى سوف يتم البحث عنه والذى هو موجود بالملف المراد تعديله , والكود الذى سوف يتم إضافته .

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


Quote

  • $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>

و فى الختام أتمنى أن يكون الشرح بسيط و مفيد
وما توفيقى إلا بالله
Title: Re: كيفية التعامل مع الملف (( modification.xml ))
Post by: BaghdadGhost on December 20, 2011, 02:47:12 PM
شرح بسيط و مفيد جدا بارك الله بيك اخي اسلام
Title: Re: كيفية التعامل مع الملف (( modification.xml ))
Post by: islam2hamy on December 20, 2011, 11:59:44 PM
وبارك الله فيك أخى , شكرا لك
Title: Re: كيفية التعامل مع الملف (( modification.xml ))
Post by: Salem80 on April 21, 2012, 11:23:57 AM
افتنا كثير وقللت علينا مشوار البحث في المنتدى