এই নিবন্ধে ক্যাটাগরি ও সাব-ক্যাটাগরি প্রদর্শন করার উপায় সম্পর্কে আলোচনা করা হবে, ইনশা-আল্লহ্।
১। ডাটা টেবিল তৈরি:
প্রথমেই আমরা ডাটাবেসে categories
নামে একটি টেবিল তৈরি করে কিছু ডাটা ইনসার্ট করবো। MySQL Recursive Query নিবন্ধের ২ নং অনুচ্ছেদ “ডাটা টেবিল তৈরি” অনুসরণ করে আমরা তা করতে পারি।
২। ক্যাটাগরির তালিকা তৈরি (Repeat MySQL Query):
নিচের Recursive Function ব্যবহার করে আমরা ক্যাটাগরির তালিকা তৈরি করতে পারি।
// Category Tree List function category_tree_list($parent_id = 0, $cat_list = '') { global $pdo; $sql = "SELECT * FROM categories WHERE parent_id = :parent_id ORDER BY category"; $stmt = $pdo->prepare($sql); $stmt->bindParam(":parent_id", $parent_id, PDO::PARAM_INT); $stmt->execute(); if($stmt->rowCount() > 0){ $class = ($parent_id == 0) ? 'cat-list' : 'sub-cat'; $cat_list .= "<ul class='$class'>"; while($cat = $stmt->fetch(PDO::FETCH_ASSOC)){ $cat_list .= "<li>$cat[category]"; $cat_list = category_tree_list($cat['id'], $cat_list); $cat_list .= "</li>"; } $cat_list .= "</ul>"; } return $cat_list; }
৩। ক্যাটাগরির তালিকা তৈরি (PHP Loop):
উপরের ফাংশনে বারবার MySQL Query পরিচালনা করা হয়েছে। এখন আমরা চাচ্ছি, শুধু একবার কুয়েরি করে ডাটা কালেক্ট করবো এবং বাকি কাজগুলো পিএইচপি’তে foreach
লুপ ব্যবহার করে করবো। সেক্ষেত্রে দুটি ফাংশন ব্যবহার করবো। প্রথম ফাংশন দ্বারা শুধু একবার ডাটাবেস থেকে ক্যাটাগরিসমূহ কালেক্ট করবো এবং দ্বিতীয় ফাংশন দ্বারা HTML-এ ক্যাটাগরি ট্রি (Category Tree) তৈরি করবো।
প্রথম ফাংশন:
ডাটাবেস থেকে ক্যাটাগরির ডাটা পেতে নিচের ফাংশন ব্যবহার করতে পারি। এখানে PDO ব্যবহার করা হয়েছে।
// Get all Categories from Database function get_categories_from_db(){ global $pdo; $sql = "SELECT * FROM categories ORDER BY category"; $stmt = $pdo->prepare($sql); $stmt->execute(); if ($stmt->rowCount() > 0) { $result = $stmt->fetchAll(PDO::FETCH_ASSOC); return $result; } return false; }
দ্বিতীয় ফাংশন:
এখন নিচের ফাংশন ব্যবহার করে ক্যাটাগরির তালিকা তৈরি করতে পারি।
// Category Tree List function category_tree_list($parent_id = 0, $cat_list='', $cat_array=array(), $parent_ids=array()) { // For the first time, fetch categories from database if(empty($cat_array)) { $cat_array = get_categories_from_db(); } // No category found in Database if(empty($cat_array)) { return $cat_list; } // Extract Unique Parent IDs if (empty($parent_ids)) { $parent_ids = array_column($cat_array, 'parent_id'); $parent_ids = array_unique($parent_ids); } // In case of last-level sub-category item (which has no child item), don't proceed // Otherwise, empty "<ul class='sub-cat'></ul>" will be generated if(array_search($parent_id, $parent_ids) !==false) { $class = ($parent_id == 0) ? 'cat-list' : 'sub-cat'; $cat_list .= "<ul class='$class'>"; foreach($cat_array as $cat) { if($parent_id == $cat['parent_id']) { $cat_list .= "<li>$cat[category]"; $cat_list = category_tree_list($cat['id'], $cat_list, $cat_array, $parent_ids); $cat_list .= "</li>"; } } $cat_list .= "</ul>"; } return $cat_list; }
৪। দ্বিতীয় ফাংশনের বর্ণনা:
এখন আমরা দ্বিতীয় ফাংশনটির মূল কয়েকটি পয়েন্ট নিয়ে আলোচনা করবো।
ক) লাইন ৪-১৮ এর কোডগুলো আমরা নিচের মতো করে সংক্ষিপ্ত করতে পারি। তবে সেক্ষেত্রে কোডগুলো ব্যবহারের উদ্দেশ্য বুঝতে একটু কষ্ট হতে পারে।
// For the first time, fetch categories from database // If DB has no category, then skip to the end if(empty($cat_array) && $cat_array = get_categories_from_db()) { // Extract Unique Parent IDs $parent_ids = array_column($cat_array, 'parent_id'); $parent_ids = array_unique($parent_ids); }
খ) লাইন ১৪-১৮: এখানে প্যারেন্ট আইডিগুলো আলাদা করা হয়েছে এবং ডুপ্লিকেট আইডিগুলো বাদ দেয়া হয়েছে, যা আমাদের পরের ধাপে কাজে লাগবে।
গ) লাইন ২২: এখানে একটি শর্ত ব্যবহার করা হয়েছে। এর মাধ্যমে সবশেষ ক্যাটাগরিগুলো, অর্থাৎ যেগুলো অন্য কোনো ক্যাটাগরির প্যারেন্ট নয় তাদের ক্ষেত্রে ফাংশনটি কন্টিনিউ করবে না। বিপরীতভাবে বলা যায়, শুধু প্যারেন্ট ক্যাটাগরির ক্ষেত্রেই ফাংশনটি কাজ চালিয়ে যাবে।
এখানে একটি বিষয় খুবই গুরুত্বপূর্ণ। আর তা হলো, অবশ্যই অপারেটর !==
ব্যবহার করতে হবে, !=
অপারেটর ব্যবহার করলে হবে না। কেননা আমরা সর্বোচ্চ ক্যাটাগরির ক্ষেত্রে প্যারেন্ট আইডি শূন্য (0
) ব্যবহার করেছি। অর্থাৎ সর্বোচ্চ ক্যাটাগরির ক্ষেত্রে $parent_id=0
হবে। এতে !=
অপারেটর ব্যবহার করে array_search(0, $parent_ids)
-এর সাথে তুলনা করলে ভুল/ফলস আউটপুট দিবে।
৫। আউটপুট:
উপরের ফাংশনের সাহায্যে যে HTML তৈরি হবে তা সাজালে (ফরম্যাট করলে) নিচের মতো হবে।
<ul class='cat-list'> <li> জীবজগৎ <ul class='sub-cat'> <li>উদ্ভিদজগৎ</li> <li> প্রাণিজগৎ <ul class='sub-cat'> <li>পশু</li> <li>পাখি</li> <li>মাছ</li> </ul> </li> </ul> </li> <li> জড়জগৎ <ul class='sub-cat'> <li>আসবাবপত্র</li> <li>পানি</li> <li>মাটি</li> </ul> </li> </ul>