如何为OpenCart创建模板?

23

我是OpenCart的新手,想要将我的主题应用到OpenCart上。

我知道我不应直接编辑默认模板,但我该如何复制默认模板文件并进行修改以应用主题呢?

4个回答

30

Balan,你可以通过复制catalog\view\theme\default文件夹及其所有子文件夹和文件等来开始。

这样复制后的内容就是你的新主题。所以假设现在你有了以下这些文件夹:

catalog\view\theme\default
catalog\view\theme\my-new-theme
  1. 转到管理网站,选择“系统”>“设置”

  2. 在“商店”选项卡上,您应该看到名为“模板”的字段的“default”和“my-new-theme”选项。 选择“my-new-theme”,然后保存。

  3. 开始更改目录\view\theme\my-new-theme下的文件,它们将立即显示出来。


17

在opencart中创建自定义主题:

Opencart使用回退函数,这意味着当opencart在您的主题中找不到某个模板时,它将在默认主题文件夹中查找。因此,要创建新主题,您不需要复制来自默认主题的所有文件。但是,构建主题不仅仅是创建新的主题文件夹并更改其颜色。在本教程中,我们将学习有关控制器和模型如何工作的基本理解,这与模板修改相关。

在继续之前,我想明确一下,本教程中的主题是指主题文件夹中的主题(catalog/view/theme/mytheme),而模板是指模板文件夹中的.tpl文件(catalog/view/theme/yourtheme/template)。

步骤1. 创建“非常”基本的主题

    Create new folder mytheme on catalog/view/theme/, the folder tree will be like this:

        catalog/view/theme/
            |-> default
            |-> mytheme
    Now go to Admin -> System -> Setting - > Edit Store ->Tab Store -> template -> mytheme.
    Refresh your frontpage. Maybe your site litle bit mess, but your new theme is work!! :)

第二步:基本主题
    Make folder and copy some files from default theme, but DO NOT copy all files. Follow this folder tree:

        catalog/view/theme/
            |-> default
            |-> mytheme
                |-> image/*.* - copy all image
                |-> stylesheet/*.* - copy all stylesheet
                |-> template
                    |-> common
                        |-> header.tpl
        Note:
        We need to copy all the images because it's required by stylesheet.css.
        We need to copy IE stylesheet since it's declared on header.tpl (remove the file when you removing the IE style at header.tpl)
        We neet to copy slideshow.css and carousel.css since it's needed by opencart module.
        Rating star image is hard-coded into Page: category, manufacturer_info, product, review, search, special; Module: bestseller, featured, latest, special. It's up to you whether including those module and page to your theme and used another rating image, or just replacing use default rating star image.
    Now open header.tpl with text editor.
    Search word default and replace with mytheme
    Refresh your frontpage, and everything should be the same as when you used the default theme.
    To get different visual like changing color etc, you can modificate mytheme/stylesheet/stylesheet.css

第三步。自定义模板(1):理解控制器
    What template (*.tpl) is need to customize for a "good theme" ? Well, the answer is relative. In step 2 we already and only customizing the header.tpl. The most important rule to remember is never edit default theme template. Copy what you need to your theme folder, see example bellow.

        catalog/view/theme/
            |-> default
            |-> mytheme
                |-> image
                |-> stylesheet
                |-> template
                    |-> common
                        |-> header.tpl
                        |-> footer.tpl|-> information
                        |-> information.tpl|-> product
                        |-> product.tpl
                        |-> category.tpl
                        |-> manufacturer_list.tpl
    To customizing template and work with the controller, you need to understand that opencart used push-based MVC model -CMIIW.
    In quick explanation:
        When you accessing route=product/category url, opencart call controller/product/category.php file.
        This controller (ex. category.php) will decide which MV-L: Model, View (tpl), language will be load. In category controller (category.php) load:
            3 Model (category, product, image): $this->load->model('...');
            2 View (category.tpl & not_found.tpl): $this->template = '...';
            1 Language: $this->language->load('...')
        The controller also decide what data will be pushed into template and how user input will be processed.
            $this->$this->data['text_price'] = $this->language->get('text_price'); will produce Price in template: <?php echo $text_price; ?>
            When you change the product show (from 15 to 25) at frontpage, controller catch the request with if (isset($this->request->get['limit'])) { ... } then process it $this->data['limits'][] = array(... 'value' => 25, ...);
    Remember that there is no fallback function for controller. If you modificate the controller file manually, it will be replaced when you upgrade the opencart. Instead modificate it manually, you can used vQmod to make "virtual modification". We will talk this on step 5.

第四步。自定义模板(2):了解模型
    A Model in MVC in charge to pull and push data to database. Before controller get or post a data through model, the spesific model need to be loaded.
        load model: $this->load->model('catalog/product');
        get data: $this->model_catalog_product->getTotalProducts()
        post data: $this->model_catalog_product->editProduct()
    $this->load->model('catalog/product') tell the opencart to load model/catalog/product.php either in admin or catalog controller. getTotalProducts(), editProduct() is a function inside the model/catalog/product.php.
    Now open model/catalog/product.php and find public function getProduct.
        See list after return array, and you will found all product data.
        The question is, if the getProduct() listed all product data, why it doesn't show at category page (frontpage)? This because the category controller decide not to show all data.
        Open controller/product/category.php, find $this->data['products'][] = array to see what product data is used by controller.

第五步. 自定义模板(3): 了解vQmod
    vQmod is a virtual modificate and usually used to make some change to non-fallback file like controller and model without modificating the default file.
    You can download latest version and read further explanation about vQmod here.
    To install vQmod, copy vqmod folder inside the package to opencart root.

        yoursite
            |-> admin
            |-> catalog
            |-> download
            |-> image
            |-> system
            |-> vqmod
    Go to your browser and access: http://localhost/yoursite/vqmod/install. You will see success message: vQmod has been installed on your system!
    On the vQmod package, you will see folder docs and example to give you a refference how vQmod work. Here I will give you some quick refference:
        vQmod File is an .xml file stored at vqmod/xml folder. When executed, the vQmod force opencart to use the modification instead the default file (original file) and produce cache file at vqmod/vqcache.
        One vQmod File able to modificate multiple file; within one file, vQmod able to do multiple modificate operation.
        Example structure inside a vQmod File:
        <modification>
            <id>vQmod File ID</id>
            <version>1.0.0</version> --> vQmod File version
            <vqmver>1.0.8</vqmver> --> minimum vQmod version to work
            <author>your name</author>
            <file name="catalog/controller/product/category.php "> --> the file to modify
                <operation>
                    <search position="replace"><![CDATA[
                    search this code and replace it with code bellow
                    ]]></search>
                    <add><![CDATA[
                    add this new code to replace code above
                    ]]></add></operation>
                <operation>
                    <search position="after"><![CDATA[
                    search this code and add code bellow after it
                    ]]></search>
                    <add><![CDATA[
                    add this new code after code searched above
                    ]]></add></operation></file>
            <file name="...">
                <operation>
                    <search position="before"><![CDATA[
                    search this code and add code bellow before it
                    ]]></search>
                    <add><![CDATA[
                    add this new code before code searched above
                    ]]></add></operation></file></modification>

2
嗨Roy,你的答案真的帮了我很多。我想知道在opencart中是否必须将控制器文件和视图文件(.tpl)命名为相同的名称。比如说,我有一个控制器文件"static.php"在'catalog/controller/module/static.php',现在我想在视图文件'catalog\view\theme\my_theme\template\common\home.tpl'上呈现结果数组和值。 那么这样做是可能的吗? - JackLB
2
假设我想在'catalog\view\theme\my_theme\stylesheet\style.php'中创建一个动态的css“style.php”,那么在这里, 我能够从任何控制器文件中传递值和数组吗? 感激您的帮助。 - JackLB
1
@ArshadHussain,看起来是同一位作者。 - Pacerier

2
请记住,视图中的所有文件都以.tpl扩展名结尾。
tpl文件中的变量值来自它们各自的控制器。而控制器中的变量值来自模型,该模型从数据库中获取数据。
因此,如果您更改了tpl文件中的变量名称,请在相应的控制器文件中也更改变量名称。

1

@JackLB - 您可以随意命名模板文件。每个模板都在控制器文件中手动指定。

尝试在任何控制器文件中搜索.tpl,您会看到:

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . 
'/template/common/header.tpl')) {
        $this->template = $this->config->get('config_template') . 
'/template/common/header.tpl';
    } else {
        $this->template = 'default/template/common/header.tpl';
    }

Opencart在自定义模板文件夹中搜索模板。如果找不到,则会回退到默认模板。如果仍然找不到,则会显示错误。
相应地更改位置路径。
但这更加复杂-需要使用相同的控制器/模板命名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接