PHP

چگونه یک وبلاگ شی گرا،بنویسیم؟!

تبلیغات
کانال تلگرام فتولیا
4 سوالی شهرداری

آشنایی بیشتر با مفهوم شی گرایی در برنامه نویسی وب بوسیله یک مثال جامع

سلام
این آموزش در مورد چگونگی ساخت یک وبلاگ ساده به صورت برنامه نویسی شی گرا(Object Oriented Programming) همان OOP بحث می کنه.فکر کنم به درد دوستان زیادی بخوره(اول از همه خودم) به همین خاطر ترجمه می شه.امیدوارم استفاده کنید.در ضمن پیشنهاد می کنم گام به گام با مطلب همراه شوید و کدها رو خودتون بنویسید.کد کمی دارد این مقاله.
برای شروع این مقاله ما فرض می کنیم که شما اطلاعات اولیه ای در مورد PHP،MySQL و XHTML دارید.

بخش اول ) ایجاد پایگاه داده

قبل از اینکه برای ایجاد database مان به سراغ MySQL برویم،باید بدانیم که در وبلاگ مان دنبال چه چیز هستیم.چیزی که واضح است باید نگهداری کنیم،پست های وبلاگ است.هر پست باید دارای یک عنوان(title)،متن پست(post body)،یک نویسنده(author) و تاریخی(date) باشد که در آن ارسال شده است.

حالا ما می توانیم جدولی برای نگهداری اطلاعات فوق ایجاد کنیم که احتمالا برای یک وبلاگ ساده کفایت می کند.اما فقط با یک جدول ما نخواهیم توانست کنترل زیادی روی داده هایمان داشته باشیم.به عنوان مثال ما فقط می توانیم نام نویسنده ی پست را در جدول فوق ذخیره کنیم.اما فرض کنید ما خواستیم email نویسنده را نیز ذخیره کنیم؟
مطمئنا باید فیلد دیگری اضافه کنیم.یا اگر خواستیم وبسایت نویسنده را نیز اضافه کنیم ،پس یک فیلد دیگر… .

در این صورت مشکل هنگامی پیش خواهد آمد که شما می خواهید آدرس ایمیل نویسنده را عوض کنید.آنگاه باید یک به یک پست ها را ویرایش کنید و فیلد آدرس ایمیل نویسنده را تغییر دهید.حالا به نظر شما چکار کنیم؟

بنابراین ما می رویم تا یک جدول جدا با نام “People” ایجاد کنیم و تمام اطلاعات مربوط نویسنده ی پست از قبیل:ایمیل،وبسایت،نام و یک شماره ی یکتا(Unique ID) را در آن ذخیره کنیم.آنگاه در جدول پست ها ،بوسیله ی این شماره ی یکتا،اطلاعات لازم در مورد نویسنده را استخراج خواهیم کرد.این شماره ی یکتا در واقع یک کلید خارجی است و ارتباط بین دو جدول پست ها(blog_posts) و نویسنده (people) را برقرار می کند که به آن ارتباط یک به چند می گویند.

چیز دیگری که ما برای وب لاگ مان نیاز داریم،یک تگ(tag) است برای هر پست وبلاگ.دوباره می خواهیم پایگاه داده مان را کارامد تر کنیم.بنابراین یک جدول جدا برای تگها خواهیم ساخت.حالا چه کنیم؟آیا باید یک فیلد در جدول پست ها بسازیم تا به عنوان یک کلید خارجی(foreign key) برای تگ ،از آن استفاده کنیم؟مشکلی که در استفاده از ارتباط یک به یک وجود دارد در مواقعی است که پست ما بیش از یک تگ دارد.بنابراین دگربار،از ارتباط یک به چند استفاده می کنیم.برای انجام این کار ما نیاز داریم یک جدول دیگر با نام مثلا “blog_post_tags” ایجاد کنیم که دو کلید خارجی را نگهداری کند.یکی شماره ی یکتای پست خواهد بود و دیگری شماره ی یکتای تگ که به پست پیوند خورده است.بدین طریق ما می توانیم تگ های بسیاری را برای پستی تعیین کنیم و همیشه قادر خواهیم بود اطلاعات یک تگ را تغییر دهیم تا در تمام پست ها این تغییر اعمال شود.

حالا که طرح ریزی کلی database را انجام دادیم،اجازه دهید آن را ایجاد کنیم.ما از PhpMyAdmin به این منظور استفاده می کنیم چون از آن به صورت بسیار گسترده ای به عنوان رابط مدیریت MySQL استفاده می شود.در اینجا قراردادهای نامگذاری مختلفی وجود دارند که شما می توانید در هنگام ایجاد پایگاه داده،نام جداول و فیلدها استفاده کنید.بنده شخصا دوست دارم که از حروف کوچک استفاده کنم و برای فاصله ها نیز از خط تیره ی زیرین بهره ببرم.

