منتدى استراحات زايد

منتدى استراحات زايد (http://vb.ma7room.com/index.php)
-   منتدى أخبار المواقع والمنتديات العربية والأجنبية (http://vb.ma7room.com/forumdisplay.php?f=183)
-   -   [ درس ] كيفية عمل نظام اعجاب بسيط جدا جدا (http://vb.ma7room.com/showthread.php?t=1415212)

محروم.كوم 03-14-2014 06:10 PM

[ درس ] كيفية عمل نظام اعجاب بسيط جدا جدا
 
السلام عليكم ورحمة الله و بركاته

نظرا لان الكثير من الاعضاء محتارين كيف يتم عمل نظام الاعجاب كما في ترايدنت فقد قمت بعمل هذا الشرح البسيط جدا لهذه العملية
لندرس الموضوع بكل بساطه
اولا مطلوب في كل موضوع وكل رد وضع زر اعجاب وايضا مطلوب عند الضغط على زر الاعجاب ارسال رقم الموضوع او رقم الرد مع رقم العضو ومن ثم الحفظ في قاعدة البيانات وعند الحفظ يتم تحديث البيانات سواء في الرد او الموضوع بكلمة ( أنت و فلان وفلان معجبون بالموضوع ) مع ظهور زر جديد لعدم الاعجاب
اذن لنبدأ وسيكون العمل غلى نفس الاكواد الخاصة بك مع بعض التعديلات البسيطه عليها

طبعا هنا انا لا اعتمد على نظام ال vb في الشرح لكي لا احصر الشرح في عملية تطوير المنتديات فقط وانما اشرح الموضوع بصفة عامة اما تطبيقة سيكون على حسب كل اسكربت وبنفس الطريقه

اول شيء سنحتاج الى جدول في قاعدة البيانات يحتوي على الحقول التالية
id تلقائي ولا داعي له الا في عمليات الحذف او الارشفة
postid وسيكون هو الخاص بتخزين رقم اي دي الموضوع او الرد فيه
userid وهو رقم عضوية العضو الذي قام بالضغط على زر الاعجاب
type هو نوع المحتوي الذي قمت بالضغط عليه ( موضوع - رد - صورة - الخ ) باعتبار ان الاسكربت يدعم المحتوي المتعدد وهذا الحقل مهم في الاستعلامات
dateline وسيتم فيه تخزين وقت الضغط علة الزر بصيغة unix و الفائده منه الترتيب عند العرض للمعجبين

الان نبدأ العمل

لو اتخذنا المنتديات على سبيل المثال في عرض المحتوي فان الموضوع يتم عرضه في قالب وباقي الردود يم عرضها من خلال حلقة تكرار
لو بسطنا الامور جدل فسنجد ان ما نحتاج اليه سيكون كالتالي
رمز PHP:
1        like
2        like
3        like
4        like
5        like
6        like
7        like
8        like


لو حللنا الكود ببساطة سنجد
رمز PHP:
class="show"


وهو كلاس بسيط سنقوم من خلاله تحديد حدث وهو عند الضغط عليه
رمز PHP:
data-id="1" data-userid="8" data-type="thread"


وهي معلومات مهمة جدا نقوم بتحديدها في كل رابط لزر الاعجاب طبعا انا قمت باعطاء البيانات مباشرة ولكن اذا كنت تستخدم نظام القوالب يمكنك تحديد متغيرات لكل data منهم بالقيمة على حسب المتغير
وايضا سنلاحظ ان type هنا قمت بتحديدها على انها thread اي موضوع وليس رد
وما يليه سنجد ان النوع هو post وهو المفروض ان يكون من خلال حلقة تكرار
هذا كل ما نحتاج اليه من بيانات html والباقي سيكون ajax و php

الان نقوم ببناء اكواد jquery لتقوم بالعمل
الدالة ستكون كالتالي

رمز PHP:
$(".show").on('click',function(){
var
container = this ;
$(
container).slideUp('slow');
$.
ajax
({
url: 'like.php' ,
data: "do=like&type="+ $(this).data("type")+"&id="+$(this).data("id")+"&userid="+$(this).data("userid") ,
success: function(response)
{
if(
response.error)
{
alert(response.error);
$(
container).slideDown('slow');
return
false ;
}
else if(
response.message)
{
$(
response.message).insertAfter(container);
}
} ,
type: 'POST' ,
dataType: 'json'
});
return
false ;
}) ;


الشرح

رمز PHP:
$(".show").on('click',function(){


اي عند الضغط على زر الاعجاب الذي يحمل الكلاس show
رمز PHP:
var container = this ;


قمنا يتحديد هذا الكلاس او هذا الزر لانه الكلاس يتكرر اكثر من مرة في الصفحه , وذلك بهذف استغلاله في دالة الاجاكس لاحقا
رمز PHP:
$(container).slideUp('slow');


اخفاء زء الاعجاب
رمز PHP:
url: 'like.php' ,
data: "do=like&type="+ $(this).data("type")+"&id="+$(this).data("id")+"&userid="+$(this).data("userid") ,
type: 'POST' ,
dataType: 'json' ,


\ارسال البيانات عن طريق الاجاكس الى صفحة php
رمز PHP:
success: function(response)
{
if(
response.error)
{
alert(response.error);
$(
container).slideDown('slow');
return
false ;
}
else if(
response.message)
{
$(
response.message).insertAfter(container);
}
}


عند نجاح عملية الارسال وهي هنا مقسمة الى قسمين
عند ارسال البيانات ووجود خطأ في معالجة البيانات سنظهر رسالة خطأ ونقوم باظهار زر الاعجاب مرة اخرى ويمثلها الكود التالي
رمز PHP:
if(response.error)
{
alert(response.error);
$(
container).slideDown('slow');
return
false ;
}


الشق الثاني عند ادخال الاعجاب الى قاعدة البيانات من ثم سنظهر المعجبين ويمثلها الكود التالي
رمز PHP:
else if(response.message)
{
$(
response.message).insertAfter(container);
}


اخيرا ملف php الخاص بالمعالجة
قمت بعمل رقم عضوية افتراضي وهو متمثل في المتغير
رمز PHP:
$session_userid = 1 ;


اذا كنت تستخدم السيزون او الكوكيز يجب تخصيص هذا المتغير الى رقم عضوية العضو
ثانيا قمت بعمل بعض الماغيرات التي سيتم استخدامها لاحقا مثل
رمز PHP:
$erros = $success = array();


وهي رسالة الخطأ او رسالة الصحة وهي مصفوفه لانه ارسال البيانات في الاجاكس تم عن طريق json

اولا الاكشن الخاص بالاعجاب والادخال الى قاعدة البيانات
رمز PHP:
if($_POST['do'] = 'like')


التأكد من البيانات المرسلة
رمز PHP:
$id = intval($_POST['id']) ;
$type = trim($_POST['type']);
$uid = intval($_POST['userid']);
if(!
$id)
{
$erros['error'] = 'invalid id ';
}
if(!
$type)
{
$erros['error'] = 'invalid type ';
}
if(!
$uid)
{
$erros['error'] = 'you donot have the permission to do this ';
}


اذا كانت هناك اي اخطاء في الداتا يجب اظهار رسالة خطأ
رمز PHP:
if(sizeof($erros) > 0 )
{
echo
json_encode($erros);
exit;
}


والا ادخال الى قاعدة البيانات
رمز PHP:
$query = mysql_query("INSERT INTO like (postid , type , userid , dateline ) VALUES ('$id' , '$type' , '$uid' , '".time()."' )")
OR die(
mysql_error());


واذا تم الادخال يتم التحويل الى اكشن اخر وهو جلب المعجبون وهنا قمت بعملة في اكشن اخر لان اكثر شيء اكرهه وهو تكرار الكود وهو ما يجب تجنبه ايضا يمكن عمل هذا الموضوع عن طريق البرمجه الكائنيه او الكلاسات ولم اقم بعمله بهذه الطريقه لتوصيل المعلومه ايضا الى المتوسطين في البرمجه او المبتدئين
الفكرة انه يمكن تخصيص هذا الاكشن لاكثر من وظيفة في الاسكربت وهذا ليس مجالنا الان
رمز PHP:
if($query)
{
$_REQUEST['do'] = "get_likes";
$_POST['id'] = $id ;
$_POST['type'] = $type ;

}


الان الاكشن الخاص بجلب المعجبون
رمز PHP:
if($_REQUEST['do'] == 'get_likes')


تحليل البيانات واظهار رسالة خطا اذا كانت البيانات غير سليمة
رمز PHP:
if(!$id)
{
$erros['error'] = 'invalid id ';
}
if(!
$type)
{
$erros['error'] = 'invalid type ';
}
if(
sizeof($erros) > 0 )
{
echo
json_encode($erros);
exit;
}


والا عمل استعلام لجلب المعجبون
رمز PHP:
$query = mysql_query(" SELECT like.userid , user.username FROM like INNER JOIN user
ON
(like.userid = user.userid )
WHERE like.id = '
$id' AND like.type = '$type'
ORDER BY like.dateline DESC
"
) ;


هنا قمت بدمج جدول الاعضاء في الاستعلام لجلب اسم العضو بدلالة رقم عضويته
ومن ثم عمل تحليل بسيط للبيانات ووضعها في مصفوفه مع تحديد اذا كان رقم عضويه العضو الذي قام بالضغط على ز الاعجاب متواجد في هذه المصفوفه يتم استبدال اسمه بكلمة ( أنت و ...)
رمز PHP:
$userinfo = array();
$success['message'] = '' ;

$extra = '' ;
while(
$fetch = mysql_fetch_assoc($query))
{
if(
$fetch['userid'] == $session_userid)
{
$userinfo['username'] = 'YOU ' ;
$extra = 'AND' ;
}
$userinfo['userid'] = $userinfo['username'] ;
}


الان عمل حلقة تكرار بسيطه جدا لعرض هذه المصفوفه
رمز PHP:
foreach($userinfo as $key => $value)
{

$success['message'] .= " $value$extra - " ;
}
$success['message'] .= " like this ";
$success['message'] .= " unlike ";
echo
json_encode($success);
exit;


طبعا هذه هي الفكرة بشكل بسيط جدا ويمكن تطويرها الى جانب انني لم اذكر كيفية عمل زر عدم الاعجاب وان كنت اسست دالة الاجاكس الخاصه به ومرفقه مع الموضوع وايضا لم اقم بعمل فكرة اذا لم يكن هناك معجبون في الموضوع غير العضو الذي يقوم بالضغط على الزر وافكر اخرى كثيره ولكن كما قلت هذه الفكرة بشكل مبسط جدا

اتمنى للجميع الاستفادة وأن أصبت فمن الله وأن أخطأت فمن نفسي ومن الشيطان
لمن لم يفهم اي جزء انا جاهز ان شاء الله للتوضيح
مرفق الملفات

الملفات المرفقة http://www.traidnt.net/vb/images/attach/zip.gif like.zip (2.1 كيلوبايت)


الساعة الآن 03:26 PM

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.5.2 TranZ By Almuhajir


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227