| |||||||
| المدوّنات | البحث | مشاركات اليوم | اجعل كافة المشاركات مقروءة |
|
| | LinkBack | أدوات الموضوع |
| |||||
| بعد ما عملنا قبل عدة أيام تطبيق التصويت باستخدام الأجاكس اليوم رح نكمل المشوار في سلسلة التطبيقات و أنصح يلي ما شاف التطبيق السابق وحابب يشوف هذا التطبيق يشوفه التطبيق الأول لان الأوامر اللي شرحتها فيه مارح أرجع أشرحها هنا حتى ما أضيع وقت فيها وبالنسبة للسكربت يلي رح نعمله الأن حاولت أني اخليه خفيف قدر الإمكان دون أي تعقيدات بحيث نعمل أبسط سكربت دردشة يعتمد يعتمد كلياً على الاجاكس والحمد لله مارح أعتمد على أي مكتبة جافا سكربت في هذا التطبيقات (ولا التطبيقات القادمة بإذن الله) بسم الله نبدأ يأساسيات السكربت: الملفات التي نحتاج إلى إنشائها : 1-display.php (الملف الرئيسية والذي يتضمن الملفات الأساسية الأخرى) 2-display.js (ملف الجافا سكربت الخاص بdisplay.php) 3-chatbox.php (الملف الذي سوف يقوم بعرض المحادثة داخل الدردشة) 4-chatbox.js (ملف الجافا سكربت الخاص بchatbox.php) 5-online.php (الملف الذي سيقوم بعرض المستخدمين المتصلين حالياً) 6-online.js (ماف الجافا سكربت الخاص بonline.php) 7-config.php (الملف الذي سوف يحتوي على معلومات الإتصال بقاعدة البيانات) أولا نحتاج إلى إنشاء الجدولين التاليين في قاعدة البيانات : كود: CREATE TABLE `ajax_chat` ( `id` int(255) NOT NULL auto_increment, `name` varchar(255) collate latin1_general_ci NOT NULL default '', `chattext` varchar(255) collate latin1_general_ci NOT NULL default '', `time` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM; CREATE TABLE `ajax_online` ( `id` int(255) NOT NULL auto_increment, `name` varchar(255) collate latin1_general_ci NOT NULL default '', `time` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM; نبدأ الأن بالملف الأصغر config.php : كود PHP: )نتوجه الان إلى ملف display.php نضيف أولاً الهيدر و سوف نحتاج في هذا السكربت إلى استخدام الجلسات (session) لذلك نضيف بدايته أيضاً ولا ننسى تتضمين ملف config.php و display.js : كود بلغة HTML: <? session_start(); include"config.php"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> <title>CHAT</title> <script src="display.js"></script> </head> ![]() كود بلغة HTML: <body onunload="javascript:logout()"> أولا تسجيل الدخول : كود PHP: و أول شي يتم عمله هو التحقق إذا كان هناك مستخدم بنفس الاسم في غرفة الدردشة طبعا إذا وجد رح يوقف عملية تسجيل الدخول و يطبع ان الاسم مستخدم مع ال(input) الخاص بتسجيل الدخول مرة أخرى ويعمل الأمر die(); حتى لا يظهر أي شي أخر (هذا الinput موجود في نفس الصفحة لكن لسى ما مر علينا )طبعا إذا ما تحقق الشرط وكان الاسم غير مستخدم رح يتم حفظ الجلسة (session) ووحددت متغيرين الاول هو بإسم المستخدم و الثاني بوقت دخوله (رح نعرف بعدين ليش حفظناه ) وثم يضاف في جدول المستخدمين (ajax_online) اسمه مع الوقت أيضاً ويضاف في جدول المحادثة (ajax_chat) عبارة أن المستخدم قام بتسجيل الدخول بهكذا نكون إنتهينا من تسجيل دخول المستخدمين . الان تسجيل خروجهم : كود PHP: المهم هنا الشرط بالتأكد إذا كان المتغير logout على شكل get موجود فيتم تنفيذ الأوامر الموجودة وأولهم يتم التأكد إذا كان المتغير name يلي في الجلسة موجود فعلا عندها يتم حذف الاسم من جدول المستخدمين (ajax_online) و كتابة عبارة تنبه بتسجيل خروج المستخدم في جدول المحادثة (ajax_chat) ومن ثم مسح الجلسة كاملة بهذا يكون المستخدم خرج من المحادثة الأن نضيف التأكد إذا كانت الجلسة غير موجودة لعرض الinput الخاص بتسجيل الدخول : كود PHP: هذا حتى يتم تشغيل الفنكشن نفسه عند ضغط enter لما نوصل ملف display.js رح تشوفوهم ![]() تجميع كافة أومر الphp في الصفحة : كود PHP: كود بلغة HTML: <a href="javascript:logout()" >خروج</a> <div id="chat" align="center" dir="rtl"> <iframe src="online.php" name="t1" width="150"height="300" scrolling="Yes" frameborder="1" id="t1" border="0"> Your browser do not support frames :( </iframe> <iframe src="chatbox.php" name="t1" width="500"height="300" scrolling="Yes" frameborder="1" id="t1" border="0"> Your browser do not support frames :( </iframe> <br /> <input onkeydown="javascript:keyDown('sendchat')" name="chattext" type="text" id="chattext" size="25" /> <input onclick="javascript:sendchat()" type="button" value="إرسال" /> </div><body> </html> وبالنسبة للرابط الموجودة في الأعلى فهو لتسجيل الخروج ويعتمد على الاجاكس أيضاً الان لملف display.js رح نضع الفنكشن الخاصة بالأجاكس حتى نحدد كيفية إرسال البيانات بالنسبة للمتصفح و أيضا فنكشن تغيير المحتوى ومافي داعي أشرحهم لأني سبق و فعلت في التطبيق السابق : كود:
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("login").innerHTML=xmlHttp.responseText;
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
} نبدأ أولا بتسجيل الدخول: كود:
function login()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var name = document.getElementById('name');
var url="display.php?"
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("POST",url,true)
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
text="name="+name.value
xmlHttp.send(text)
} كود: xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8'); كود: text="name="+name.value xmlHttp.send(text) الأن نضع فنكشن تسجيل الخروج : كود:
function logout(){
xmlHttp=GetXmlHttpObject()
var url="display.php?"
url=url+"logout=logout"
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
} فنكشن إرسال نصوص المحادثة : كود:
function sendchat()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var chattext = document.getElementById('chattext');
var url="chatbox.php?"
xmlHttp.open("POST",url,true)
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
text="chattext="+chattext.value
xmlHttp.send(text)
chattext.value = '';
} كود: xmlHttp.onreadystatechange=stateChanged كود: chattext.value = ''; الان بقي في هذا الملف شرح العملية (function) التي تقوم بتنفيذ العمليات الأخرى عند نقر enter مباشرة وهي: كود: function keyDown(func){
k=window.event.keyCode;
if(k==13){
if(func=="login"){
login();
}
if(func=="sendchat"){
sendchat();
}
}
} كود: onkeydown="javascript:keyDown('sendchat')" كود: onkeydown='javascript:keyDown(\"login\")' كود: k=window.event.keyCode;
if(k==13){ كود: if(func=="login"){
login();
}
if(func=="sendchat"){
sendchat();
} كود:
function keyDown(func){
k=window.event.keyCode;
if(k==13){
if(func=="login"){
login();
}
if(func=="sendchat"){
sendchat();
}
}
}
function login()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var name = document.getElementById('name');
var url="display.php?"
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("POST",url,true)
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
text="name="+name.value
xmlHttp.send(text)
}
function logout(){
xmlHttp=GetXmlHttpObject()
var url="display.php?"
url=url+"logout=logout"
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function sendchat()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var chattext = document.getElementById('chattext');
var url="chatbox.php?"
xmlHttp.open("POST",url,true)
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
text="chattext="+chattext.value
xmlHttp.send(text)
chattext.value = '';
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("login").innerHTML=xmlHttp.responseText;
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
} نضع أول شي بداية الجلسة(session) وتضمين ملف الconfig.php وتضمين ملف الجافا سكربت الخاص به مع أكاود الهيدر الأساسية : كود بلغة HTML: <?php session_start(); $name=$_SESSION['name']; include"config.php"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv='content-type' content='text/html; charset=utf-8' /> <script src="online.js"></script> </head> كود PHP: السر في ملف الجافا سكربت online.js بحيث رح يتم عمل تحديث للصفحة بطريقة أجاكسية ![]() نتوجه لonline.js الان وهذا هو كامل : كود:
window.onload=refresh();
function refresh()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="online.php?"
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("onlineshow").innerHTML=xmlHttp.responseText;
a=setTimeout("refresh()",1000);
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
} وضعنا أمر لتنفيذ فنكش refresh عند تحميل النافذة كود: window.onload=refresh(); وفي فنكشن stateChanged بعد التاكد من أن readyState = 4 و القيام بجلب النص : كود: document.getElementById("onlineshow").innerHTML=xmlHttp.responseText; كود: a=setTimeout("refresh()",1000); (لا أعرف إذا كان هذا رح يأثر على الموقع يلي يشتغل عليه كثير لكن كلها مجرد نصوص صغيرة يتم جلبها كل حوالي ثانية ما اتوقع ان يكون له تأثر كبير ) الأن إلى الملف القبل الأخير chatbox.php: كالعادة نضيف الهيدر و المتغيرات الرئيسية يلي نحتاجها مع تضمين الملفات : كود بلغة HTML: <?php session_start(); $chattext=$_POST['chattext']; $name=$_SESSION['name']; $logintime=$_SESSION['logintime']; include"config.php"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv='content-type' content='text/html; charset=utf-8' /> <script src="chatbox.js"></script> </head> كود PHP: كود PHP: كود PHP: الأن إلى الملف الأخير chatbox.js وهو شبيه جداً بonline.js حيث يقوم بعمل الرفرش الأجاكسي لكن طبعا مع إختلاف في اسم الملف و الdiv و وجود أمر جديد فيه أنظر : كود:
window.onload=refresh();
function refresh()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
{
alert ("Browser does not support HTTP Request")
return
}
var url="chatbox.php?"
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
document.getElementById("chatshow").innerHTML=xmlHttp.responseText;
a=setTimeout("refresh()",1000);
window.scroll(0,9999);
}
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
} كود: window.scroll(0,9999); بهذا نكون إنتهينا من شرح السكربت كامل و الان ننتقل للإضافات : أ- عمل رسالة الإنتظار : رح أقوم بعمل رسالة لما المستخدم يقوم بتسجيل دخول للدردشة تطلب منه الإنتظار نفتح display.php: أولاً نقوم بإضافة div أسف الdiv الخاص بتسجيل الدخول في كود PHP: كود PHP: وفي display.js نتوجه للفنكشن stateChanged ونضع هذا الشرط الجديدreadyState!==4 (تم شرح الreadyState بالتفصيل في التطبيق السابق ) : كود: if (xmlHttp.readyState!==4)
{
var msg="يرجى الإنتظار ...";
document.getElementById("msg").innerHTML=msg;
} وطبعا لازم نزيل الرسالة لما يتم الإنتهاء من الأمر لذلك نضع : كود: var msg="";
document.getElementById("msg").innerHTML=msg; كود: if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") ب- إلغاء الضغط أكثر من مرة على (دخول) في تسجيل الدخول للدردشة انا لاحظت لو واحد قام بالضغط على دخول وثم غير الاسم بسرعة (لان اتصاله بطيء يقدر) و ضغط عليها مرة ثانية رح يتم حساب الاسم الاول في قائمة المستخدمين الاون لاين ورح يظل عالق فيها ما يطلع إلا بحذفه من قاعدة البيانات لذلك أنصح بعمل هذا أول شي نروح للضغطة الموجودة في display.php وهي : كود بلغة HTML: <input onclick='javascript:login()' type='button' value='دخول' /> كود بلغة HTML: <input onclick='javascript:login()' id=subm type='button' value='دخول' /> بعدين نفتح display.js وإذا كنت عملت الإضافة السابقة كل ماعليك هو إضافة كود: document.getElementById("subm").disabled="disabled"; لصبح كود: if (xmlHttp.readyState!==4)
{
document.getElementById("subm").disabled="disabled";
var msg="يرجى الإنتظار ...";
document.getElementById("msg").innerHTML=msg;
} طبعا بالنسبة للسكربت يلي عملنها حسبنا حساب إذا المستخدم أغلق الصفحة دون أي سابق إنذار فسوف يتم تسجيل خروجه حتى لا تصير مشاكل ولا يتم تسجيل خروجه لكن ماذا لو انقطع إتصال احد المستخدمين او الكومبيوتر أنغلق فجأة !؟؟ إذا صار هذا رح يظل اسم المستخدم عالق في قائمة المستخدمين إلى أن يزال من قاعدة البيانات يدوياً ولحل هذه المشكلة لازم نضع مثل مدة زمنية إذا انتهت يتم تسجيل خروج المستخدم تلقائياً نبدا بالخطوات : أنتوا تتذكروا الحقل time يلي وضعته بجدول ajax_online وما استخدمته في شي من السكربت !؟ لكن الان جاء دوره اول شي نروح لonline.php ورح نضيف لها : ( كود يقوم بتحديث حقل time بحسب المستخدم - فحص لجميع حقول المستخدمين و تسجيل خروج من تجاوز المدة المحددة) نضيف أولاً : كود PHP: الأن بقي أن نضع التأكد من كل المستخدمين إذا كانوا داخل المدة الزمنية المتاحة أو نحذفهم. داخل دالة التكرار كود PHP: كود PHP: ثم يوضع الشرط إذا كان الوقت الأن أكبر من وقت المستخدم + 60 ثانية يعني ان المستخدم لم يتم تحديث وقته خلال هذه ال60 ثانية فعند تحقق الشرط يتم تسجيل خروجه و الاكواد الباقية شبيه جداً بتسجيل خروج المستخدم في display.php ما أنصح واحد يحط وقت قليل جداً مثل ثانية أو ثانيتين لأانهم ممكن يلي عنده سرعة إتصال بطيئة يستغرق التحديث وقت شوي أكثر من الثانيتين فعندها يتم تسجيل خروجه وهو لسى موجود وتصير مشاكل أكبر ![]() لذلك أفضل شي الوقت يكون بين ال30 ثانية إلى 60 ثانية كحد أقصى د- حماية ملفات النصوص و الأعضاء المتواجدين: إذا كان واحد غير مسجل دخول و فتح chatbox.php أو online.php رح يشوف كل نصوص الكتابة و المستخدمين المتواجدين xD لذلك لازم نعمل لهم حماية عن طريق فحص الجلسة (session) ضع : كود PHP: الحمد لله تم الإنتهاء من الإضافات والتطبيق كامل و في المرفقات السكربت كامل مع جميع الإضافات ولكن فيه مشكلة بسيطة في السكربت : إذا كنت داخل في الدردشة و عملت تحديث(refresh) رح يتم تنفيذ امر تسجيل الخروج لان : كود بلغة HTML: <body onunload="javascript:logout()"> أتمنى إذا واحد شاف حل للمشكلة يطلعنى عليها بحيث يبقى الحدث الموجود على الbody ![]() ------------------------- في التطبيق القادم: تسجيل عضويات باستخدام الأجاكس رح يكون فيه تأكد من كافة المدخلات وطباعة الأخطاء بالأجاكس وضع صورة التحقق الcaptcha استخدام أحد أشكال niceforms لتحديد شكل جمالي رائع لنموذج التسجيل (إحتمال لم أقرر حتى الان ) | |||||
|
| |||||
|
ألف شكروالله يعطيك العافيه
__________________ سبحان الله وبحمده When Darkness Turns to light, It ends tonight.. >.< مواقعي.. ^^ Q8iEnG :: Lazqa :: ClickClick support C++ Language :: Mr.Bean's World | |||||
|
| |||||
|
__________________ تطبيقات أجاكس: - تصويت باستخدام الاجاكس - دردشة باستخدام الاجاكس -تسجيل عضويات باستخدام الأجاكس -تسجيل دخول باستخدام الاجاكس | |||||
|
| |||||
|
تفضل رفعته على موقع لي أجرب عليه سكرباتي : http://almaster.4mtm.net/chat+ajax/display.php
__________________ تطبيقات أجاكس: - تصويت باستخدام الاجاكس - دردشة باستخدام الاجاكس -تسجيل عضويات باستخدام الأجاكس -تسجيل دخول باستخدام الاجاكس | |||||
|
| |||||
|
الله يكرمك ويبارك فيك وجزاك الله كل خير استفدت كثيراً جداً من اكواد الجافا سكربت التي وضعتها وبارك الله فيك على هذا الشرح الاكثر من رائع
__________________ أخى أنت حر وراء السدود ** أخى أنت حر بتلك القيود إذا كنت بالله مستعصـــمــا ** فماذا يضيرك كيد العبـيـد | |||||
|
| |||||
| اقتباس:
تعديل بسيط على فنكشن keyDown التي تقوم بجعل enter ينفذ العملية المحددة وهي : كود: function keyDown(func){
k=window.event.keyCode;
if(k==13){
if(func=="login"){
login();
}
if(func=="sendchat"){
sendchat();
}
}
} إذا نقوم بالتعديلات التالية . اولاً : نعدل على الفنكش لتصبح : كود: function keyDown(e,func) {
evt = e || window.event;
var k = evt.which || evt.keyCode;
if(k==13){
if(func=="login"){
login();
}
if(func=="sendchat"){
sendchat();
}
}
} كود: onkeydown='javascript:keyDown(event,\"login\")' كود: onkeydown='javascript:keyDown(event,"sendchat")'
__________________ تطبيقات أجاكس: - تصويت باستخدام الاجاكس - دردشة باستخدام الاجاكس -تسجيل عضويات باستخدام الأجاكس -تسجيل دخول باستخدام الاجاكس | |||||
|
| |||||
|
تعديل أخر من أجل فايرفوكس ![]() في display.php : كود PHP: كود PHP: لأن الظاهر الفايرفوكس يقوم بالتعديل على الdiv حسب احدث div وجد لكن الIE تعديلاته على الdiv الأصلية : كود: document.getElementById("login").innerHTML=xmlHttp.responseText;
__________________ تطبيقات أجاكس: - تصويت باستخدام الاجاكس - دردشة باستخدام الاجاكس -تسجيل عضويات باستخدام الأجاكس -تسجيل دخول باستخدام الاجاكس | |||||
|
| |||||
| اقتباس:
![]() بالنسبة للسكربت برفعه الملفات بعد كل التعديلات يلي حصلت في الردود + هذا التعديل : إضافة دالةescape () حتى نتمكن من كتابة & في الحقول و إرسلها بدون مشاكل ![]() وطبعا الدالة unescape() لإعادة النص (العربي خاصةً) لحالته الأصلية تقبلوا تحياتي ,
__________________ تطبيقات أجاكس: - تصويت باستخدام الاجاكس - دردشة باستخدام الاجاكس -تسجيل عضويات باستخدام الأجاكس -تسجيل دخول باستخدام الاجاكس | |||||
|