نکته:اگر شما PHP و MySQL یا سروری روی رایانه ی خود ندارید تا اجرا کنید،پیشنهاد می کنم از برنامه هایی استفاده کنید که به تنهایی Apache,PHP و MySQL را روی رایانه ی شما نصب و تنظیم می کنند.MAMP برای رایانه های Mac توصیه می شود و WAMP هم برای ویندوز عالیست.

اول ما نیاز به ایجاد پایگاه داده مان داریم،من آن را “nettuts_blog” نامیدم.

سپس جداول را می سازیم.اول جدول “blog_posts”.

جدول “blog_posts” پنج فیلد دارد:”author_id”, “post”,”title”,”id” و “date_posted”.برای “id”،آن را به صورت PRIMARY KEY و auto_increment می سازیم.چون می خواهیم id یکتا را خود به خود برای ما بسازد.هرگاه که ما پست جدیدی اضافه کنیم،این شماره خود به خود یکی اضافه می شود و به پست جدید تعلق می گیرد.

حالا ما باید نوع فیلد ها را تنظیم کنیم.نوع فیلد “id” را int تعیین می کنیم و حداکثر طول آنرا ۱۱ در نظر می گیریم.نوع فیلد “title” را varchar و حداکثر طول آنرا ۲۵۵ تعیین می کنیم.فیلد “post” را از نوع text می کنیم و محدودیتی در طولش قرار نمی دهیم،چون ممکن است بسیار طولانی باشند.”author_id” هم مانند “id” است ولی انرا primary key و auto_increment kld نمی کنیم و نوع فیلد “date_posted” را date تعیین می کنیم.

جدول بعدی ما “people” است.به این دلیل این جدول را “authors” نامگذاری نکردیم که شما ممکن است در آینده بخواهید قابلیت ثبت نام و ارسال نظرات را اضافه کنید و از این جدول استفاده کنید.چون آنها نویسنده به شمار نمی آیند نام آنرا “people” گذاشتیم.

این جدول ،پنج فیلد دارد:”url”,”last_name”,”first_name”,”id” و “email”.

نوع “id” را int تعیین می کنیم.بعد هم primary key , auto_increment.مثل فیلد “id” جدول پست ها.
بقیه ی فیلد ها را از نوع varchar و حداکثر ظرفیت شان را ۲۵۵ تعیین می کنیم.

جدول بعدی ،”tags” است که فعلا دو فیلد دارد:”id” و “name”.ما می توانستیم با اضافه کردن یک فیلد توضیحات،جدول را پیچیده تر کنیم ولی فعلا برای این آموزش ساده لازم نیست.مانند قبل فیلد “id” را از نوع int می کنیم و به عنوان کلید اولیه(primary key) و عدد یکتا(auto_increment) تعیین می کنیم.”name” هم از نوع varchar ودارای حداکثر طول ۲۵۵ خواهد بود.

و آخرین جدول ما “blog_post_tags” خواهد بود که فقط دو فیلد دارد:”blog_post_id” و “tag_id”.نوع هردو را Int و با طول ۱۱ در نظر می گیریم.احتمالا متوجه شدید که ما برای این جدول primary key در نظر نگرفتیم.به این دلیل که ما هیچ وقت داده ای را از جدول نخواهیم گرفت مگر اینکه شماره ی تگ بخصوصی را برای یک پست یا تمام پست ها درخواست کنیم.

(اگر در ساختن ساختار پایگاه داده و جداول مشکل دارید نگران نباشید،فایل sql مورد نیاز برای ساختن کل database در فایل پیوستی موجود است)

بخش دوم ) ساختن شیء (object) در PHP

قبل از اینکه کد نویسی واقعی را با PHP شروع کنیم،نیاز به آن داریم تا فایل ها و پوشه هایمان را ایجاد کنیم،برای این مقاله ما index.php را در پوشه ی اصلی خواهیم داشت.پوشه ی includes که حاوی فایلهای CSS,Javascript و فایل includes.php و blogpost.php خواهد بود.فایل includes.php ،منابع اشیا و اتصال به MySQL را نگهداری می کند و فایل blogpost.php شیء BlogPost را در خود خواهد داشت.

