مدیر کتابخانهی شهر کدنشینها دستور داده است تا از این پس مدیریت کتابهای موجود در کتابخانه توسط یک سیستم برخط صورت گیرد. قرار بود که یکی از شهروندان شهر کدنشینها این سیستم را طراحی کند، اما ظاهر این سیستم آنقدر پیچیده بهنظرشان آمد که همهی آنها در حین پیادهسازی این پروژه آن را ترک کردند! اکنون از شما میخواهیم تا بخشی از این سیستم را پیادهسازی کنید.
ساختار پروژه
پروژهی اولیه را از اینجا دانلود کنید.
پایگاه داده
قرار است در این پروژه از پایگاه دادهی MySQL استفاده شود. سه جدول با مشخصات زیر از قبل طراحی شدهاند و شامل سطرهایی بهعنوان مقادیر اولیه هستند:
- جدول کتابها (
books
):
نام ستون | نوع | توضیح | ملاحظات |
---|---|---|---|
id |
INT(11) |
شناسهی کتاب | UNSIGNED AUTO_INCREMENT PRIMARY KEY |
name |
VARCHAR(255) |
عنوان کتاب | NOT NULL |
author_id |
INT(11) |
شناسهی نویسندهی کتاب | UNSIGNED NOT NULL |
publisher_id |
INT(11) |
شناسهی ناشر کتاب | UNSIGNED NOT NULL |
quantity |
INT(11) |
موجودی کتاب | UNSIGNED NOT NULL |
- جدول نویسندگان (
authors
):
نام ستون | نوع | توضیح | ملاحظات |
---|---|---|---|
id |
INT(11) |
شناسهی نویسنده | UNSIGNED AUTO_INCREMENT PRIMARY KEY |
name |
VARCHAR(255) |
نام نویسنده | NOT NULL |
- جدول ناشران (
publishers
):
نام ستون | نوع | توضیح | ملاحظات |
---|---|---|---|
id |
INT(11) |
شناسهی ناشر | UNSIGNED AUTO_INCREMENT PRIMARY KEY |
name |
VARCHAR(255) |
نام ناشر | NOT NULL |
دسترسی به پایگاه داده از طریق نمونهای از کلاس PDO
صورت میگیرد. این نمونه از طریق کلید DB
توسط کلاس Base
قابل دسترسی است:
$db = Base::getInstance()->get('DB');
فایل موردنیاز برای ساخت جدولها را میتوانید از اینجا دانلود کنید.
آدرسدهی
در این پروژه، همهی درخواستها به فایل index.php
ارسال میشوند و متد مناسب از یک کنترلر بر اساس URL
صدا زده میشود. چندین route از قبل در پروژه تعریف شدهاند که بهشرح زیر هستند:
GET /
: صفحهی پیشخوانGET /books
: صفحهی لیست کتابهاGET /books/add
: فرم افزودن کتابGET /books/reserve/:id
: رزرو کردن کتابGET /books/unreserve/:id
: افزودن موجودی کتابGET /books/delete/:id
: حذف کتابGET /authors
: صفحهی لیست نویسندگانGET /publishers
: صفحهی لیست ناشران
تابعی با نام redirect
در پروژه تعریف شده است که با استفاده از آن کاربری را به آدرس موردنظر هدایت کرد. مثال:
redirect('/books');
پیادهسازی
کلاس Flash
از این کلاس برای نمایش پیغام به کاربر پس از هدایت شدن به صفحات دیگر استفاده میشود. متدهای این کلاس را مطابق موارد زیر پیادهسازی کنید:
set($type, $message)
: پیامی با محتوای$message
از نوع$type
(که بهصورت رشته است) را در session کاربر ذخیره میکند.get()
: پیام ذخیرهشده در session کاربر را بهصورت یک آرایهی انجمنی برمیگرداند. هر پیام فقط یک بار پس از redirect شدن کاربر به سایر صفحات نمایش داده میشود. در صورتی که پیامی ذخیره نشده بود، این متد باید مقدارNULL
را برگرداند. نمونهای از خروجی این متد:
[
'type' => 'success',
'message' => 'کتاب با موفقیت افزوده شد!'
]
مدلها
سه مدل در قالب سه کلاس در دایرکتوری app/Models
موجود هستند که باید متدهای درون آنها را پیادهسازی کنید. همهی این مدلها از کلاس Model
ارثبری میکنند و میتوان فیلدهای آنها را از طریق یک آرایهی انجمنی در constructor آنها مقداردهی کرد. این مدلها و متدهای موردنیاز هر کدام بهشرح زیر هستند:
- مدل
Book
:- فیلدها:
id
: شناسهی کتاب (از نوع عدد)name
: نام کتاب (از نوع رشته)author
: نویسندهی کتاب (از نوع آبجکتی از مدلAuthor
)publisher
: ناشر کتاب (از نوع آبجکتی از مدلPublisher
)quantity
: موجودی کتاب (از نوع عدد صحیح)
- متدها:
all()
: همهی کتابهای موجود در جدولbooks
را در قالب آرایهای از آبجکتهای مدلBook
برمیگرداند.count()
: تعداد همهی کتابها (صرفنظر از موجودیشان) را برمیگرداند.find($id
: کتابی که شناسهی آن برابر با مقدار$id
است را برمیگرداند. در صورتی که چنین کتابی موجود نباشد، باید یک Exception با پیغامBook not found
پرتاب شود.save()
: تغییرات مشخصات کتاب را در جدول ذخیره میکند. تضمین میشود که شناسهی کتاب، شناسهی نویسنده و شناسهی ناشر از قبل موجود است.delete()
: کتابی که شناسهی آن با شناسهی کتاب فعلی برابر است را از جدول حذف میکند. در صورتی که چنین کتابی در جدول موجود نباشد، نباید تغییری صورت گیرد.
- فیلدها:
- مدل
Author
:- فیلدها:
id
: شناسهی نویسنده (از نوع عدد)name
: نام نویسنده (از نوع رشته)books_count
: تعداد کتابهای متمایز از این نویسنده (از نوع عدد صحیح)
- متدها:
all()
: همهی نویسندگان موجود در جدولauthors
که حداقل یک کتاب از آنها در لیست کتابها موجود است را در قالب آرایهای از آبجکتهای مدلAuthor
برمیگرداند.count()
: تعداد همهی نویسندگانی که حداقل یک کتاب از آنها در لیست کتابهای کتابخانه موجود است را برمیگرداند.
- فیلدها:
- مدل
Publisher
:- فیلدها:
id
: شناسهی ناشر (از نوع عدد)name
: نام ناشر (از نوع رشته)books_count
: تعداد کتابهای متمایز از این ناشر (از نوع عدد صحیح)
- متدها:
all()
: همهی ناشران موجود در جدولpublishers
که حداقل یک کتاب از آنها در لیست کتابها موجود است را در قالب آرایهای از آبجکتهای مدلPublisher
برمیگرداند.count()
: تعداد همهی ناشرانی که حداقل یک کتاب از آنها در لیست کتابهای کتابخانه موجود است را برمیگرداند.
- فیلدها:
کنترلرها
کنترلرها وظیفهی دریافت اطلاعات از مدلها، پردازش آنها و ارسال نتایج به viewها را دارند. چهار کنترلر در قالب چهار کلاس در این پروژه موجود هستند که خوشبختانه سه کنترلر از قبل بهطور کامل پیادهسازی شدهاند. متد add
از کنترلر BooksController
را مطابق موارد زیر پیادهسازی کنید:
این متد زمانی فراخوانی میشود که متد درخواست POST باشد. اطلاعات زیر از طریق $_POST
قابل دسترسی خواهند بود:
name
: نام کتابauthor
: نام نویسندهی کتابpublisher
: نام ناشر کتاب
اگر حداقل یکی از فیلدهای بالا خالی باشند، باید پیغامی از نوع danger
و با محتوای همهی اطلاعات باید وارد شوند.
در session کاربر ذخیره شده و کاربر به آدرس /books/add
هدایت شود.
در صورت مقداردهی شدن همهی فیلدها، کتابی با اطلاعات ورودی در جدول books
با موجودی اولیهی 1
درج کنید. اگر نام نویسندهی کتاب یا نام ناشر کتاب از قبل در جدول authors
یا publishers
موجود باشند، این مقادیر نباید مجدداً به این جداول اضافه شوند و باید از شناسهی قبلی آنها برای درج استفاده شود. پس از درج اطلاعات، باید پیغامی از نوع success
و با محتوای کتاب با موفقیت افزوده شد!
در session کاربر ذخیره شده و کاربر به آدرس /books
هدایت شود.
نمایی از صفحهی اصلی پروژه:
نمایی از صفحهی لیست کتابها:
آنچه باید آپلود کنید
فایلها و فولدرهای زیر را بدون تغییر در ساختار فولدربندی بهصورت یک فایل Zip ارسال کنید. از سایر فایلها صرفنظر خواهد شد:
app
│
├───Controllers
│ BooksController.php
│
├───helpers
│ Flash.php
│
└───Models
Author.php
Book.php
Publisher.php
ارسال پاسخ برای این سؤال