اگر تا حالا فکر می‌کردید که PHP فقط یک زبان سمت سرور ساده ( و نهایتا پیچیده !! ) هست ، اشتباه کردید. اشتباه شما در قسمت «سمت سرور یا Server Side» فرض کردن PHP بوده است. PHP برخلاف هدف خود ( که همون اسکریپت‌نویسی سمت سرور باشه ) میتونه به خوبی در سمت کلاینت کاربرد داشته باشه.

اگر با GTK آشنا نیستید ، حتما این صفحه‌ی ویکیپدیا رو بخونید. اگر حوصله ندارید ، من کار رو براتون آسون می‌کنم یه توضیحاتی میدم. GTK مخفف کلمات GIMP ToolKit می‌باشد ( به همین راحتی !! ). خوب اگر کاربر گنو/لینوکس باشید ، امکان نداره با برنامه‌ی دستکاری تصاویر GIMP آشنا نباشید. ( برای توضیح ویندوزی‌ها یه چیزی شبیه فتوشاپ. البته فتوشاپ باید بره جلو و بوق بزنه !! :دی ) یعنی درواقع GTK برای نوشتن GIMP توسعه داده شد که البته بوسیله‌ی Glib و دیگر کتابخانه‌هایی که با C نوشته شدند فریم‌ورک قوی +GTK یا جی‌تی‌کی‌پلاس رو بوجود آوردند.

معمولا برنامه‌های مبتنی بر +GTK رو با C می‌نویسن ولی به سایر زبان‌های برنامه‌نویسی هم Bindingهایی انجام شده که یکی از اون‌ها PHP است. شما می‌تونید با استفاده از PHP برنامه‌های گرافیکی سمت کاربر بنویسید. که البته بسیار راحت‌تر و ساده‌تر از C خواهد بود چرا که اولا با توابع غنی و بسیار راحت PHP می‌تونید کد بزنید و ثانیا دیگه قواعد دست و پا گیر C مثل اشاره‌گرها و حتی مشخص کردن انواع متغیرها رو ندارید !

البته خودم هم تازه دارم شروع می‌کنم که با PHP در GTK برنامه بنویسم ولی برای تست دو نمونه رو در گنو/لینوکس و ویندوز اجرا کردم که براتون میزارم.

قبل از هر چیز بایستی PHP-GTK رو روی سیستم‌عامل خودتون نصب کنید. روی گنو/لینوکس کافیه که بسته‌ی php-gtk یا php5-gtk رو نصب کنید ( ممکنه یه‌سری dependency داشته باشه ) و یا اگه می‌خواید از سورس نصب کنید ، اینجا رو ببینید. برای نصب در ویندوز خیلی راحته. فقط کافیه فایل باینری رو از اینجا بگیرید. بعد فایل رو Extract کنید و داخل یکی از درایوهاتون بریزید. حتی نیازی به دانلود خود PHP هم ندارید و یک نسخه به صورت پیشفرض داخلش هست. کافیه مثالی که در ادامه بحث می‌کنم رو داخل این پوشه بریزید و php filename.php رو بزنید. برای نصب در MacOSX اینجا رو ببینید.

(بقیه در ادامه‌ی مطلب)

و اما یک مثال ساده :

من به هیچ وجه بر روی GTK Design مسلط نیستم پس به بررسی کدهای GTK نمی‌پردازم و فقط می‌خوام یک نمونه بهتون نشون بدم که علاقه‌مند بشید. احتمالا در آینده سعی می‌کنم کدهای بیشتری براتون بزارم و البته همراه با توضیح کامل.

البته این مثال از Documentation خود PHP-GTK گرفته شده است. اسم مثال هست Hello World Advanced :

#! /usr/bin/php
<?php
/**
*   Here we create a login window.
*   It has a username and a password field, and a
*   Cancel and Login button. Some error checking
*   is being done when the user clicks “Login”.
*/
if (!class_exists(‘gtk’)) {
die(“Please load the php-gtk2 module in your php.ini\r\n”);
}
/**
*   This function gets called as soon as the user
*   clicks on the Login button.
*
*   @param GtkWindow $wnd           The login window, needed to close it
*                                    when all is ok
*   @param GtkEntry $txtUsername    The username text field, used to get
*                                    the username
*   @param GtkEntry $txtPassword    The password widget to retrieve the
*                                    password
*/
function login(GtkWindow $wnd, GtkEntry $txtUsername, GtkEntry $txtPassword)
{
//fetch the values from the widgets into variables
$strUsername = $txtUsername->get_text();
$strPassword = $txtPassword->get_text();
//Do some error checking
$errors = null;
if (strlen($strUsername) == 0) {
$errors .= “Username is missing.\r\n”;
}
if (strlen($strPassword) == 0) {
$errors .= “No password given.\r\n”;
}
if ($errors !== null) {
//There was at least one error.
//We show a message box with the errors
$dialog = new GtkMessageDialog($wnd, Gtk::DIALOG_MODAL,
Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, $errors);
$dialog->set_markup(
“The following errors occured:\r\n”
. “<span foreground=’red’>” . $errors . “</span>”
);
$dialog->run();
$dialog->destroy();
} else {
//No error. You would need to hide the dialog now
//instead of destroying it (because when you destroy it,
//Gtk::main_quit() gets called) and show the main window
$wnd->destroy();
}
}
//Create the login window
$wnd = new GtkWindow();
$wnd->set_title(‘Login’);
//Close the main loop when the window is destroyed
$wnd->connect_simple(‘destroy’, array(‘gtk’, ‘main_quit’));
//Set up all the widgets we need
$lblCredit   = new GtkLabel(‘Please provide your data’);
//The second parameter says that the underscore should be parsed as underline
$lblUsername = new GtkLabel(‘_Username’, true);
$lblPassword = new GtkLabel(‘_Password’, true);
$txtUsername = new GtkEntry();
$txtPassword = new GtkEntry();
$btnLogin    = new GtkButton(‘_Login’);
$btnCancel   = new GtkButton(‘_Cancel’);
//Which widget should be activated when the
// mnemonic (Alt+U or Alt+P) is pressed?
$lblUsername->set_mnemonic_widget($txtUsername);
$lblPassword->set_mnemonic_widget($txtPassword);
//Hide the password
//$txtPassword->set_invisible_char(‘*’);
//Destroy the window when the user clicks Cancel
$btnCancel->connect_simple(‘clicked’, array($wnd, ‘destroy’));
//Call the login function when the user clicks on Login
$btnLogin->connect_simple(‘clicked’, ‘login’, $wnd, $txtUsername, $txtPassword);
//Lay out all the widgets in the table
$tbl = new GtkTable(3, 2);
$tbl->attach($lblCredit, 0, 2, 0, 1);
$tbl->attach($lblUsername, 0, 1, 1, 2);
$tbl->attach($txtUsername, 1, 2, 1, 2);
$tbl->attach($lblPassword, 0, 1, 2, 3);
$tbl->attach($txtPassword, 1, 2, 2, 3);
//Add the buttons to a button box
$bbox = new GtkHButtonBox();
$bbox->set_layout(Gtk::BUTTONBOX_EDGE);
$bbox->add($btnCancel);
$bbox->add($btnLogin);
//Add the table and the button box to a vbox
$vbox = new GtkVBox();
$vbox->pack_start($tbl);
$vbox->pack_start($bbox);
//Add the vbox to the window
$wnd->add($vbox);
//Show all widgets
$wnd->show_all();
//Start the main loop
Gtk::main();
?>

البته من Mac OS X نداشتم که روش اجرا کنم. ولی اجرای این برنامه رو در شکل زیر می‌بینید :

در گنو/لینوکس :

PHP-GTK in GNU/Linux

در ویندوز :

PHP-GTK in Windows

یه توضیح کوچیک در مورد کد ( که بعدا نگید چیزی بلد نبود !! :دی ) :

هر چند داخل کد توضیح کامل داده شده است ( یا داخل documentation ) ولی قبل از هرچیز شما باید یک GtkWindow درست کنید و بعد GtkLabel و یا GtkButtonیی که می‌خواید رو به اون اضافه کنید. و همون طور که احتمالا متوجه شده‌اید ، GTK هم مانند Qt از متد Signal و Slot استفاده می‌کنه . البته تا جایی که من فهمیدم دیگه Slot نداریم و خود تابعی که Signal رو می‌گیره همه‌ی کارها رو انجام میده. طبعا با استفاده از متد connect_simple هم می‌تونیم شی مورد نظر رو به تابع گیرنده متصل کنیم.

نکته‌ی جالب دیگه اینکه کار به اینجا ختم نمی‌شود بلکه شما می‌توانید فایل‌های طراحی محیط گرافیکی رو با GLADE انجام بدید و فایل XML رو به خورد PHP بدید تا اون براتون درست کنه ! با استفاده از شی GladeXML و فراخوانی فایل.

— به روز رسانی – :

خوب من با Glade هم تست کردم. البته قبلش یک متن فارسی توی کد اصلی نوشتم ولی یکم نگران شدم چون فارسی رو نمایش نمی‌داد ( با یونیکد مشکل داشت ). ولی وقتی با Glade یه نمونه درست کنید خودش کارها رو درست می‌کنه.

برای مثال من این فایل رو با Glade درست کردم ( از درهم و برهم بودن معذرت می‌خوام ! :دی ) و بعد در لینوکس بدون هیچ‌گونه مشکلی به صورت زیر اجرا شد ( البته ممکنه توزیع شما شامل LibGlade نباشه پس باید نصبش کنید ! ) :

ولی در ویندوز یه مقدار مشکل وجود داره. و اونم PHP-GTK Extensionها رو باید نصب کنید. از این آدرس بگیرید. بعدا Extract کنید و در همون پوشه‌ی قبلی که php-gtk رو Extract کرده‌بودید ، کپی کنید و احیانا فایل‌های مشابه رو overrride کنید. حالا باید فایل php-cli.ini رو ویرایش کنید و PHP-GTK Extension رو از حالت غیرفعال دربیارید ( سمی کالون اولش رو بردارید ). و بعد به راحتی برنامه اجرا میشه ! به صورت زیر :

فایل PHP که استفاده می‌کنید خیلی خیلی راحته. فقط دو خط ساده است !

#! /usr/bin/php
<?php
$glade = new GladeXML(‘./test2.glade’);
Gtk::main();
?>

فایل تصویری که استفاده کردم اینه. پس می‌بینید که خیلی خیلی راحته. من بیشتر هم بر روش کار می‌کنم !

پس فعلا ! ;)

— به روز رسانی دوم — :

با توجه به مطلبی که حسن عزیز در قسمت نظرات همین مطلب نوشتند ، برنامه‌ای به نام Site Fusion معرفی گردید. که علاقه‌مند شدم تستش کنم. این برنامه در دو قسمت Server و Client اجرا می‌شود به شکلی که در سرور دایمن SiteFusion ( برای ویندوزی‌ها همون سرویس ! ) راه‌اندازی می‌شود و در قسمت Client با برنامه‌ی Connector به اون وصل میشید. نکته‌ی جالب این برنامه اینه که رابط گرافیکی با استفاده از XUL طراحی می‌شود و برنامه‌نویسی هم توسط PHP انجام می‌شود. نکته‌ی مهم دیگه اینکه پردازش بر روی سرور انجام می‌شود. یعنی کاربر بر روی Client برنامه را انجام داده و پاسخ به رویدادهای کاربر در سمت سرور انجام گرفته و نتیجه به کلاینت برگردانده می‌شود.

برنامه‌ی سمت سرور فقط بر روی گنو/لینوکس و با کمی‌تغییرات بر روی MacOSX هم اجرا می‌شود. نحوه‌ی نصب بر روی گنو/لینوکس در اینجا کامل توضیح داده شده است. ( خودم عقیده دارم که با کمی تغییرات میشه بر روی ویندوز هم اجراش کرد )

بعد از نصب بایستی یک دایمن با استفاده از برنامه‌ی PHP نوشته شده اجرا کنید ( این اولین باریه که می‌بینم یک دایمن با php راه‌اندازی میشه ! ) یعنی وارد مسیر اصلی میشیم و php sitefusiond -f رو می‌زنیم و دایمن بر روی گنو/لینوکس راه‌اندازی میشه.

حالا باید در یکی از کلاینت‌های شبکه ( سیستم‌عاملشون فرق نمی‌کنه ) یکی از برنامه‌های برای لینوکس ، برای ویندوز و برای MacOSX رو دانلود کنید. برای لینوکس باید فایل sitefusion که اجرایی هست رو اجرا کنید ( البته برای من اجرا نشد و با استفاده از xulrunner خود لینوکس اجرا کردم که کافیه application.ini رو به xulrunner بدید ) و برای ویندوز هم کافیه نصب کنید و فایلی در دسکتاپتون ایجاد میشه که کافیه اون رو کلیک کنید.

یک پنجره‌ی لاگین براتون ظاهر میشه که در قسمت Server URL آدرس کامل sitefusion و آی‌پی سرور رو وارد می‌کنید ( البته قبلا باید یک هاست مجازی بر روی Apache راه‌اندازی کنید ! ) و در قسمت Application اسم یکی از Applicationهای موجود در پوشه‌ی app رو وارد می‌کنید مثلا sitefusion/admin رو بعد username هم admin و پسورد sercret هست و بایستی با موفقیت لاگین کنید.

خلاصه اینکه خیلی خیلی متد جالب و عالی‌ای هست. چند نمونه از اجرای این برنامه رو می‌بینید که سرور گنو/لینوکس هست و کلاینت ویندوز ایکس‌پی :

توضیح : دو عکس آخری مال پوشه‌ی testapp هستن.

بازم با تشکر از آقا حسن عزیز ! ;)

=-=-=-=-=
Powered by Blogilo

پست‌های مشابه :

  1. معرفی کتاب رسمی آموزش برنامه‌نویسی کیوت (Qt) با سی‌پلاس‌پلاس
  2. معجزه‌ی دیگر PHP سیستم‌عامل مبتنی بر وب eyeOS