حالا با داشتن database ،نیاز به یک شیء داریم تا داده ها را برای ما هندل کند.اشیاء در برنامه نویسی راهی هستند برای چیدن صفات(مانند متغیرها) و متدها در کنار یکدیگر که مربوط به یک شی باشند.شی ها همچنین به ما در سازماندهی هرچه راحتتر برنامه کمک می کنند.قبل از اینکه به سراغ ساختن اشیا وبلاگ مان برویم،اجازه بدهید یک شی ساده بسازیم .

شی ما “دوچرخه” نام دارد.هر شی(Object) دو نوع چیز در خود دارد:properties and methods(خاصیت و متد).Properties شی را تعریف می کند و methods چگونگی رفتار شی را.به عنوان مثال شی دوچرخه ی ما می توانست خاصیت هایی بنام اندازه ی چرخ،تعداد دنده و شاید سایز تنه داشته باشد.برای متد ها می توانیم چیزی مثل پدال داشته باشیم.

حالا برگردیم سراغ وبلاگ.ما فعلا به یک شی بنام “BlogPost” نیاز داریم.BlogPost شش خاصیت خواهد داشت.
id, title, post, author, tags و date.پس می رویم که با PHP عزیز آن را بسازیم.

برای تعریف کردن کردن یک شی در PHP ،ما آن را به صورت کلاس(class) تعریف می کنیم.یک کلاس ،ساختار هر شی است .حالا می رویم تا صفحه ی blogpost.php را باز کنیم و اولین شی را تعریف کنیم.

نکته:در هر بخش این آموزش،ما تگ های شروع و پایان PHP را قرار نداده ایم.”php؟>” و “<؟” .ولی شما نیاز است در اول و آخر هر صفحه آن را قرار دهید.

در کلاسمان اول خاصیت ها(properties) را تعریف می کنیم.برای این کار باید متغیر ها(variables) را ایجاد کنیم اما با کلمه ی “public” در ابتدای آنها.فقط در این جا یک نکته ی کوچک وجود دارد و آن اینست که اگر از PHP نسخه ی ۴ استفاده می کنید،باید به جای “public” از “var” استفاده کنید.

حالا که تمام خاصیت های ما ایجاد شده است،می توانیم اولین متد را تعریف کنیم.متد ها شبیه توابع(functions) هستند ولی تفاوت اصلی متد با تابع در این است که متد در داخل یک شی تعریف می شود.بنابراین تمام متد ها را می توان جزو توابع به حساب آورد ولی تمام توابع،متد نیستند.

اولین متد ما یک متد سازنده(constructor) نام دارد.این متد به صورت خودکار،هر زمان که شما نمونه ی جدیدی از شی BlogPost بسازید،فراخوانی می شود.

از متد سازنده در مواقعی استفاده می شود که شما می خواهید خاصیت ها را به سادگی تنظیم کنید.

بنابراین حالا یک متد جدید با نام ()construct__ می سازیم و پنج مقدار را به آن پاس می دهیم.id, title, post, author id, و date.برای هر متغیر ما یک “in” در ابتدای نامش قرار دادیم تا در داخل تابع بتوان به راحتی تشخیص داد که کدام متغیر به تابع پاس داده شده و کدام متغیر قبلا موجود بوده است.

مشکلی که در کد فعلی وجود دارد این است که هر موقع که یک نمونه ی جدید از شی BlogPost بسازیم باید خاصیت های فوق را برایش تدارک ببینیم و بفرستیم.اما وقتی می خواهیم یک پست جدید ایجاد کنیم و هنوز اینها موجود نیستند،چکار کنیم؟برای حل این مشکل ما باید آرگومنت های تابع را “overload” کنیم.چنانچه اگر تابع را فراخوانی کنیم و یکی از آرگومنت ها را پاس ندهیم،به صورت خودکار مقدار پیش فرض به تابع داده شود.

همانطور که می بینید،برای انجام این کار مقدار هر یک از آرگومنت ها را “null” قرار دادیم.حالا در داخل متد سازنده،ما مقدار هر یک از متغیر ها را با مقدار آرگومنت پاس داده شده با تابع ست می کنیم.برای این کار در اول خاصیت از کلمه ی رزرو شده ی “this” استفاده می کنیم.بر خلاف دیگر زبانهای برنامه نویسی،در PHP برای دسترسی به خاصیت ها از “<-” استفاد می شود.در زبانهای دیگر مثل javascript یا asp.net از “.” برای این کار استفاده می شود.

کد فوق برای id, title, و post درست عمل می کند.ولی پس آن یکی ها چه؟!.برای date باید تاریخی را که از MySQL می گیریم،برای خوانایی بیشتر تغییر فرم دهیم.فقط آن را تکه تکه می کنیم و پشت هم می چینیم.MySQL آن را در این قالب yyyy-mm-dd به ما می دهد.بنابراین ما برای تکه تکه کردن آن،از “-” به عنوان جدا کننده استفاده می کنیم و سپس آرایه ای با ۳ مقدار خواهیم داشت.اولین مقدار همان سال ماست،دومی ماه و سومی هم روز را در خود دارد.حالا هر طور که خواستیم آنها را کنار هم قرار می دهیم.من به صورت mm/dd/yyyy این کار را کردم.

برای نویسنده، ما می توانیم اطلاعات آن را از پایگاه داده بوسیله ی شماره ی یکتایش بگیریم.برای این کار،پرس و جوی ساده ی پایین را انجام می دهیم.

Left Join

حالا با رسیدن به تگ ها،اوضاع کمی سختتر می شود.ما نیاز به مذاکره با پایگاه داده داریم.بنابراین یک پرس و جوی MySQL ایجاد می کنیم.فعلا در مورد نحوه ی اتصال به پایگاه داده نگران نباشید زیرا در آینده در یک فایل جدا این کار را خواهیم کرد.حالا تمام چیزی که ما داریم،شماره ی یکتا(از این پس با نام id) هست.ما می توانیم تگ های پست ها را در جدول blog_post_tags مقایسه کنیم،ولی آنگاه فقط شماره ی تگ ها را خواهیم داشت وبرای گرفتن اطلاعات تگ باید یک کوئری دیگر هم اجرا کنیم یعنی دو کوئری و این اصلا خوب نیست.چون می خواهیم برنامه ی کارامدی داشته باشیم،اجازه دهید تمام این ها را در یک پرسو جو خلاصه کنیم.

برای انجام این کار باید ببینیم که left join چگونه عمل می کند.ما می رویم سراغ انتخاب داده ها از یک جدول دیگر،اما فقط وقتی که داده ها از چپ “left” با داده های انتخابی ما مطابقت داشته باشند.بنابراین اول تمام id تگ هایی را که به id پست ها ی وبلاگ نسبت داده شده اند را از جدول blog_post_tags می گیریم.

حالا left join را اضافه می کنیم و پرس و جو را ایجاد می کنیم.

بنابراین حالا پرسو جوی ما تمام چیزها را از جدول blog_posts_tags و tags انتخاب می کند،جایی که blog_post_tags.blog_post_id مساوی با $inId باشد.آنگاه اطلاعات هر تگی را که فیلد tag_id یکسان با blog_post_id باشد ،بر می گرداند.

حالا می خواهیم داده ها را با یک حلقه ی کوچک while پردازش کنیم.همچنین دو آرایه برای نگهداری داده ها ایجاد می کنیم:یکی برای نام تگ و دیگری برای id تگ به علاوه ی یک متغیر رشته ای برای ذخیره ی تمام تگ های پست در آن.امکان دارد پستی دارای تگ نباشد،بنابراین مقدار اولیه ی آن را “No Tags” می کنیم.

حالا ابتدا چک می کنیم که طول آرایه بزرگتر از صفر باشد،سپس نام تگ ها را یکی یکی به متغیر $postTags اضافه می کنیم.برای این کار از یک ساختار ساده ی if else استفاده کرده ایم.

شاید شما بگویید که ما از آرایه ی $tagIDArray استفاده نکردیم.فعلا آن را تنها می گذاریم و بعدا سراغش بر می گردیم.اولویت اول ما ایجاد و اجرای وبلاگ است.

قدم بعدی ما برای کلاس مان،اضافه کردن ساختار if برای هر خاصیت است چون احتمال دارد مقدار پاس داده شده ی ما به تابع،خالی باشد.این باعث می شود که خاصیت های ما با خالی مقدار دهی نشوند زیرا باعث ایجاد خطا می شود.در پایین کد کلاس BlogPost به اضافه ی if های اضافه شده،آمده است.

حالا کلاس وبلاگ کامل شد و میشود گفت بخش سخت کار به اتمام رسیده است و می توانیم اتصال به پایگاه داده و HTML برای نمایش پست ها را برپا کنیم.

بخش سوم ) گرفتن داده ها از MySQL و پردازش آنها با php

قبل از هرچیز،فایل includes.php را به عنوان یک مرجع و اتصال دهنده به پایگاه داده برای شی BlogPost ایجاد می کنیم.اول اجازه دهید شی را include کنیم.

حالا اتصال پایگاه داده را اضافه می کنیم.

سپس،نیاز به دریافت پست های وبلاگ از پایگاه داده داریم.برای این کار یک تابع می سازیم(در همین فایل) که دو آرگومنت ورودی دارد و هر دوی انها را overload می کنیم.بنابراین شما می توانید تابع را با یکی از ۲ آرگومنت یا هر دو فراخوانی کنید.

در داخل تابع ،چک می کنیم که کدام یک از آرگومنت ها پاس داده شده اند(دارای مقدار غیر از null هستند) و بر طبق آن پرس و جوی MySQL را ایجاد می کنیم.

دلیل اینکه ما از تابع empty به جای “null= !” استفاده می کنیم این است که empty فقط خالی بودن متغیر را چک نمی کند،مگر آنکه آن کاملا خالی باشد (مثل “”).حالا ما یک پرس و جو با توجه به متغیرهایی که داریم ایجاد می کنیم.اگر ما id یک پست را به تابع پاس دهیم(inId)، یعنی فقط می خواهیم یک پست را نشان دهیم.اگر آرگومنت inTagId را به تابع بدهیم،یعنی تمام پست هایی را که دارای این تگ هستند را نشان بده.در غیر این صورت ،تمام پست های وبلاگ نمایش داده می شود.

قدم بعدی برای پردازش داده هایی که توسط هر پرس و جو برگردانده شده اند،این است که یک نمونه از شی را ایجاد می کنیم و پارامترهای لازم را به آن پاس می دهیم و آن را برای برگشت داده(return) داده ها،در یک آرایه قرار می دهیم.(وقتی شما پارامتر ها را به این صورت به نام کلاس می دهید،تابع constract اجرا می شود).

کد کامل فایل includes.php در زیر آمده است.

حالا می توانیم بخش جذاب نمایش داده ها را شروع کنیم.با اجازه ی شما فایل index.php را باز می کنیم تا یک صفحه ی ساده ی HTML را ایجاد کنیم.در داخل بدنه(body) یک div با آیدی “main” ایجاد می کنیم که محتوی کل وبلاگ ما خواهد بود.سپس یک بخش برای عنوان وبلاگ اضافه می کنیم و در آخر دومین div را داخل div اول،ایجاد می کنیم و آن را “blogPosts” نامگذاری می کنیم.

داخل بخش blogPosts کمی PHP تزریق می کنیم تا جان بگیرد و تمام پست های ما را نشان دهد.پس اول فایل includes.php را include می کنیم بعد تابع GetBlogPosts را بدون هیچ آرگومنتی فراخوانی می کنیم تا تمام پست ها را به ما بدهد بعد نتایج را در یک متغیر آرایه بنام blogPosts قرار می دهیم.

حالا می توانیم پست ها را با یک حلقه ی foreach نشان دهیم.کاری که حلقه ی foreach برای ما انجام می دهد این است که یک آرایه می گیرد(blogPosts) و کدهای داخل حلقه را برای هر آیتم(post) اجرا می کند.شما همچنین باید از یک آرایه ی normal برای درست کار کردن این حلقه استفاده کنید ولی مزیت foreach این است که به کدنویسی کمتری نیاز دارد.

در داخل حلقه،از post$ به عنوان آیتم کنونی آرایه استفاده کردیم و چون blogPosts$ آرایه ای از شی BlogPosts است،ما به راحتی می توانیم با “<-” به هر خاصیتی از آن دست یابیم.حالا اجازه بدید با echo عنوان هر پست شروع کنیم-برای تست و مثال

اگر ما سراغ پایگاه داده برویم و یک سری اطلاعات آزمایشی وارد کنیم،با رفتن به صفحه ی index.php ،چیزی شبیه شکل زیر را خواهیم دید.

demo

و حالا HTML واقعی را نشان شان می دهیم.هر پست داخل یک div با کلاس “post” محدود می شود.سپس عنوان پست مان را داخل تگ h1 قرار می دهیم(بخشی از SEO) و بدنه ی پست هم مهمان تگ <p> خواهد بود.

نیز برای هر پست یک footer در نظر می گیریم که شامل:نویسنده ی پست،تاریخ ارسال و تگ هایش می شود و تمام اینها را در یک تگ span با کلاس “footer” قرار می دهیم.

حالا اگر دوباره صفحه ی index.php را باز کنید،چیزی شبیه زیر می بینید.

demo

اگر آن را دیدید یعنی تمام کار درست انجام شده است و تبریک.می توانید کمی هم CSS برای زیبایی اضافه کنید.

demo

مشاهده ی دمو

منبع

——
در زیر می تونید کدها رو یکجا دانلود کنید.امیدوارم مورد استفاده تون قرار بگیره.

3 Comments

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *