السلام عليكم
درس مفصلنا اليوم هو الرابع من نوعه و هو إكمال للدروس [راجعها لزاما]
[درس مفصل]برمجة موديل بسيط - الدرس مفصل الأول
[درس مفصل]برمجة مكون بسيط - الدرس مفصل الثاني
[درس مفصل]برمجة المكونات - الدرس مفصل الثالث
أو إبحث عنها هنا في القسم .

نرجع اليوم بخطواتنا إلى الدرس مفصل السابق ـ إستدعاء الأزرار في الملف
رمز PHP:
<code style="white-space:nowrap"> <code> toolbar.example.html.php
</code> </code>

و نقلص محتواه إلى ما يلي
رمز PHP:
<code style="white-space:nowrap"> <code> <?php
defined
( '_JEXEC' ) or die( 'الوصول المباشر لهذه الصفحة غير مسموح' );

class
TOOLBAR_example {

function
_NEW() {
JToolBarHelper::save();
JToolBarHelper::apply();
JToolBarHelper::cancel();
}

function
_DEFAULT() {

JToolBarHelper::title( JText::_( 'إدارة المكون Example' ), 'generic.png' );
JToolBarHelper::publishList();
JToolBarHelper::unpublishList();
JToolBarHelper::deleteList();
JToolBarHelper::editListX();
JToolBarHelper::addNewX();

}
}
?>
</code> </code>

و أنا أعلم أنكم تلاحظون الفرق و الذي هو :
تقليل عدد الأزرار في شريط تحكم المكون

نبدأ الآن بالجديد
ننشئ مجلد جديد و نسميه رمز PHP:
<code style="white-space:nowrap"> <code> tables
</code> </code>

ننشئ داخله ملفا بإسم رمز PHP:
<code style="white-space:nowrap"> <code> example.php
</code> </code>

و نضع فيه
رمز PHP:
<code style="white-space:nowrap"> <code> <?php
defined
('_JEXEC') or die('الوصول المباشر لهذه الصفحة غير مسموح');
</code> </code>

مفهومة [راجع الدروس السابقة]
رمز PHP:
<code style="white-space:nowrap"> <code> class TableExample extends JTable
{
</code> </code>

نفتح كلاس جديد بإسم رمز PHP:
<code style="white-space:nowrap"> <code> TableExample
</code> </code>

و إمتداده رمز PHP:
<code style="white-space:nowrap"> <code> JTable
</code> </code>

معد مسبقا مع جملة joomla [كل ما يبدأ ب J فهو معد مسبقا مع نواة جملة joomla]

رمز PHP:
<code style="white-space:nowrap"> <code> var $id = null;
var
$message = null;
var
$published = 0;
</code> </code>

و هي الحقول التي سننشئها في جدول في قاعدة البيانات
*إسم الجدول سيكون رمز PHP:
<code style="white-space:nowrap"> <code> example_message
</code> </code>

ثم نضع
رمز PHP:
<code style="white-space:nowrap"> <code> function __construct(&$db)
{
parent::__construct( '#__example_message', 'id', $db );
}
</code> </code>

و هي دالة لتحديد مكان الـ ID
لاحظوا معي جيدا
جداول جملة joomla لا بد أن تبدأ بـ بادئة Prefix
و البادئة الإفتراضية تكون
رمز PHP:
<code style="white-space:nowrap"> <code> jos_
</code> </code>

لكن و لزيادة الحماية يمكنك تغييرها عند تثبيت setup المجلة لذلك لا يمكننا الإعتماد على بادئة واحدة في كود codeنا البرمجي
لذلك لاحظوا الدالة أعلاه و أنظروا إلى إسم الجدول
رمز PHP:
<code style="white-space:nowrap"> <code> #__example_message
</code> </code>

إذا العلامة رمز PHP:
<code style="white-space:nowrap"> <code> #__
</code> </code>

تعوض البادئة Prefix
و هنا لا يكون لدينا مشكل و إضافاتنا ستثبت على قواعد بيانات تابعة لجملة joomla و تحمل بادئات مختلفة .
رمز PHP:
<code style="white-space:nowrap"> <code> }

?>
</code> </code>

نغلق الكلاس و الملف
و يكون الناتج النهائي // الكود code نوعا ما
رمز PHP:
<code style="white-space:nowrap"> <code> <?php
defined
('_JEXEC') or die('الوصول المباشر لهذه الصفحة غير مسموح');

class
TableExample extends JTable
{
var
$id = null;
var
$message = null;
var
$published = 0;

function
__construct(&$db)
{
parent::__construct( '#__example_message', 'id', $db );
}

}

?>
</code> </code>

الآن نذهب للملف الذي أنشأناه في الدرس مفصل السابق
رمز PHP:
<code style="white-space:nowrap"> <code> admin.example.php
</code> </code>

نمسح ما بداخله و نضع

رمز PHP:
<code style="white-space:nowrap"> <code> <?php
// الوصول المباشر لهذه الصفحة غير مسموح
defined( '_JEXEC' ) or die( 'Restricted access' );

// للربط مع الملف admin.example.html.php
require_once( JApplicationHelper::getPath( 'admin_html' ) );
// تحديد مكان المجلة tables الذي أنشأناه سابقا
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.
'com_example'.DS.'tables');

$task = JRequest::getCmd('task');

// التحقق من قيمة المتغير $task و الذي يكون مسؤولا عن إظهار الأزرار و وقت و مكان إظهارها &#91;راجع الدرس مفصل السابق&#93;

switch($task){ // التحقق الشرطي من قيم المتغير $task
case 'add':
addExample(); // تفعيل الزر - جديد
break;

case
'cancel';
showExample();// تفعيل الزر - إلغاء
break;

case
'save';
saveExample();// تفعيل الزر - حفظ
break;

default:
showExample();// ما يظهر إفتراضيا و هو واجهة interface المكون
break;

}

function
addExample(){
$lists&#91;'published'&#93; = JHTML::_('select.booleanlist', 'published' , 'class="inputbox"', $row->published);
HTML_contact::addExample($lists);
}
// دالة للإتصال بقواعد البيانات و تحديدا بجدول example_message
function showExample(){
$db =& JFactory::getDBO();
$query = "SELECT * FROM #__example_message";
$db->setQuery( $query );
$rows = $db->loadObjectList();
if(
$db->getErrorNum()){
echo
$db->stderr();
return
false;
}
HTML_contact::showExample($rows);
}

// الدالة مسؤولة عن الحفظ
function saveExample(){
global
$mainframe;
$row =& JTable::getInstance('example', 'Table');
if(!
$row->bind(JRequest::get('post')))
{
JError::raiseError(500, $row->getError() );
}
$row->message = JRequest::getVar( 'message', '','post', 'string', JREQUEST_ALLOWRAW );

if(!
$row->store()){
JError::raiseError(500, $row->getError() );
}
$mainframe->redirect('index.php?option=com_example', 'تم الحفظ بنجاح');
}
?>
</code> </code>

و الآن ننشئ الملف
رمز PHP:
<code style="white-space:nowrap"> <code> admin.example.html.php
</code> </code>

و هو المسؤول عن التنسيق
و نضع بداخله
رمز PHP:
<code style="white-space:nowrap"> <code> <?php
defined
( '_JEXEC' ) or die( 'Restricted access' );

class
HTML_contact
{
function
addExample($lists){
JRequest::setVar( 'hidemainmenu', 1 );
$editor =& JFactory::getEditor();
?>

<script language="javascript" type="text/javascript">
<!--
function submitbutton(pressbutton) {
var form = document.adminForm;
if (pressbutton == 'cancel') {
submitform( pressbutton );
return;
}


submitform( pressbutton );
}

</script>

<form action="index.php" method="post" name="adminForm">
<table class="admintable">
<tr>
<td class="key">
<label for="message">
<?php echo JText::_( 'Message' ); ?>:
</label>
</td>
<td >
<?php
echo $editor->display('message','','100%','250','40','6');
?>
</td>
</tr>
<tr>
<td class="key">
<label for="message">
<?php echo JText::_( 'Published' ); ?>:
</label>
</td>
<td >
<?php
echo $lists&#91;'published'&#93;;
?>
</td>
</tr>
</table>
<input type="hidden" name="option" value="com_example" />
<input type="hidden" name="task" value="" />
</form>
<?php

}


function
showExample($rows){
?>
<form action="index.php"
method="post" name="adminForm">
<table class="adminlist">
<thead>
<tr>
<th width="20">
<input type="checkbox" name="toggle"
value=""
onclick="checkAll(<?php echo count($rows)?>)">
</th>
<th width="50" class="title">ID</td>
<th>الرسائل</th>
<th nowrap="nowrap">منشور / غير منشور</th>
</tr>
</thead>
<?php
$k
= 0;
for(
$i=0, $n=count($rows); $i < $n ; $i++)
{
$row = &$rows&#91;$i&#93;;
$checked = JHTML::_('grid.id', $i, $row->id);
$published = JHTML::_('grid.published', $row, $i);
?>
<tr class="<?php echo "row$k"; ?>">
<td><?php echo $checked?></td>
<td><?php echo $row->id?></td>
<td><?php echo $row->message?></td>
<td><?php echo $published?></td>
</tr>
<?
$k
= 1 - $k;
}
?>
</table>
<input type="hidden" name="option" value="com_example">
<input type="hidden" name="task" value="">
<input type="hidden" name="boxchecked" value="0">
</form>
<?php
}

}
?>
</code> </code>

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




نذهب إلى الملف الذي أنشأناه سابقا في الدروس السابقة
رمز PHP:
<code style="white-space:nowrap"> <code> example.xml
</code> </code>

نفتحه و بعد العبارة
رمز PHP:
<code style="white-space:nowrap"> <code> <description>Example Component By JoomlaUT</description>
</code> </code>

نفتح تعريف التثبيت setup من جديد
رمز PHP:
<code style="white-space:nowrap"> <code> <install>
</code> </code>

ثم تعريف إنشاء جداول قاعدة البيانات
رمز PHP:
<code style="white-space:nowrap"> <code> <queries>
</code> </code>

ثم الجدول رقم 1 و فيه ثلاث حقول
رمز PHP:
<code style="white-space:nowrap"> <code> <query id="1" table="jos_example_message">
CREATE TABLE `#__example_message` (
`
id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`
message` TEXT NOT NULL ,
`
published` TINYINT( 1 ) NOT NULL
);
</
query>
</code> </code>

لاحظوا معي سهولة تثبيت setup الجداول في قاعدة البيانات من ملف التثبيت setup XML
أنشأنا الجدول رمز PHP:
<code style="white-space:nowrap"> <code> example_message
</code> </code>

و ثلاثة حقول ،
الأول :
id و قيمته هي الترقيم التلقائي
message و قيمته هي Text لتخزين البيانات
الثالث هو published و قيمته عدد ثابت ذو خيارين فقط و هما 1 و صفر .

الجدول الذي أنشأناه إسمه :
رمز PHP:
<code style="white-space:nowrap"> <code> #__example_message
</code> </code>

تابع الدرس مفصل و ستعلم الغرض من العلامة
رمز PHP:
<code style="white-space:nowrap"> <code> #__
</code> </code>

ثم من ملف الـ XML ذاته نضيف الملف التالي لرفعه مع المكون أثناء تثبيت setupه
داخل التعريف
رمز PHP:
<code style="white-space:nowrap"> <code> <administration>
</code> </code>

نضيف
رمز PHP:
<code style="white-space:nowrap"> <code> <filename>admin.example.html.php</filename>
<
filename>tables/example.php.php</filename>
</code> </code>

لاحظ جيدا أن الملف موجود بالمجلد
رمز PHP:
<code style="white-space:nowrap"> <code> tables
</code> </code>

لذلك كتبناه
رمز PHP:
<code style="white-space:nowrap"> <code> tables/example.php
</code> </code>

كي يتم إنشاء مجلد بإسم tables و رفع الملف إليه
أليست جملة joomla رائعة ؟


الآن أعد تثبيت setup المكون بعد ضغط ملفاته التي أنشأناها و عدلناها اليوم

ثم من لوحة تحكم المكون
إضغط على الزر [جديد]
و لاحظ أنه سيظهر معك المحرر
أضف شيئا ما و إضغط [حفظ]
إذا ظهرت الرسالة
تم الحفظ بنجاح

فإعلم أنك على الطريق الصحيح
و يمكنك التأكد أكثر من قواعد بيانات مجلتك و من الجدول الذي يحمل إسم
رمز PHP:
<code style="white-space:nowrap"> <code> example_message
</code> </code>

لترى إن كان يحمل بيانات أم لا
إنتهى الدرس مفصل بفضل الله وحده ، لا شريك له .
و لكم مني خالص الود

* الموضوع الأصلي
* لا زلنا بحاجة لأعضاء جدد بالفريق [مبرمجين و غير مبرمجين]
* الموضوع مفتوح المصدر
* المكون بالمرفقات
* قد لا تكون هذه الدروس للمبتدئين و إنما لتعريف المبرمجين المتقدمين على بيئة جملة joomla


الملفات المرفقة [TR]
com_example.zip (4.5 كيلوبايت, عدد مرات المشاهدة 33 مرة) [/TR]



©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى©