• توجه: در صورتی که از کاربران قدیمی ایران انجمن هستید و امکان ورود به سایت را ندارید، میتوانید با آیدی altin_admin@ در تلگرام تماس حاصل نمایید.

آشنایی با برنامه نویسی Opencart

amin khan

مدیر انجمن
آموزش معماری OpenCart به روش MVC آشنایی با برنامه نویسی Opencart:

برای برنامه نویسی OpenCart از مدل MVC (Model-View-Controller) استفاده شده است. همانطور که مشخص است در فایل های OpenCart دو فولدر اصلی وجود دارند. یکی فولدر Admin است که فایل های قسمت ادمین سایت در آنها نگهداری می شود و دیگری فولدر Cataloge است که فایل های مخصوص فروشگاه در آن نگهداری می شود.
هر کدام از این دو فولدر خود شامل فولدر های Model,View,Controller می باشند. یک فولد دیگر نیز به نام language وجود دارد که در آن فایل های مخصوص زبان قرار دارند.



حال به این می پردازیم که در این سه فولدر چه مدل فایل هایی وجود دارند.

فولدر MODEL:

این فولدر خود شامل فولدر های متفاوتی است که به نام قسمت های مختلف سایت نام گذاری شده اند. در تمامی این فولدرها فایل هایی وجود دارند که همگی با زبان PHP نوشته شده اند و کار آنها ارتباط با دیتابیس است. پس هر گونه ارتباط با دیتابیس از قبیل درخواست اطلاعات، به روز رسانی و حذف و درج اطلاعات توسط این فایل ها صورت می گیرد.
برای مثال در فولدر localization و در فایل country.php ابتدا یک کلاس اکستند شده از Model به نام ModelLocalisationCountry ایجاد شده است که دارای دو تابع است. تابع getCountry ($Country_id) که با دریافت یک id تمام اطلاعات آن کشور را بر می گرداند و دیگری تابع getCountries() که اطلاعات تمامی کشورها را باز می گرداند.

کد:
[COLOR=#0000BB]<?php
[/COLOR][COLOR=#007700]class [/COLOR][COLOR=#0000BB]ModelLocalisationCountry [/COLOR][COLOR=#007700]extends [/COLOR][COLOR=#0000BB]Model [/COLOR][COLOR=#007700]{
    public function [/COLOR][COLOR=#0000BB]getCountry[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$country_id[/COLOR][COLOR=#007700]) {
        [/COLOR][COLOR=#0000BB]$query [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]db[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]query[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"SELECT * FROM " [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]DB_PREFIX [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#DD0000]"country WHERE country_id = '" [/COLOR][COLOR=#007700]. (int)[/COLOR][COLOR=#0000BB]$country_id [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#DD0000]"' AND status = '1'"[/COLOR][COLOR=#007700]);
        
        return [/COLOR][COLOR=#0000BB]$query[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]row[/COLOR][COLOR=#007700];
    }    
    
    public function [/COLOR][COLOR=#0000BB]getCountries[/COLOR][COLOR=#007700]() {
        [/COLOR][COLOR=#0000BB]$country_data [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]cache[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'country'[/COLOR][COLOR=#007700]);
        
        if (![/COLOR][COLOR=#0000BB]$country_data[/COLOR][COLOR=#007700]) {
            [/COLOR][COLOR=#0000BB]$query [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]db[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]query[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"SELECT * FROM " [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]DB_PREFIX [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#DD0000]"country WHERE status = '1' ORDER BY name ASC"[/COLOR][COLOR=#007700]);
    
            [/COLOR][COLOR=#0000BB]$country_data [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$query[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]rows[/COLOR][COLOR=#007700];
        
            [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]cache[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]set[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'country'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]$country_data[/COLOR][COLOR=#007700]);
        }

        return [/COLOR][COLOR=#0000BB]$country_data[/COLOR][COLOR=#007700];
    }
}
[/COLOR][COLOR=#0000BB]?>

[/COLOR]


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


فولدر View:

در فولدر View قالب های فروشگاه نگهداری می شوند. هر قالب به اسم یک فولدر در فولدری به نام theme قرار دارد. یک فولدر دیگر هم به نام javascript شامل تمامی اسکریپت های اصلی فروشگاه مثل jquery می شود.
در هر قالب سه فولدر اصلی وجود دارد. فولدر image که شامل تمامی تصاویر قالب وب سایت می شود. فولدر stylesheet که شامل کدهای css قالب می شود و اطلاعاتی مانند رنگ و سایز و نوع فونت و همچنین مدل چینش اجزا در صفحه را داراست.
و در انتها فولدر template که خود شامل فولدر هایی به نام های اجزا مختلف فروشگاه می باشد. در هر فولدر قالب آن قسمت ایجاد شده و به نمایش در می آید. در داخل این فولدر های فایل هایی با پسوند .tpl قرار دارند که شامل کدهای html و php می باشند.
برای مثال در مسیر view/theme/default/template/error/not_found.tpl فایل به مشخصات زیر قرار دارد:
کد:
[COLOR=#0000BB]<?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$header[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?><?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$column_left[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?><?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$column_right[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?>
[/COLOR]<div id="content">
  <div class="top">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center">
      <h1>[COLOR=#0000BB]<?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$heading_title[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?>[/COLOR]</h1>
    </div>
  </div>
  <div class="middle">
    <div class="content">[COLOR=#0000BB]<?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$text_error[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?>[/COLOR]</div>
    <div class="buttons">
      <table>
        <tr>
          <td align="right"><a onclick="location = '[COLOR=#0000BB]<?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]str_replace[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'&'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#DD0000]'&'[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]$continue[/COLOR][COLOR=#007700]); [/COLOR][COLOR=#0000BB]?>[/COLOR]'" class="button"><span>[COLOR=#0000BB]<?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$button_continue[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?>[/COLOR]</span></a></td>
        </tr>
      </table>
    </div>
  </div>
  <div class="bottom">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center"></div>
  </div>
</div>
[COLOR=#0000BB]<?php [/COLOR][COLOR=#007700]echo [/COLOR][COLOR=#0000BB]$footer[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#0000BB]?>[/COLOR]


که همانطور که مشخص است دارای کدهای html و php می باشد. در کدهای php معمولا از دستور echo استفاده شده است که یا یک نام را می نویسد (برای مثال نام فروشگاه) و یا یک ماژول را فراخوانی می کند (برای مثال ماژول آخرین محصولات)
(در این مقاله قصد نداریم تا با روش ساخت قالب آشنا شویم و در همین جا بحث را پایان می دهیم.)


فولدر Controller:

کار قسمت Controller شامل ارتباط میان لایه های view و model می باشد. بدین معنی که در قسمت Controller که خود شامل فولدرهایی به نام های قسمت های مختلف فروشگاه می باشد در هر فایل که به زبان PHP نوشته شده است حداقل یک تابع به نام index وجود دارد که شامل نمایش وبسایت می شود.
بدین ترتیب ابتدا فایل هایی از view فراخوانی می شوند و اطلاعات پس از دریافت از model در جاهای مشخص شده نمایش داده می شود و همچنین اطلاعات از کاربر و تصدیق آن در این لایه انجام شده و به لایه مدل برای اجرا و اعمال ارسال می گردد.
برای مثال در فایل not_found.php واقع در cataloge/controller/error/not_found.php ابتدا یک کلاس اکستند شده از controller ایجاد شده است. سپس تابع index() ایجاد شده. در این قسمت فایل های زبانی فراخوانی شده اند. همچنین نوار مسیر سایت ایجاد شده است. نام تمامی کلید ها و متن ها از فایل های زبانی فراخوانی و تنظیم شده است. در قسمت بعدی آن فایل های قالب نیز فراخوانی شده اند و بخش های مختلف آن ایجاد شده اند. و در آخر این متن آماده شده به صورت setOutput به نمایش درآمده است.

کد:
[COLOR=#0000BB]<?php   
[/COLOR][COLOR=#007700]class [/COLOR][COLOR=#0000BB]ControllerErrorNotFound [/COLOR][COLOR=#007700]extends [/COLOR][COLOR=#0000BB]Controller [/COLOR][COLOR=#007700]{
    public function [/COLOR][COLOR=#0000BB]index[/COLOR][COLOR=#007700]() {        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]response[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]addHeader[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]request[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]server[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'SERVER_PROTOCOL'[/COLOR][COLOR=#007700]] . [/COLOR][COLOR=#DD0000]'/1.1 404 Not Found'[/COLOR][COLOR=#007700]);

        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]load[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'error/not_found'[/COLOR][COLOR=#007700]);
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]document[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]title [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'heading_title'[/COLOR][COLOR=#007700]);
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]document[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]breadcrumbs [/COLOR][COLOR=#007700]= array();
 
          [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]document[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]breadcrumbs[/COLOR][COLOR=#007700][] = array(
            [/COLOR][COLOR=#DD0000]'href'      [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]HTTP_SERVER [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#DD0000]'index.php?route=common/home'[/COLOR][COLOR=#007700],
            [/COLOR][COLOR=#DD0000]'text'      [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'text_home'[/COLOR][COLOR=#007700]),
            [/COLOR][COLOR=#DD0000]'separator' [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]FALSE
          [/COLOR][COLOR=#007700]);        
        
        if (isset([/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]request[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'route'[/COLOR][COLOR=#007700]])) {
               [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]document[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]breadcrumbs[/COLOR][COLOR=#007700][] = array(
                [/COLOR][COLOR=#DD0000]'href'      [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]HTTP_SERVER [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#DD0000]'index.php?route=' [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]request[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'route'[/COLOR][COLOR=#007700]],
                [/COLOR][COLOR=#DD0000]'text'      [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'text_error'[/COLOR][COLOR=#007700]),
                [/COLOR][COLOR=#DD0000]'separator' [/COLOR][COLOR=#007700]=> [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'text_separator'[/COLOR][COLOR=#007700])
              );           
        }
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]data[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'heading_title'[/COLOR][COLOR=#007700]] = [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'heading_title'[/COLOR][COLOR=#007700]);
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]data[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'text_error'[/COLOR][COLOR=#007700]] = [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'text_error'[/COLOR][COLOR=#007700]);
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]data[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'button_continue'[/COLOR][COLOR=#007700]] = [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]language[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'button_continue'[/COLOR][COLOR=#007700]);
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]data[/COLOR][COLOR=#007700][[/COLOR][COLOR=#DD0000]'continue'[/COLOR][COLOR=#007700]] = [/COLOR][COLOR=#0000BB]HTTP_SERVER [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#DD0000]'index.php?route=common/home'[/COLOR][COLOR=#007700];
        
        if ([/COLOR][COLOR=#0000BB]file_exists[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]DIR_TEMPLATE [/COLOR][COLOR=#007700]. [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]config[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'config_template'[/COLOR][COLOR=#007700]) . [/COLOR][COLOR=#DD0000]'/template/error/not_found.tpl'[/COLOR][COLOR=#007700])) {
            [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]template [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]config[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'config_template'[/COLOR][COLOR=#007700]) . [/COLOR][COLOR=#DD0000]'/template/error/not_found.tpl'[/COLOR][COLOR=#007700];
        } else {
            [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]template [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]'default/template/error/not_found.tpl'[/COLOR][COLOR=#007700];
        }
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]children [/COLOR][COLOR=#007700]= array(
            [/COLOR][COLOR=#DD0000]'common/column_right'[/COLOR][COLOR=#007700],
            [/COLOR][COLOR=#DD0000]'common/footer'[/COLOR][COLOR=#007700],
            [/COLOR][COLOR=#DD0000]'common/column_left'[/COLOR][COLOR=#007700],
            [/COLOR][COLOR=#DD0000]'common/header'
        [/COLOR][COLOR=#007700]);
        
        [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]response[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]setOutput[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]render[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]TRUE[/COLOR][COLOR=#007700]), [/COLOR][COLOR=#0000BB]$this[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]config[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000BB]get[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'config_compression'[/COLOR][COLOR=#007700]));        
      }
}
[/COLOR][COLOR=#0000BB]?>[/COLOR]

نتیجه گیری:

در این مقاله سعی شده بود با روش و معماری استفاده شده در فروشگاه ساز OpenCart شما را آشنا کنیم و چگونگی استفاده از این معماری (MVC) را به شما آموزش دهیم.

منبع:سایت open catr
 
بالا