در این پست قصد دارم نکاتی کلی در مورد ساختار یک ماژول در اپن کارت را برای شما بنویسم . امیدوارم مفید باشه.
ماژول های اپن کارت معمولا دارای دو بخش هستند ، یک بخش در سمت مدیریت قرار دارد و یک بخش در سمت کاتالوگ . منظور از کاتالوگ بخشی از سایت است که توسط بازدید کنندگان مشاهده می شود.
هر کدام از دو بخش مدیریت و کاتالوگ دارای 4 قسمت با نام های
1-controller
2-language
3-model
4-view
هستند. هر کدام از این بخش ها وظایفی دارند که در ادامه به شرح مختصر انها می پردازم.
بخش view نمایش دادن اطلاعات و هر آنچه که از سایت مشاهده می کنم را بر عهده دارد همچنین ظاهر و قالب و چیدمان بخش های سایت و تنظیمات CSS در این بخش انجام می شود. این بخش واسط بین کاربری که سایت را مشاهده می کند و کارهایی را در سایت انجام می دهد مثلا ثبت نام می کند یا یک محصول را به سبد خرید اضافه می کند با بخش controller است. اطلاعات و کارهایی را که کاربر در سایت انجام می دهد توسط بخش view به کنترلر ارسال می شود. در کنترلر اطلاعات ارسال شده مورد بررسی و اعتبار سنجی قرار می گیرد و در صورت کامل بودن و بدون نقص بودن اطلاعات ممکن است به بخش مدل ارسال شود. بنابراین بخش کنترلر در اپن کارت وظیفه کنترل کردن اطلاعات را دارد. بخش مدل با دیتا بیس سر و کار دارد یعنی اطلاعات ارسال شده ار بخش کنترلر را می تواند در دیتابیس سایت ذخیره کند و یا اطلاعات در خواست شده ار بخش کنترلر را از دیتابیس بگیرد و برای کنترلر ارسال کند.
بنابراین بخش کنترلر وظیفه کنترل اطلاعات ارسال شده یا درخواست شده از view و ایجاد ارتباط بین view و مدل را بر عهده دارد. مثلا ممکن است اطلاعاتی در مورد یک محصول در بخش view نیاز به نمایش داده شدن باشد، در این صورت بخش view به کنترلر مراجعه می کند و کترولر هم به بخش مدل و به این ترتیب اطلاعت فراهم می شود.
در مورد بخش language هم باید گفت که این بخش به این دلیل در این ساختار گنجانده شده است که ممکن است این سیستم بخواهد در کشور های مختلف با زبان های مختلف نصب و راه اندازی بشود. این بخش کمک می کند که برای هر زبانی بتوان سیستم اپن کارت را راه اندازی کرد. بخش عمده ای از نوشته ها را که در قسمت view نمایش داده می شود از این بخش توسط کنترلر فراخوانی می شود، یعنی بخش ویوو از کنترلر درخواست نوشته مربوط به هر بخش را می کند و کنترلر با توجه به تنظیمات زبان انجام شده نوشته ها ی مربوط به ان بخش را فراخوانی می کند.
اموزش برنامه نویسی ماژول lastest اپن کارت بخش اول
catalog/contrlooer/module/lastest.php
را برای شما تشریح کنم. این فایل با فایل های موجود در مسیر
catalog/view/theme/default/template/module/lastest.tpl
و
catalog/model/module/lastest.php
و
catalog/language/english/module/lastest.php
ارتباط دارد و توجه کنید که این ماژول در بخش کاتالوگ فایل مدل(model) ندارد و از فایل های مدل موجود استفاده می کند.
دوستانی که این مطلب را مطالعه می کنند لازم است با کد ها و برنامه نویسی php تا حدودی اشنایی داشته باشند . در اینجا فقط ساختار استفاده از انها در اپن کارت گفته می شود و خود زبان php اموزش داده نمی شود.
ابتدا بگم که معمولا فایل ماژول های غیر پیچیده در فولدر module قرار دارند، اما برخی از ماژول ها که پیچیده هستند ممکن است فایل هایی بیرون فولدر module هم داشته باشند.
در ضمن فایلی را که می خواهم توضیح بدهم مربوط به اپن کارت ورژن 2.2 است.
در خط دوم کد فایل کنترلر کد زیر وجود دارد
class ControllerModuleLatest extends Controller {
در همه فایل های کنترلر بعد از کلمه class یک عبارت قرار میگیرد که این عبارت مسیری است که فایل در ان قرار دارد و بعد از ان نام فایل بدون پسوند نوشته می شود.
در اینجا فایل ما در مسیر
catalog/controller/module/lastest.php
قرار دارد و بنابر این بعد از کلمه کلاس controllermodulelastest نوشته می شود و پس از ان برای همه فایل های کنترلر کلمه extend controller قرار میگیرد.
با این دستور که در بالا ذکر شد یک کلاس با نام controllermodulelastest ساخته می شود که از ویژکی های کلاس کنترلر که قبلا وجود دارد گسترش می یابد.
در خط بعدی کد مشاهده می شود که
public function index() {
وجود دارد. در اینجا یک تابع زیر مجموعه کلاسی که در بالا تعریف کردیم تعریف می شود. کلمه فانکشن به معنی تابع و کلمه پابلیک به معنی عمومی است و کنار هم به معنی تابع عمومی است . بعد از کلمه فانکشن نام تابع اورده می شود. در صورتی که نام تابع index باشد با هر بار فراخوانی ماژول، به صورت خود کار تابع اندکس اجرا می شود و دستورات داخل ان را اجرا می کند. اما اگر نام تابع چیز دیگری باشد برای اجرای ان تابع باید نام ان صدا زده شود و به صورت خودکار اجرا نخواهد شد. در این فایل فقط تابع ایندکس وجود دارد و تابع دیگری مشاهده نمی شود.
در خط بعدی کد
$this->load->language('module/latest');
مشاهده می شود. توسط این دستور فایل lastest.php در مسیر
catalog/language/*/module
فراخوانده می شود. دستور load برای فراخوانی فایل های مورد نیاز استفاده می شود. بعد از load اگر به language اشاره شود به معنی فراخوانی فایل موجود در پوشه language است و اگر مثلا model نوشته شود به معنی فراخوانی فایل در فولدر model است . در اینجا پس از کلمه language داخل پردانتز مسیر فایل مورد نظر و نام فایل مورد نظر نوشته شده است. علامت * قرار داده شده در مسیر بالا به معنی این است که هر زبانی که فعال باشد می تواند جای ان قرار بگیرد . مثلا اگز زبان فارسی سایت فعال باشد جای ستاره عبارت persian قرار می گیرد.
در ادامه کد ها یی که بررسی کردیم به کد
$data['heading_title'] = $this->language->get('heading_title');
می رسیم. این کد از دو بخش تشکیل شده است . بخش اول سمت راست مساوی است و به این معنی است که از فایل زبانی که قبلا فراخوانی شده است با دستور
$this->load->language('module/latest');
مقدار متغیری را که با نام heading_title تعریف شده است را بگیر. اگر به فایل زبان در مسیر
catalog/language/persian/module/lastest.php
مراجعه کنیم خواهیم دید که نوشته شده است:
$_['heading_title'] = 'جديدترين ها';
در واقع با این دستور ، "جدیدترین ها" گرفته می شود. و در بخش دوم دستور(سمت چپ مساوی)
$data['heading_title']
ریخته می شود.
در مورد بخش دوم باید بگم که متغیر هایی که باید در بخش view سایت وجود دارد از طریق کنترلر مقدار انها فراهم می شود. به این صورت که مقدار انها در ارایه ای به نام
$data[]
ریخته می شود. و بعدا با یک دستور برای بخش view سایت ارسال می شود. اگر به بخش view این ماژول نگاهی بیندازیم در مسیر :
catalog/view/theme/default/template/module/lastest.tpl
مشاهده می کنیم که در خط اول ان نوشته شده است:
در واقع با این دستور بخش کنترلر مقدار یک متغیر را از فایل زبان می گیرد و برای بخش view ارسال می کند.
بنابراین هر متغیری که در بخش ویوو نیاز به مقدار داشته باشد باید مقدار ان در بخش کنترلر داخل ارایه
$data[]
که داخل براکت ها نام همان متغیر نوشته می شود ریخته شود.
در خط های بعدی فایل کنترلر دستور های
$data['text_tax'] = $this->language->get('text_tax');
$data['button_cart'] = $this->language->get('button_cart');
$data['button_wishlist'] = $this->language->get('button_wishlist');
$data['button_compare'] = $this->language->get('button_compare');
را مشاهده می کنیم که توضیحات ان مانند انچه ذکر شد است.
در ادامه 2 خط کد داریم که
$this->load->model('catalog/product');
$this->load->model('tool/image');
هستند . در این دو خط کد از دستور load استفاده شده است و کار این دستور قبلا مفصل شرح داده شده است. با این دو کد دو فایل به این ماژول ملحق می شود و ما می توانیم از کد های موجود در انها در این ماژول استفاده نماییم و نیازی به نوشتن مجدد آنها نیست . زیر این دو فایل در بدنه اصلی اپن کارت موجود است و صرفا برای این ماژول نوشته نشده اند. با این دو خط کد فایل های زیر به ماژول ما ملحق خواهند شد.
catalog/model/catalog/product.php
catalog/model/catalog/tool/image.php
از فایل اول برای فراخوانی جدید ترین محصولات استفاده خواهد شد و از فایل دوم برای تغییر اندازه تصاویر محصولات استفاده می شود.
در ادامه کد ها به
$data['products'] = array();
می رسیم. قبلا گفته ایم که هر نام متغیری که داخل
$data[]
قرار بگیرد به این معنی است که در بخش ویوو (view) حتما این متغیر فراخوانی شده است و در این فایل کنترلر مقدار دهی می شود. در این خط کد فقط تعریف می شود که متغیر products یک متغیر از نوع آرایه است . در خط های بعدی مقدار دهی آن صورت خواهد گرفت.
خط بعدی کد
$filter_data = array(
'sort' => 'p.date_added',
'order' => 'DESC',
'start' => 0,
'limit' => $setting['limit']
);
است . که یک متغیر از نوع ارایه به اسم
filter_data
تعریف می شود. و چهار مولفه ان مقدار دهی می شود. شکل مقدار دهی ها به گونه ای است که با کد خط بعدی که در ادامه به ان اشاره خواهم کرد بستگی دارد. و مربوط به دستورات sql و فایل های مدل می شود.
تنها نکته ای که وجود دارد این است که در خط جهارم مقدار دهی ارایه
'limit' => $setting['limit']
از متغیر setting استفاده شده است که این متغیر در هنگام اجرای تابع
public function index($setting){
برای این فایل ارسال شده است. و در اینجا و در جاهای دیگر مورد استفاده قرار خواهد گرفت.
کپی مطالب با ذکر منبع اشکال ندارد.
خط بعدی کد
$results = $this->model_catalog_product->getProducts($filter_data);
است. سمت راست مساوی می گوید که به مسیر
catalog/model/catalog/product.php
مراجعه شود و در ان فایل تابع
getProducts
را با مقدار اولیه که قبلا در متغیر
$filter_data
ریخته ایم اجرا کند و مقدار خروجی ان تابع را در متغیری که در سمت چپ مساوی است بریزد.
در این خط کد برای تعیین مسیر از اندرلاین (_) به جای اسلش (/) استفاده شده است و این یک قاعده است . و نیز برای اینکه بتوانیم به چنین مسیری برویم قبلا کد
$this->load->model('catalog/product');
را در این فایل تعریف کرده ایم. در صورتی که دستور load مربوطه تعریف نشود امکان دسترسی به تابعی در فایلی در جای دیگر نخواهد بود.
خروجی حاصل از اجرای تابع getProducts در متغیری به نام results ریخته می شود.
لطفا به فایل ذکر شده مراجعه کنید و در ان تابع getProducts را پیدا کنید و ان را بررسی کنید.
$results = $this->model_catalog_product->getProducts($filter_data);
رسیدیم که در مسیر
$this->load->model('catalog/product');
تابع
getProducts
را فراخوانی می کند. توسط این تابع تعدادی سطر از اطلاعات محصولات که با شرایط
$filter_data
همخوانی داشته باشند فراخوانی می شود در در متغیر
results
ریخته می شود.در خط بعدی به کد
if ($results) {
می رسیم. در این خط بررسی می شود که اگر متغیر
results
دارای مقدار باشد یک سری کار ها انجام شود که در ادامه بررسی می شود. در ادامه کد
foreach ($results as $result) {
وجود دارد. در این خط دستور foreach قرار دارد، توسط این دستور هر محصول( هر ردیف) موجود در متغیر results را در متغیر result می ریزد و یک سری کارها را روی ان انجام می دهد که در ادامه به بعضی از انها اشاره می شود. مثلا کد
if ($this->config->get('config_review_status')) {
$rating = $result['rating'];
} else {
$rating = false;
}
بررسی می کند که آیا امتیاز محصول نشان داده شود یا نه. در صورتی که جواب مثبت باشد مقدار
$result['rating']
در متغیر rating ریخته می شود و در غیر این صورت مقدار متغیر rating برابر false خواهد شد.
نکته ای که اینجا وجود دارد این است که تمام تنظیماتی که در بخش تنظیمات اپن کارت در قسمت ادمین انجام می دهیم در دیتابیس ان ذخیره می شود و توسط دستور
$this->config->get('نام_متغیر_تنظیمات');
قابل دسترسی است. که در اینجا مورد استفاده قرار گرفته است.
در خط بعدی کدهای
$data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get('config_product_description_length')) . '..',
'price' => $price,
'special' => $special,
'tax' => $tax,
'rating' => $rating,
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])
);
}
وجود دارد که انچه که از دیتا بیس فراخوانی شده برای هر محصول به صورت جداگانه در ارایه
$data['product'][]
ریخته می شود. بعضی از متغیر ها مستقیما از دیتا بیس به داخل این ارایه ریخته می شوند مانند دستور
'name' => $result['name'],
و بعضی دیگر پس از اعمال تغییراتی که کد انها در خط های بالاتر وجود دارد داخل این ارایه ریخته می شوند مانند:
'rating' => $rating,
یا
'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get('config_product_description_length')) . '..',
این دستوراتی که بعد از foreach گفته شد تا اینجا برای هر محصول تکرار می شود و خود foreach در صورتی که اجرا می شود که شرط داخل دستور if که بالای foreach قرار دارد مثبت باشد .
در ادامه دستور های
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/latest.tpl')) {
return $this->load->view($this->config->get('config_template') . '/template/module/latest.tpl', $data);
} else {
return $this->load->view('default/template/module/latest.tpl', $data);
}
وجود دارد. توسط این دستور ها بررسی شود که اگر فایل lastest.tpl در مسیر قالب فعال وجود دارد از انجا فراخوانی شود و اطلاعات ارایه data برای ان ارسال شود و در غیر این صورت فایل lastest.tpl از مسیر قالب default فراخوانی شود و ارایه data هم برای ان ارسال شود.
کپی مطالب با ذکر منبع اشکال ندارد.