السلام عليكم
درس مفصلنا اليوم هو الرابع من نوعه و هو إكمال للدروس [راجعها لزاما]
[درس مفصل]برمجة موديل بسيط - الدرس مفصل الأول
[درس مفصل]برمجة مكون بسيط - الدرس مفصل الثاني
[درس مفصل]برمجة المكونات - الدرس مفصل الثالث
أو إبحث عنها هنا في القسم .
نرجع اليوم بخطواتنا إلى الدرس مفصل السابق ـ إستدعاء الأزرار في الملف
رمز 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 و الذي يكون مسؤولا عن إظهار الأزرار و وقت و مكان إظهارها [راجع الدرس مفصل السابق]
switch($task){ // التحقق الشرطي من قيم المتغير $task
case 'add':
addExample(); // تفعيل الزر - جديد
break;
case 'cancel';
showExample();// تفعيل الزر - إلغاء
break;
case 'save';
saveExample();// تفعيل الزر - حفظ
break;
default:
showExample();// ما يظهر إفتراضيا و هو واجهة interface المكون
break;
}
function addExample(){
$lists['published'] = 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['published'];
?>
</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[$i];
$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]
©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى©