اگر تا حالا فکر میکردید که 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 نداشتم که روش اجرا کنم. ولی اجرای این برنامه رو در شکل زیر میبینید :
در گنو/لینوکس :

در ویندوز :

یه توضیح کوچیک در مورد کد ( که بعدا نگید چیزی بلد نبود !! :دی ) :
هر چند داخل کد توضیح کامل داده شده است ( یا داخل 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
پستهای مشابه :





تیر ۱۳م, ۱۳۸۹در۲:۳۸ ق.ظ
ممنون! بهرام تو با xul هم کار کردی؟ البته تا جایی که من میدونم یک محیط گرافیکی stand alone برای برنامه ایجاد می کنه که روی هر بستری اجرا میشه! ولی باید با سرور هم در تماس باشه! یعنی کار تفسیر رو سرور که روی هر هاستی میتونه باشه انجام میده و بخش frontend برنامه رو بجای مرورگر روی یک gui درسترمون میبینید! فکر کنم کاربرد بالایی در برنامههای اتوماسیون اداری و … داشته باشه! یعنی اگر دقیقاً اون جوری که تو ذهن منه بشه پیادش کرد خیلی فوقالعاده میشه!
تیر ۱۳م, ۱۳۸۹در۹:۵۶ ق.ظ
سلام، خیلی جالب بود، شاید باور نکنی ولی من الان دارم رویاهام رو تو این نوع برنامهنویسی میبینم.
ولی واقعا ذوق کردم :دی
اونوخ دیگه احتمالا میشه همهی امکانات php رو در اختیار داشت دیگه؟، وقتی اجراش کردی همچنان یه زبان اسکریپتی باقی موند یا فایل exe داد؟، ببخش به خاطر سوالات تازه کارانهام
تیر ۱۳م, ۱۳۸۹در۱۱:۲۶ ق.ظ
@مهدی:

والا من کار نکردم. فقط در حد تعریف و اینکه چکار میکنه میدونم. البته علاقهی شدیدی دارم و حتما توی اولین فرصت بررسیش خواهم کرد. ولی واقعا دیگه دارن برنامههای تحت دسکتاپ صرف ازبین میرن. دنیای آینده مال وبه !
@میثم :
آره خوب از نظر جالبیش برای منم برای اولین بار خیلی جالب بود !
در مورد exe شدنش خودش این کار رو نمیکنه ولی میتونی این کار رو با یک PHP Compiler انجام بدی. یه جستجو در گوگل بکنی به هدفت میرسی. در ضمن برای چی میخوای exe بشه ؟! برای ما GNU کاران متنبسته کردن نرمافزار زیاد جالب نیست !!
تیر ۱۴م, ۱۳۸۹در۱۰:۰۷ ق.ظ
سلام،
راجع به XUL که مهدی مطرح کرد:
تا جایی که من می دونم XUL مارک آپیه که موزیلا برای اینترفیس برنامه هاش مثل Firefox و Thundirbird ازشون استفاده می کنه. XUL برای طراحی اینترفیس دقیقا مثل HTML برای طراحی سایته. شما یه سری تگ داری و می تونی از CSS و JavaScript استفاده کنی. مثلا منوها تگ منو هستن و باکس جستجو یه Input هست و یا اگه توی صفحه ی تنظیمات نگاه کنی فیلد ست ها و checkboc ها و button ها همه تگ های شبیه HTML هستن.
و به دلیل استفاده از XUL هستش که نوشتن افزونه برای فایرفاکس اینقدر راحته.
تیر ۱۴م, ۱۳۸۹در۱۱:۳۳ ق.ظ
بله فکر میکنم همین طوره که میگید !
چون من خودم تا حالا پلاگین برای فایرفاکس و کلا برنامههای مبتنی بر Gecko ننوشتم به خاطر همین آشنایی با XUL ندارم !
البته نظر مهدی هم تا حدودی غلط نیست ولی دیگه Stand Alone نخواهد بود. و وابسته است به برنامهای مثل فایرفاکس ولی خوب بعضی از افزونهها خودشون یه برنامهی کامل هستن مثل Firebug و غیره.
ممنون یادآوری خوبی بود.
تیر ۱۴م, ۱۳۸۹در۶:۳۹ ب.ظ
اینو دیده بودم ولی یخده زیادی پیچیونده. PHP WinBinder یا یه همچین چیزی، این سادهتر از PHP-GTK بود. ولی فکر کنم فقط برای ویندوزه!
تیر ۱۴م, ۱۳۸۹در۶:۴۳ ب.ظ
یه چیز دیگه. Site Fusion رو هم ببینید. هنوز نسخهی تحت ویندوز نداره بنابراین من نتونستم نصبش کنم، ولی این برای ساخت برنامه از PHP و XUL استفاده میکنه. فوقالعاده برای ساخت برنامههایی که رابط کاربری تحت دسکتاپ و دیتابیس تحت سرور لازم دارند. مثل چت و یا برنامههای نیازمند کارهای گروهی./
تیر ۱۴م, ۱۳۸۹در۷:۴۱ ب.ظ
ممنون عزیز !
PHP WinBinder جالبه ولی متاسفانه وابسته به ویندوزه ! و برای من زیاد جالب نبود.
ولی SiteFusion عالیه. حتما تستش میکنم.
در ضمن کانکتور SiteFusion وابسته به سیستمعامل نیست ! در اینجا :
http://sourceforge.net/projects/sitefusion/files
برای هر سه سیستمعامل لینوکس و مک و ویندوز هست.
( البته سرورش چرا ! درست میگی فقط بر روی لینوکس کار میکنه. پس حتما تستش میکنم ! )
ولی اگه آدم خودش کد بزنه و با GTK کار کنه خیلی بهتر کنترل روی برنامه دارید. بهتره که آدم به برنامه و محیط خاصی وابسته نباشه !
در ضمن کلا عملکرد SiteFusion با کاری که ما میکنیم فرق میکنه ! در مطالب سایتش گفته که نیاز به یک سرور هست. دقیقا چیزی که مهدی گفت !
تیر ۱۵م, ۱۳۸۹در۱۲:۱۹ ب.ظ
ممنون بهرام خان! نظرم راجع به GTK عوض شد. باید برم تستش کنم! خستهکنندهترین کار نوشتن رابط کاربریه، برای لینوکس Glade خیلی چیز خوبیه ولی برای ویندوز (هنوز) ابزاری وجود نداره.
در مورد XUL، چرا Stand-Alone هست. یه قطعه نرمافزاری به اسم XUL Runner هست که برای هر سه پلتفرم هم نوشته شده. فایلهای XUL رو کنار این میذارید و با XUL Runner اجراش میکنید. کاملاً بدون نیاز به سرور و یا فایرفاکس، اجرا میشه.
تیر ۱۵م, ۱۳۸۹در۱۲:۳۴ ب.ظ
خوب ، نه دیگه. این نمیشه Stand Alone !
وقتی شما یک رابط کاربری مینویسید ، باید این برنامه رو به رابط گرافیکی native سیستمعامل تبدیل کنه. و پیشنیاز داره. که پیشنیازش همون XUL Runner هست. ولی به هر حال چیز جالبیه !
در مورد Glade چرا که نه ؟! برای ویندوز رو میتونید از اینجا دانلود کنید :
http://ftp.gnome.org/pub/GNOME/binaries/win32/glade3/3.6
آرزوی موفقیت
تیر ۱۵م, ۱۳۸۹در۷:۰۹ ب.ظ
ممنون! فکر کنم الان دیگه میتونم برم سراغ GTK!
سپاس!
مرداد ۱م, ۱۳۸۹در۱۲:۴۸ ب.ظ
[...] برنامه از همین زول استفاده می کنه (توضیحات بیشتر رو این جا [...]