خوب تو این قسمت میریم سراغ مدیریت ماژول
مدیریت ماژولها رو به سه روش میتونیم انجام بدیم.
اول اینکه یه سری تنظیمات رو تو فایل config_function.php بزاریم و هر بار لازم بود از طریق ویرایش فایل تغییرشون بدیم(اصلاً پیشنهاد نمیشه این روش)
روش دوم اینه که اگر ماژول صرفا تنظیمات داره و مدیریت آنچنانی نداره به عنوان یک تب جدید در مدیریت سایت -> تنظیمات سیستم اضافه کنیم. مثل تنظیمات نظرات، زبان، قالب و ...
برای این کار یه تابع تو فایل config_function.php ماژول تعریف میکنیم و محتویاتش رو به این شکل تنظیم میکنیم:
کد: انتخاب همه
function test_module_config()
{
global $nuke_configs, $db, $admin_file;
$contents = '';
$test_module_config = (isset($nuke_configs['test_module_config']) && $nuke_configs['test_module_config'] != '') ? phpnuke_unserialize(stripslashes($nuke_configs['test_module_config'])):array();
$contents .= "
<div class=\"text-center\"><font class='option'><b>"._TEST_MODULES_CONFIGS."</b></font></div>
<form action='".$admin_file.".php' method='post'>
<table border=\"0\" align=\"center\" cellpadding=\"3\" class=\"id-form product-table no-border\" width=\"100%\">
<tr>
<th>عنوان فیلد</th>
<td>
<input type=\"text\" name=\"config_fields[test_module_config][field]\" size=\"40\" class=\"inp-form-ltr\" value=\"".$test_module_config['field']."\">
</td>
</tr>
<tr>
<td colspan=\"2\"><input type='hidden' name='op' value='save_configs'>
<input type='hidden' name='return_op' value='settings#test_module_config'>
<input type=\"hidden\" name=\"csrf_token\" value=\""._PN_CSRF_TOKEN."\" />
<input class=\"form-submit\" type='submit' name='submit' value='" . _SAVECHANGES . "'>
</td>
</tr>
</table>
</form>";
return $contents;
}
و بعدش این کد رو اضافه میکنیم
کد: انتخاب همه
$other_admin_configs['test_module_config'] = array("title" => "_TEST_MODULES_CONFIGS", "function" => "test_module_config", "God" => false);
این آرایه سه عنصر داره:
اولی عنوان تب تنظیمات هست. ثابت _TEST_MODULES_CONFIGS رو باید حتماً قبلش تو فایل زبان تعریف شده باشه.
دومی اسم تابعی که تنظیمات از اون طریق انجام نمیشه
سومی هم در صورتی که مدیریت این قسمت صرفا برای مدیریت اصلی سایت یا همون God باشه true و در غیر این صورت false میزاریم.
نتیجه به این شکل میشه
newtab.png
من عمدا اون ارور بالای فیلد رو نشون دادم که یه نکته رو ذکر کنم. چون هنوز این فیلد تو تنظیمات سیستم وارد نشده به عنوان یک متغیر ناشناس دیده شده. بعد که مقدار دهی کردیم و ارسال رو زدیم این ارور رفع میشه. جای نگرانی نیست.
و بعدش تو توابع ماژول میتونیم از این تنظیمات به این شکل استفاده کنیم. فرض کنید تو تابع details بخوایم این کار رو کنیم
کد: انتخاب همه
function details($id) {
global $module_name, $nuke_configs;
$test_module_config = (isset($nuke_configs['test_module_config']) && $nuke_configs['test_module_config'] != '') ? phpnuke_unserialize(stripslashes($nuke_configs['test_module_config'])):array();
.....
این ساده ترین روش برای مدیریت تنظیمات ماژول هست. این در صورتیه که ماژول محتوا نداشته باشه. مثلا برای ماژول ثبت نام آنلاین باید کار رو فراتر ببریم و اطلاعات ورودی و عملیات بعدیش رو کنترل کنیم.
روش سوم
برای این کار باید یه پوشه به ماژول اضافه کنیم به نام admin
سه فایل تو این پوشه لازم داریم.
case.php:
این فایل کارش اینه که وقتی ما یه درخواستی رو سمت فایل مدیریت اصلی نیوک میفرستیم و به ماژول و op خاصی اشاره میکنیم فایلی رو که این توابع توش قرار گرفته برای ما بر میگردونه.
محتواش باید به این شکل باشه:
کد: انتخاب همه
<?php
if (!defined('ADMIN_FILE'))
{
die ("Access Denied");
}
$module_name = dirname(__FILE__);
$module_name = explode("/", str_replace("\\","/", $module_name));
array_pop($module_name);
$module_name = end($module_name);
switch($op)
{
case "test_admin":
case "test_admin_save":
include("modules/$module_name/admin/index.php");
break;
}
?>
مثلا ما دو تابع test_admin برای مدیریت محتوای ماژول و test_admin_save برای ذخیره اون محتوا در نظر گرفتیم.
همه اینا تستیه و شاید معنی خاصی هم نداشته باشه. میخوام فقط با چند و چون کار آشنا بشید.
links.php
این فایل برای اضافه کردن یه آیکون به آیکونها صفحه اول مدیریت نیوک هست.
محتواش باید به این شکل باشه:
کد: انتخاب همه
<?php
if (!defined('ADMIN_FILE')) {
die ("Access Denied");
}
global $admin_file;
$module_name = dirname(__FILE__);
$module_name = explode("/", str_replace("\\","/", $module_name));
array_pop($module_name);
$module_name = end($module_name);
$module_menus = adminmenu("".$admin_file.".php?op=test_admin", ""._TEST_ADMIN."", "modules/$module_name/includes/test.png");
?>
برای تابع adminmenu چند آرگومان در نظر داریم:
اولی لینک صفحه اصلی مدیریت ماژول هست.
دومی عنوان زیر آیکون هست
سومی هم لینک عکس آیکون هست. مثلا ما اینجا یه عکس تو مسیر مورد نظر اضافه کردیم. این لینک حتی میتونه به خارج از سایت هم باشه.
نکته اینکه ما میتونیم به هر تعداد بخوایم آیکون اضافه کنیم به مدیریت. کافیه این خط رو تکرار کنیم و مقادیر دلخواه رو اضافه کنیم.مثلا اینجوری:
[/code]$module_menus = adminmenu("".$admin_file.".php?op=test_admin", ""._TEST_ADMIN."", "modules/$module_name/includes/test.png");
$module_menus = adminmenu("".$admin_file.".php?op=test_admin_main", ""._TEST_ADMIN_MAIN."", "modules/$module_name/includes/test_main.png");
$module_menus = adminmenu("".$admin_file.".php?op=test_admin_module", ""._TEST_ADMIN_MODULE."", "modules/$module_name/includes/test_admin_module.png");
[/code]
index.php
این فایل هم قراره مدیریت ماژول رو بر عهده بگیره.
ساختار این فایل هم کم و بیش شبیه index.php خود ماژول هست. شمای کلی به این شکل هست :
کد: انتخاب همه
<?php
if (!defined('ADMIN_FILE')) {
die ("Access Denied");
}
if (check_admin_permission($module_name, false, true))
{
define("MODULE_FILE", true);
$test_module_config = (isset($test_module_config) && !empty($test_module_config)) ? $test_module_config:((isset($nuke_configs['test_module_config']) && $nuke_configs['test_module_config'] != '') ? phpnuke_unserialize(stripslashes($nuke_configs['test_module_config'])):array());
function test_admin()
{
global $db, $hooks, $module_name, $admin_file, $nuke_configs, $test_module_config;
$contents = '';
$hooks->add_filter("set_page_title", function() {return array("test_admin" => _TEST_ADMIN);});
$contents .= GraphicAdmin();
$contents .= OpenAdminTable();
$contents .= "محتویات مدیریت ماژول";
$contents .= "<br /><pre>".print_r($test_module_config, true)."</pre>";
/*
some php codes
*/
$contents .= CloseAdminTable();
phpnuke_db_error();
include("header.php");
$html_output .= $contents;
include("footer.php");
}
function test_admin_save($submit, $mode, $form_type, $test_fields)
{
global $db, $hooks, $module_name, $admin_file, $nuke_configs, $test_module_config;
/*
some php codes
*/
redirect_to("".$admin_file.".php?op=test_admin");
}
$op = (isset($op)) ? filter($op, "nohtml"):'';
$submit = filter(request_var('submit', '', '_POST'), "nohtml");
$mode = (isset($mode)) ? filter($mode, "nohtml"):'new';
$form_type = (isset($form_type)) ? intval($form_type):1;
$test_fields = request_var('credits_fields', array(), '_POST');
switch($op)
{
default:
case"test_admin":
test_admin();
break;
case"test_admin_save":
test_admin_save($submit, $mode, $form_type, $test_fields);
break;
}
} else {
include("header.php");
GraphicAdmin();
OpenAdminTable();
echo "<div class=\"text-center\"><b>"._ERROR."</b><br><br>You do not have administration permission for module \"$module_name\"</div>";
CloseAdminTable();
include("footer.php");
}
?>
اول کار باید حق دسترسی به مدیریت ماژول رو چک کنیم. ببینیم کدوم مدیر اجازه دسترسی داره:
کد: انتخاب همه
check_admin_permission($module_name, false, true))
این تابع سه آرگومان داره:
اولیش اسم ماژول هست
دومیش مشخص میکنه که آیا مدیر باید God باشه یا نه
سومیش مشخص میکنه که آیا این فایل مدیریت برای ماژول هست یا جزء منوهای اصلی مدیریت تیوک هست. منوهای اصلی مثل مدیریت بلوک ها یا مدریت سئو و بقیه هست که تو پوشه admin/modules قرار گرفتن.
اگر حق دسترسی وجود نداشته باشه آخر فایل این خطا رو بر میگردونیم
کد: انتخاب همه
} else {
include("header.php");
GraphicAdmin();
OpenAdminTable();
echo "<div class=\"text-center\"><b>"._ERROR."</b><br><br>You do not have administration permission for module \"$module_name\"</div>";
CloseAdminTable();
include("footer.php");
}
کمی پایینتر مشخص میکنیم که این فایل برای ماژول هست:
این اختیاریه.
بعدش هم اگر تنظیمات ماژول لازم باشه فراخونی بشه این کار رو میکنیم.
کد: انتخاب همه
$test_module_config = (isset($test_module_config) && !empty($test_module_config)) ? $test_module_config:((isset($nuke_configs['test_module_config']) && $nuke_configs['test_module_config'] != '') ? phpnuke_unserialize(stripslashes($nuke_configs['test_module_config'])):array());
بقیه کار شبیه همون فایل index.php ماژول هست. یعنی توابع و بعدش متغیرها و بعدش شرط switch
کلیت کار به این شکل بود که عرض کردم.
یه نکته در مورد کد
کد: انتخاب همه
$hooks->add_filter("set_page_title", function() {return array("test_admin" => _TEST_ADMIN);});
این کد برای عنوان صفحه مدیریت هست. که به این شکل میشه نشونش داد. بعضی مواقع لازمه این عنوان با شرایی تغییر کنه. مثلا نوع محتوا وقتی عوض بشه.
تصور کنید میخوایم عنوان ابتدا مطالب باشه.
یه موقع میشه میخوایم مطالب پیش نویس رو مدیریت کنیم. به این شکل عمل میکنیم
کد: انتخاب همه
$pagetitle = "مدیریت مطالب".(($mode == "draft") ? " - پیش نویس":"").";
$hooks->add_filter("set_page_title", function() use($pagetitle){return array("test_admin" => $pagetitle);});
من تو محتوای مدیریت ماژول اون متغیر مربوط به تنظیمات مدیریت ماژول رو خروجی دادم که نتیجه اینم ببینید چجوری میشه.
این آموزش کلی طراحی ماژول نیوک بود. امیدوارم بتونیم ماژولهای خوب و با کیفیتی رو بنویسیم.
من ماژول تستی رو که تا اینجا اوکی کردیم براتون میزارم.
چند نمونه عکس از نتیجه کار رو هم اینجا میبینید.
test_admin.png
newtab.png
icon.png
شما دسترسی جهت مشاهده فایل پیوست این پست را ندارید.