[آموزش] نحوه نوشتن یک کامپوننت
با سلام به همگی دوستان
قصد دارم تو این تاپیک آموزش نوشتن کامپوننت برای مامبو رو آغاز کنم. البته گفته باشم من فقط شروع کردم و هنوز تسلط کافی ندارم، قصدم از زدن این تاپیک هم به اشتراک گذاشتن دانسته هامه تا بقیه هم بتونن استفاده کنن و مهمتر از دوستان تیم مامبو خواهش کنم که کمکمون کنن تا اگه جاهایی اشکال داریم حل بشه.
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
خوب...
کار را با تشریح فایلهای مورد نیاز برای ساخت کامپوننت آغاز می کنم. این فایل ها بر اساس جایی که در آن استفاده شده و یا نمایش داده می شوند دسته بندی گردیده اند:
نکته : newcomp نام کامپوننت هستش.
- Frontend files :
توضیح: فایلهای این گروه برای بازدیدکنندگان سایت نمایش داده خواهند شد. این بدان معنی است که اگر شما در یکی از منوها آیتمی اضافه نمائید که به این کامپوننت لینک داشته باشد، فایل های این گروه برای بازدیدکنندگان این کامپوننت در سایت نمایش داده خواهد شد (کلیه لینک های شما برای این کامپوننت از این قاعده پیروی می کنند).
فایل ها:
- newcomp.php
- Administration files (فایل های مدیریت) :
توضیح : فایلهای این گروه برای نمایش کامپوننت در بخش مدیریت وب سایت استفاده می شوند. این بدان معنی است که این فایلهای صفحات بخش مدیریت کامپوننت را برای نمایش مشخص می کنند.
فایل ها:
- admin.newcomp.php
- toolbar.newcomp.php
- Installation files (فایل های نصب) :
توضیح: فایل های این گروه نیز عکملیات نصب از جمله ایجاد بانک اطلاعاتی، لینک در منوی کامپوننت و ... را انجام می دهند.
فایل ها:
- newcomp.xml
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
بررسی فایلهای گروه اول (Frontend files) :
کلیه فایلهای موجود در این گروه (Frontend files) باید خط کد زیر را داشته باشند تا مستقیما در سایت لود نشده و در مرورگر نمایش داده نشوند.
کد:
<?php
/** ensure this file is being included by a parent file */
defined('_VALID_MOS') or die('Direct Access to this location is not allowed.');
?>
بررسی فایل newcomp.php :
مامبو هنگام بارگذاری و لود کامپوننت برای بازدیدکنندگان سایت این فایل را بصورت پیش فرض برای نمایش بارگذاری می کند . در این صفحه می توانید به سادگی مطالبی از یک فایل متنی و یا بانک اطلاعاتی را نمایش داده و یا به کاربر اجازه دهید با استفاده از دستورات مختلف به کمک تابع های موجود در مامبو مطالب را انتخاب نموده و در صفحه مشاهده نماید.
مثال (نمونه کد) :
کد:
<?php
switch($task) {
case 'show_form':
// Display a form
break;
case 'save':
// Save data from the submitted form
break;
default:
// Perhaps display some data, etc
break;
}
?>
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
خوب دوستان امروز يك نمونه فايل قابل اجرا و خيلي ساده و در عين حال قوي رو براتون مي زارم كه استفاده كنين:
اين فايل در گروه Frontend files قرار داره و محتويات كامل جدولي رو كه براش مشخص كردين توي يك جدول نشون مي ده:
کد:
<?php
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.');
global $database;
$query = "SELECT * FROM Table_name";
$database->setQuery( $query );
$rows = $database->loadObjectList();
echo("<table width='100%' border='0'>");
for($i=0; $i < count( $rows ); $i++) {
$row = $rows[$i];
echo('<tr><td>');
echo $row->text;
echo('</tr></td>');
}
echo('</table>');
?>
توضيح كدها از قرار زير است:
کد:
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.');
اين خط اطمينان مي دهد كه فايل بوسيله پورتال فراخواني شده و در صورت بارگذاري مستقيم بوسيله كاربران پيغام Direct Access to this location is not allowed را نمايش خواهد داد. اين امر براي امنيت برنامه بسيار مهم و حياتي است.
تنظيم $database بصورت يك متغيير سراسري كه مي توانيد از آن با تابع هاي خود استفاده هاي لازم را ببريد.
کد:
$query = "SELECT * FROM Table_name ";
تعيين دستور SQL براي انتخاب ركوردهاي ثبت شده در جدول mos_hello_world از بانك اطلاعاتي و قرار دادن اين دستور در متغيير $query براي استقاده در ساير خطوط.
البته شما مي توانيد به جاي Table_name نام جدول خود را قرار دهيد.
کد:
$database->setQuery( $query );
اجراي كد SQL موجود در متغيير $query به كلاس $database .
کد:
$rows = $database->loadObjectList();
ايجاد متغييري به نام $rows كه كليه اطلاعات درون جدول بانك اطلاعاتي را در خود نگهداري مي كند.
کد:
echo("<table width='100%' border='0'>");
درج تگ جدول در صفحه براي قرار دادن ركوردهاي بانك اطلاعاتي در سطر هاي آن.
کد:
for($i=0; $i < count( $rows ); $i++) {
ايجاد حلقه For براي خواندن يك به يك ركوردهاي جدول. شمارنده حلقه متغيير $i است كه تا اتمام تعداد ركوردها شمارش مي شود.
قراردادن اطلاعات ركورد شماره $i از بانگ اطلاعاتي در متغيير $row قرار مي گيرد.
کد:
echo('<tr><td>');
درج سطر و ستون براي قراردادن محتويات بانك اطلاعاتي در جدول موجود در صفحه.
درج اطلاعات درون فيلد text از جدول فراخواني شده بانك اطلاعاتي در صفحه.
کد:
echo('</tr></td>');
بستن تگ مربوط به سطر و ستون جدول موجود در صفحه.
انتهاي حلقه For .
کد:
echo('</table>');
بستن تگ جدول موجود در صفحه.
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
راستي يادم رفت بگم كه براي استفاده و آزمايش فايل بالا چكار بكنين ::)
در شاخه componenet در مامبو (تو بخش مديريت نباشه) يك فولدر به نام com_mycmp بسازين سپس كدهاي زير رو تو اون كپي كنين:
اين كدها همون هاي پست قبلي هستن با اين تفاوت كه به جاي Table_name نام جدول كامپوننت ها يعني components رو گذاشتم و به جاي فيلد text ، نام فيلدي از جدول كامپوننت به نام name رو گذاشتم.
کد:
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.');
global $database;
$query = "SELECT * FROM #__components";
$database->setQuery( $query );
$rows = $database->loadObjectList();
echo("<table width='100%' border='0'>");
for($i=0; $i < count( $rows ); $i++) {
$row = $rows[$i];
echo('<tr><td>');
echo $row->name;
echo('</tr></td>');
}
echo('</table>');
?>
خوب حالا فايل رو ذخيره كنين و توي آدرس وب سايتتون بعد از index.php عبارت
رو تايپ كرده اينتر رو بزنين.
نتيجه رو بررسي كنين.....
يا حق
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
اصلاح مي كنم:
كدهاي بالا رو تو فايلي به نام mycmp.php كپي كرده و ذخيره كنين.
--------------------------------------------------------------------------
از مديراي محترم خواهش مي كنم ارسال قبليم رو ويرايش كرده و اين قسمت رو بهش اضافه كنن و اين پست رو حذف كنن.
مرسي
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
َسلام
خسته نباشي برادر
يه مطلب رو خواستم بگم :)
تو پست #3 لازم نيست از عبارت echo براي خروجي دادن جداول و ... استفاده كنيم
به نظر خودم بهتره با يه <? كد php رو ببنديم، بعد جداولمون رو درست كنيم؛ بعد اگر جايي ميونش احتياج به php شد دوباره <? code ?> ميزنيم
اينجوري تو dreamweaver و ... ميتونيم بفهميم شكل كلي جداولمون به چه صورت هست، و درك كلي ازش بهتر خواهد شد
در هر صورت اين تلاش شما رو قدر مينهيم (تريپ ادبي ;) ) موفق باشي
يا علي
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
جناب سلیمانی عزیز
از زحمتی که کشیدی بسیار ممنونم خدایی جای این گونه اموزش ها صحبت و تبادل نظر در مورد چگونگی ساخت و ایجاد کامپوننت ها و ... توی این سایت واقعا خالی بود و امید وارم تا با انرژی بیشتری به این سری از آموزش ها ادامه بدید بطوری که خوانندگان به راحتی با مطالعه این آموزشها امکانات مورد نیاز خود را ایجاد نمایند.
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
خوب يه مورد هم همون php و mysql و از همه مهم تر برنامه نويس بودن هست :)
تهش همه نميتونند همه ي نياز هاي خودشون رو برآورده كنند، ولي در هر صورت حركت جالبيه
موفق باشند
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
سلام به همه دوستان گرانقدر
من بالاخره نوشتن كامپوننت رو ياد گرفتم (البته هنوز حرفه اي نشدم 8) ولي ميشم )
بزودي بقيه آموزش ها رو هم مي زارم كه دوستاني كه نياز دارن بررسي كنن ;)
------------------------------------------------------------------------------------------------
البته چند تا سوال داشتم كه از دوستان عزيز خواهش مي كنم من رو راهنمايي كنن:
كامپوننت هايي كه منن مي سازم يك صفحه مديريتي داره و يك صفحه نمايش در سايت.
- اگه بخوام مثلا اطلاعاتم رو بخش بندي كنم (چيزي شبيه com_weblink ) چطور مي تونم صفحه دوم و سوم رو به بخش مديريت كامپوننت اضافه كنم؟
- اگه بخوام خروجي رو كه در سايت نمايش داده مي شه رو به انتخاب كاربر محدود كنم چكار كنم؟ (براي مثال در سايت ليست كل كتابهاي ثبت شده نشون داده مي شه و كاربر بتونه انتخاب كنه كه مثلا ليست كتابهاي يك نويسنده خاص نمايش داده بشه).
- و اينكه در ليستي كه در سايت براي بينندگان نمايش داده مي شه كاربر بتونه يك عبارت رو سرج كنه، چطوريه؟
-------------------------------------------------------------------------------------------
دوستان گرامي از كمكاهتون ممنونم.
از اينكه اين سوالات رو اينجا مطرح كردم من رو ببخشيد. تاپيك رو با عنوان آموزش نوشتن كامپوننت زدم و فكر كنم اين مسايل هم اينجا باشه بهتره
ممنون از همگي
يا حق
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
سلام
ببين شما اصولا، تو فايل admin.component.php مياي، از روي ورودي ها (مثلا task و ...) كه خودت اونارو انتخاب ميكني جاي ديگه، تصميم ميگيري كه كدوم تابع از فايل admin.component.html.php اجرا شه
حالا تو اون توابع هر كدوم كار ديگه اي انجام ميدهند،
مثلا اگر داخل url داشته باشم: task=test1 بره تابع test1 از فايل admin.component.html.php رو اجرا كنه
اگر چيز ديگه اي بود بره يه چيز ديگه رو بياره و ...
سوال دومت: بايد خروجيت رو فيلتر كني (با يه query) ساده هست، زياد مشكل نيست
اگر هم ميخواي مثلا فلان كاربر و ... ببينند و بقيه نبينند با يه if و my->id ميتوني اين كار رو انجام بدي(جدول users رو نگاه كن)
سوال سومت هم همينطور، بايد يه textbox بگذاري، بعد يه دكمه سرچ كنارش مثلا، اين دوتارو تو يه فرم بگذار، بعدش اونور ببين كه اگر سرچ زده شده بود، بياي، يه query بر اساس اون درست كني، و داده هات رو نمايش بدي
موفق باشي
*** دوستان بزرگتر، ممنون ميشم اگر ما كوچيك تر هارو تو اين كار كمك كنيد
يا علي
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
آقای شکرزاده جان ممنون لطفتون،
مهندس جان من اگه بخوام تو دستور سویچ کد زیر رو استفاده کنم:
کد:
case 'list':
HTML_phone_book::displaylist($utask);
break;
بطوریکه کتغییر $utask به جای task قرار بگیره چکار باید بکنم؟
البته عنوان کردن این نکته مهمه که که $utask باید مقداری از فیلدی در جدول رو بخونه.
راحت تر بگم ، برای یکی از جدولهام یک فیلد unitID قرار دادم که شناسه مجموعه رو نگهداری کنه. می خوام لیست مجموعه ها رو که نشون می دم، کاربر هر مجموعه رو کلیک کرد مقدار این فیلد به تابع
نقل قول:
function displaylist($utask) { ?>
....
<?php }
ارسال بشه و مطابق این مقدار دریافت شده جدول query مورد نظرم رو بسازه و مقدار رو نشون بده.
میشه در این رابطه راهنماییم کنینکه چطور اون مقدار رو موقع کلیک کاربر به تابعم بفرستم و اون ازش استفاده کنه؟
از کمکتون ممنونم.
یا حق
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
سلام
شما همونطوري كه عادي query مي سازي كه يه record رو بخونه
همونجوري عمل ميكني، اون فيلدي كه قرار هست به تابع displaylist پاس داده شه رو جاي $utask ميفرستي
اونور اين رو ميگيري و ...
مثلا من قبلا با يه query مقدار اون فيلد رو در متغيري به نام $myfield ريختم
اينجوري بايد فراخوني كنم:
کد:
HTML_phone_book::displaylist($myfield);
اميدوارم درست منظورت رو متوجه شده باشم
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
[quote author=حسین شکرزاده link=topic=6797.msg40909#msg40909 date=1182325493]
سلام
شما همونطوري كه عادي query مي سازي كه يه record رو بخونه
همونجوري عمل ميكني، اون فيلدي كه قرار هست به تابع displaylist پاس داده شه رو جاي $utask ميفرستي
اونور اين رو ميگيري و ...
مثلا من قبلا با يه query مقدار اون فيلد رو در متغيري به نام $myfield ريختم
اينجوري بايد فراخوني كنم:
کد:
HTML_phone_book::displaylist($myfield);
اميدوارم درست منظورت رو متوجه شده باشم
[/quote]
از لطفتون ممنونم
من يك مدت نبودم 8)
آقاي شکرزاده عزيز اگه ممكنه بيشتر من رو راهنمايي كنين كه اگه بخوام توي صفحه يك textbox بزارم كه كاربران بتونن مثلا يك اسم رو سرج كنن و ليت فيلدهاي كه حاوي اون اسم هستن فقط نمايش داده بشه، چكار كنم؟
من با دستورات SQL مشكلي ندارم فقط نمي دونم توي تابع نمايش اطلاعات در صفحه چطوري محدوديت ايجاد كنم كه اطلاعات خاصي نشون داده بشه!! البته اطلاعاتي كه براي نمايش دادن داده ها مشخص مي شه رو كاربر تو سايت مشخص مي كنه.
براي مثال: من ليستي از مقالات مختلف دارم شمال نام مقاله و نويسنده و تاريخ. ليست همشون رو به كاربرم نشون مي دم. يك textbox با يك كليد ميزارم بالاي صفحه. كاربر درون اين textbox عبارت محمد رو تايپ مي كنه و كليد رو ميزنه، مي خوام ليست مقالاتي ريفريش بشه و فقط اونهايي نشون داده بشن كه در نام نويسنده شون كلمه محمد وجود داره..
اگه راهنماييم كنين ممنون ميشم. احيانا اگه مورد كوچكي برام بزاري ممنون ميشم.
بازم ممنون
پاسخ : [آموزش] نحوه نوشتن یک کامپوننت
سلام
سليماني جان، ببين اين دقيقا همون sql هست ديگه
شما يه query از نوع select درست ميكني، بعد اجراش ميكني، بعد چيزايي كه تو result باقي مونده رو نمايش ميدي
كار خاصي نيست كه
کد:
$sql = "select * from tbl where field Like '%" . $tosearch ."%'";
$database->setQuery($sql);
$result = $database->query();
$rows = $database->loadObjectList();?>
for($i=0; $i<10; $i++) {
$row = $rows[$i];
echo $row->fieldyouwant;
}
اميدوارم از اين كد سر در بياري
يا علي