پی ایچ پی میں کیلنڈر بنائیں

اگر ہمارا مقصد یہ ہے کہ PHP کی مدد سے کسی بھی مہینے کی تاریخیں پرنٹ کی جائیں، تو ایک loop استعمال کرتے ہوئے ایسا کیا جا سکتا ہے۔ اس مہینے کے دنوں کی جو تعداد ہے، یہ لوپ اتنے ہی چکر کاٹے گا، اور ہر چکر میں ایک دن کی ویلیو بڑھا کر پرنٹ کر دی جائے گی۔ لیکن ہم چاہتے ہیں کہ مکمل مہینے کی تاریخیں ایک کیلنڈر کی شکل میں پرنٹ ہوں۔ یعنی ٹیبل کی پہلی سطر میں ہفتے کے دنوں کے نام موجود ہوں، اور ان کے نیچے مہینے کے تمام دنوں کی تاریخیں ہفتہ وار درج ہوں۔ پھر ہم یہ بھی چاہتے ہیں کہ موجودہ مہینے کی ویلیوز نمایاں ہوں، جبکہ پچھلے اور اگلے مہینے کی ویلیوز ہلکے رنگوں میں ہوں۔ اس کے علاوہ ہم اتوار اور جمعہ کے دنوں کی تاریخیں مختلف رنگوں میں دکھانا چاہتے ہیں۔

چنانچہ کیلنڈر کا ایسا ٹیبل بنانے کے لیے ہم دو loops استعمال کریں گے۔ ایک while لوپ اور ایک for لوپ۔ while کو بیرونی لوپ کے طور پر استعمال کیا جائے گا، جبکہ for کو اندرونی لوپ کے طور پر۔ while لوپ کی مدد سے 6 ہفتوں کی سطریں، جبکہ for لوپ کی مدد سے ہر سطر کے لیے ہفتے کے 7 دنوں کے خانے بنائے جائیں گے۔

PHP میں بنایا گیا یہ کیلنڈر درج ذیل اسکرین شاٹ کی طرح نظر آئے گا۔

پی ایچ پی میں بنایا گیا پورے مہینے کا کیلنڈر

کوڈ اور اس کی وضاحت

درج ذیل کوڈ میں کامنٹس کی لائنوں میں نمبر دیے گئے ہیں، ان نمبروں کے اعتبار سے کوڈ کی وضاحت دی جا رہی ہے۔

  1. سب سے پہلے وہ ویری ایبلز تیار کیے گئے ہیں جن کی مدد سےہم کیلنڈر بنائیں گے۔
    • month$ ویری ایبل میں موجودہ مہینہ، اور year$ ویری ایبل میں موجودہ سال رکھا گیا ہے۔
    • اس سے اگلی لائن میں PHP کے ()mktime فنکشن کی مدد سے آج کے دن کی تاریخ تیار کی گئی ہے۔ یہ فنکشن سیکنڈز کی صورت میں نتیجہ مہیا کرتا ہے جسے start_date$ ویری ایبل میں محفوظ کیا گیا ہے۔
    • اگر آپ start_date$ ویری ایبل پرنٹ کریں گے تو یکم جنوری 1970ء سے اب تک جتنے سیکنڈز گزرے ہیں ان کی تعداد پرنٹ ہو جائے گی۔ ظاہر ہے کہ یہ ویلیو ہمارے کسی کام کی نہیں ہے۔ چنانچہ سیکنڈز پر مشتمل ایسے ویری ایبل کو ()date فنکشن کی مدد سے فارمیٹ کر کے اس میں سے دن، مہینہ، سال، گھنٹہ، منٹ اور سیکنڈ کی ویلیوز حاصل کی جاتی ہیں۔ جیسا کہ اس ویری ایبل کو اگلی لائن میں ()date فنکشن کی مدد سے فارمیٹ کر کے مہینے کا نام معلوم کیا گیا ہے۔
    • PHP میں ہفتے کا پہلا دن Sunday ہوتا ہے۔ اس لیے اگلی لائن پر ()date فنکشن کو w فارمیٹ کریکٹر فراہم کیا گیا ہے تاکہ آج ہفتے کا جو دن بھی ہے، وہ اس کا نمبر مہیا کر دے۔ مثلاً‌ اگر آج اتوار ہے تو یہ ویلیو 0 ہوگی، اور اگر سوموار ہے تو یہ ویلیو 1 ہوگی۔ یہ ویلیو day_of_week$ ویری ایبل میں محفوظ کی گئ ہے۔
    • لیکن ہم آج کے دن سے اپنا کیلنڈر شروع نہیں کرنا چاہتے، بلکہ ہم اسے اتوار سے شروع کرنا چاہتے ہیں۔ چونکہ ایک دن میں 86400 سیکنڈز ہوتے ہیں، اس لیے جب ہفتے کے موجودہ دن کو اس نمبر سے ضرب دی گئی تو ہمارے پاس اتنے دنوں کے سیکنڈز کی تعداد آگئی جو اتوار سے لے کر اب تک گزرے ہیں۔ یہ سیکنڈز ہم نے start_date$ سے منفی کر دیے ہیں۔ اب اس ویری ایبل میں آج کے نہیں بلکہ گزرے ہوئے اتوار کے سیکنڈز موجود ہیں۔ یعنی اسے ()date فنکشن کی مدد سے فارمیٹ کرنے پر اتوار کی تاریخ ملے گی۔
  2. اگلے مرحلے میں for لوپ کے سات چکروں کی مدد سے HTML ٹیبل کی Head سطر تیار کی گئی ہے جس میں دنوں کے نام موجود ہیں۔ آپ دیکھ سکتے ہیں کہ لوپ شروع ہونے سے پہلے اور لوپ ختم ہونے کے بعد tr ٹیگ کی مدد سے ٹیبل کی سطر بنائی گئی ہے۔ جبکہ لوپ کے اندر ہر چکر میں ()date فنکشن سے D فارمیٹ کریکٹر کی مدد سے دن کا نام حاصل کیا گیا ہے۔ اس نام کو پھر HTML ٹیبل کے th ٹیگ کے ساتھ مکس کر کے خانے بنائے گئے ہیں۔
  3. تیسرے مرحلے میں while لوپ شروع کیا گیا ہے جو چھ ہفتوں کے لیے سطریں بنائے گا۔ چونکہ ہم ہفتے کو اتوار کے دن سے شروع کر رہے ہیں، اور ہمیں یہ نہیں معلوم کہ ہفتہ شروع ہونے کے کتنے دن بعد مہینے کی پہلی تاریخ آئے گی، اس لیے ہمیں ٹیبل کی چھ سطریں چاہئیں تاکہ مکمل مہینے کی تاریخیں ان سطروں میں پوری آسکیں۔ ٹیبل کی پہلی سطر میں کچھ دن پچھلے مہینے کے ہوں گے اور آخری سطر میں کچھ دن اگلے مہینے کے۔
  4. اب ہم while لوپ کے اندر ہیں۔ ہفتے میں چونکہ سات دن ہوتے ہیں اس لیے for لوپ کے سات چکروں کی مدد سے ایک سطر کے سات خانے بنائے جائیں گے۔ لوپ ہفتے کے جس دن کے چکر پر ہوگا، ()date فنکشن کی مدد سے start_date$ ویری ایبل میں سے ہفتے کے اس دن کا نمبر حاصل کیا گیا ہے۔دن کا یہ نمبر month_day$ ویری ایبل میں رکھا گیا ہے جسے پھر ٹیبل کی سطر کے خانے میں شامل کیا گیا ہے۔
  5. اب آپ if-else اسٹیٹمنٹ دیکھ رہے ہیں۔ if والے حصے میں ہم نے یہ معلوم کیا ہے کہ پچھلے اور اگلے مہینے کے دن کونسے ہیں۔ ان دنوں کو اسٹائل رولز کی مدد سے ہلکے رنگ میں دکھایا گیا ہے۔
  6. یہاں ہم else والے حصے میں ہیں۔ اس میں ایک مزید if-else اسٹیٹمنٹ کی مدد سے یہ بتایا گیا ہے کہ اگر یہ اتوار کا دن ہے تو اسے سرخ رنگ میں نظر آنا چاہیے، اور اگر جمعہ کا دن ہے تو اسے نیلے رنگ میں نظر آنا چاہیے۔
  7. یہاں for لوپ کا ایک چکر ختم ہونے والا ہے، چنانچہ start_date$ میں ایک دن کا اضافہ کیا گیا ہے، تاکہ لوپ کے الگ چکر پر اگلے دن کی ویلیو کی مدد سے ٹیبل کا خانہ بنایا جا سکے۔
    اس طرح لوپ کے سات چکر پورے ہونے پر ٹیبل کی ایک سطر تیار ہو جائے گی۔ for لوپ کے باہر while لوپ موجود ہے جو اپنے اگلے چکر پر ٹیبل کی اگلی سطر تیار کرے گا۔ یعنی while لوپ ٹیبل کی چھ سطریں بنائے گا، جبکہ for لوپ ہر سطر کے لیے دنوں کے سات خانے بنائے گا۔
  8. آخر میں h2 ٹیگ میں اس مہینے اور سال کے نام، جبکہ ٹیبل کی تمام سطریں table ٹیگ میں رکھ کر مکمل ٹیبل پرنٹ کر دیا گیا ہے۔

<?php
// (1) Calendar variables
$month date("m");
$year date("Y");
$start_date mktime(010000$month1$year);
$month_name date("F"$start_date);
$day_of_week = (int)date("w"$start_date);
$start_date $start_date - ($day_of_week 86400); // start week from Sunday

// (2) Table head
$head_start $start_date;
$table_head "<tr>";
for (
$week_day 1$week_day <= 7$week_day++) {
    
$day_name date("D"$head_start);
    
$table_head $table_head "<th>$day_name</th>";
    
$head_start $head_start 86400;
}
$table_head $table_head "</tr>";

// (3) 6 rows of table
$week_number 1;
$table "";
while (
$week_number <= 6) {

    
// (4) 7 cells of row 
    
$table $table "<tr>";
    for (
$week_day 1$week_day <= 7$week_day++) {

        
$month_day date("d"$start_date);
        
// (5) Day of previous or next month
        
if (($week_number && (int)$month_day 20) || ($week_number && (int)$month_day 15)) {
            
$table $table "<td style='color:#CCC;'>$month_day</td>";
        } else {
            
// (6) Day of this month
            
$day_name date("D"$start_date);
            if (
$day_name == "Sun") {
                
$table $table "<td style='color:red;'>$month_day</td>";
            } else if (
$day_name == "Fri") {
                
$table $table "<td style='color:blue;'>$month_day</td>";
            } else {
                
$table $table "<td>$month_day</td>";
            }
        }
        
// (7) Add 1 day for next cell
        
$start_date $start_date 86400;
        
    } 
// End for-loop
    
$table $table "</tr>";
    
$week_number++;
    
// End while-loop

// (8) Print the table
echo "<h2>$month_name $year</h2>
        <table>
$table_head $table</table>";
?>

 

اگر آپ سال کے بارہ مہینوں کے ٹیبلز تیار کرنا چاہیں تو اس کا طریقہ بہت آسان ہے۔ اوپر دیا گیا تمام کوڈ ایک for لوپ کے اندر رکھیں۔ یہ لوپ 1 سے 12 تک چلائیں۔ اس لوپ کے ویری ایبل کی ویلیو ()mktime فنکشن میں مہینے کی ویلیو کے طور پر استعمال کریں۔ کیلنڈر کے ٹیبلز کی پوزیشن وغیرہ سیٹ کرنے کے لیے، یا انہیں خوبصورت بنانے کے لیے آپ CSS استعمال کر سکتے ہیں۔

Categories: