除了官方论坛上的一些api电话之外,他们似乎没有任何文件。我有Zend框架和CodeIgniter框架的经验。任何OpenCart大师都可以向我推荐最好的学习方法,并在最短的时间内掌握它吗?我很快就要做一个大项目。
答案 0 :(得分:306)
本指南是为熟悉PHP,OOP和MVC架构的开发人员编写的
在下文中,您将看到购物车目录端的示例。除了相关部分中提到的视图外,管理员方面的功能相同
使用$this->library_name
可通过Controller,Model和Views访问所有库功能。所有这些都可以在/system/library/
文件夹中找到。例如,要访问当前购物车的产品,您需要使用位于Cart
的{{1}}类,并且可以使用/system/library/cart.php
<进行访问/ p>
常用物品
$this->cart->getProducts()
- 与客户相关的职能customer.php
- 管理员用户相关功能user.php
- 购物车相关功能cart.php
- 所有设置均已从此config.php
- 网址生成功能 OpenCart的框架依赖于查询字符串参数中的url.php
来了解要加载的内容,并且是查找每个页面需要编辑的文件的基础功能。大多数路线实际上只使用应该被视为两个部分的route=aaa/bbb/ccc
,但有些部分包含三个部分aaa/bbb
第一部分aaa/bbb/ccc
通常与通用文件夹中的文件夹相关例如控制器或模板文件夹。第二部分通常与文件名相关,没有相关的aaa
或.php
扩展名。第三部分在&#34;理解控制器&#34;部分中进行了解释。以下
语言存储在{{1}}子文件夹的.tpl
文件夹中。在此范围内,各个页面中使用的常规文本值存储在文件夹内的/catalog/language/
文件中,因此对于目录端的英语语言,您将在your-language
中找到值。对于特定的页面文本,您需要页面的your-language.php
(通常是这种情况,但总是,因为您可以指定任何您喜欢的语言文件)。例如,搜索页面的路径为catalog/language/english/english.php
,因此该页面的语言特定文本可以在route
中找到(注意文件的名称和子文件夹与后面的路由匹配{ {1}}。
要在控制器中加载语言,请使用
product/search
然后,您可以使用语言库函数catalog/language/english/product/search.php
来检索特定的语言文本,例如
.php
使用特殊变量$this->language->load('product/search');
在语言文件中分配语言变量,该变量是键和文本值的数组。在get
中,您应该找到与
$some_variable = $this->language->get('heading_title');
全局语言文件$_
中的值会自动加载,并且可以在没有/catalog/language/english/product/search.php
方法的情况下使用
控制器基于$_['heading_title'] = 'Search';
加载,并且非常直接理解。控制器位于english/english.php
文件夹中。继续上一个示例,“搜索”页面的控制器位于此文件夹中的$this->language->load
中。再次注意,使用route
后面的路线。
打开控制器文件,您将看到一个扩展/catalog/controller/
类的Pascal Case类名,名为/product/search.php
。这又是路由特有的,.php
后跟子文件夹名称和文件名,没有扩展名大写。实际上并不需要大写,但为了便于阅读,建议使用它。值得注意的是,类名不会从子文件夹和文件名中获取除字母和数字之外的任何值。下划线被移除。
在课堂上是方法。声明Controller
的类中的方法可以通过路径运行 - ControllerProductSearch
不是。默认情况下,使用标准的两部分路径(上面为Controller
),会调用默认的public
方法。如果使用路由的第三部分(上面private
),则将运行此方法。例如,aaa/bbb
将加载index()
文件和类,并尝试调用ccc
方法
OpenCart中的模型位于account/return/insert
文件夹中,并根据功能而非路由进行分组,因此您需要通过
/catalog/controller/account/return.php
这会将文件加载到名为insert
的子文件夹/catalog/model/
中。然后可以通过对象
$this->load->model('xxx/yyy');
和控制器一样,您只能调用其xxx
方法。例如,要调整图片大小,您可以使用yyy.php
模型并调用其$this->model_xxx_yyy
方法,如下所示
public
为了从控制器向视图传递值,您只需将数据分配给tool/image
变量,该变量本质上是一个key =&gt;数组。价值对。作为一个例子
resize
如果您熟悉将每个键转换为变量的extract()方法,那么在视图中访问它有点容易理解。因此$this->load->model('tool/image');
$this->model_tool_image->resize('image.png', 300, 200);
密钥变为$this->data
,并且可以在视图中进行访问。
主题仅供目录方使用,基本上是模板,样式表和主题图像的文件夹。主题文件夹放在$this->data['example_var'] = 123;
文件夹中,后跟主题名称。文件夹名称不重要,example_var
文件夹
管理员端使用$example_var
(从路径中跳过/catalog/view/theme/
,因为它不允许不同的主题)
模板文件位于主题文件夹中的default
文件夹中。如果当前所选主题的任何模板都不可用,则使用默认文件夹的模板作为后备。这意味着可以使用非常少的文件创建主题,并且仍然可以完全运行。它还可以减少代码重复和升级问题
与语言和模型一样,视图文件通常与路线相关,但根本不必。目录端的模板通常在/admin/view/template/
中找到,除非它不存在,在这种情况下将使用默认主题的模板。对于上面的搜索页面示例,该文件为/theme/theme-name/
。对于具有三个部分的路线,它通常在template
,但没有硬设定规则。在管理员中,大多数页面都遵循此选项,但列出项目的页面(如产品列表页面)位于/catalog/view/theme/your-theme/template/
,产品编辑表单位于product/search.tpl
。同样,这些都没有设置,但是默认购物车的标准。
模板文件实际上只是另一个php文件,但是扩展名为.tpl并且实际上是在控制器文件中运行,因此您可以在控制器中编写的所有内容都可以在模板文件中运行(尽管不是建议,除非绝对必要)
使用
运行查询aaa/bbb_ccc.tpl
catalog/product_list.tpl
顾名思义是一个包含数据库前缀的常量(如果存在)
catalog/product_form.tpl
将返回$result = $this->db->query("SELECT * FROM `" . DB_PREFIX . "table`");
个查询的对象,其中包含一些属性
DB_PREFIX
包含第一行的数据,如果一个或多个作为关联数组返回
$result
包含一系列行结果,非常适合使用foreach循环
SELECT
包含返回的结果数
$result->row
对象还有一些额外的方法
$result->rows
对传递的值
$result->num_rows
返回受$this->db
查询影响的行数,依此类推
$this->db->escape()
使用mysql_insert_id()
OpenCart使用预定义变量代替标准$this->db->countAffected
,UPDATE
,$this->db->getLastId()
,$_GET
,$_POST
,$_SESSION
和$_COOKIE
$_FILES
编辑 $_REQUEST
,其中数据是模仿$_SERVER
所有其他人都可以使用$_SESSION
进行访问,并且已经清理过&#34;遵守魔法引号启用/禁用,所以
$this->session->data
变为$_SESSION
$this->request
变为$_GET
$this->request->get
变为$_POST
$this->request->post
变为$_COOKIE
$this->request->cookie
变为$_FILES
$this->request->files
变为$_REQUEST
虽然以上并不是开发人员的防弹指南,但希望它可以作为入门者的良好起点
答案 1 :(得分:35)
全局库方法:基本的opencart库函数及其功能,其中大部分可以从目录中的任何位置或管理文件夹(控制器,模型,视图)中调用
CACHE
$this->cache->delete($key) - Deletes cache [product, category, country, zone, language, currency,
manufacturer]
CART
$this->cart->getProducts() Gets all products currently in the cart including options, discounted prices, etc.
$this->cart->add( $product_id, $qty = 1, $options = array()) - Allows you to add a product to the cart
$this->cart->remove( $key ) - Allows you to remove a product from the cart
$this->cart->clear() - Allows you to remove all products from the cart
$this->cart->getWeight() - Sum of the weight of all products in the cart that have require shipping set to Yes
$this->cart->getSubTotal() - returns the subtotal of all products added together before tax
$this->cart->getTotal() - returns the total of all products added together after tax
$this->cart->countProducts() - returns the count of all product in the cart
$this->cart->hasProducts() - returns true if there is at least one item in the cart
$this->cart->hasStock() - returns false if there is at least one item in the cart that is out of stock
$this->cart->hasShipping() - returns true if there is at least one item in the cart that requires shipping
$this->cart->hasDownload() - returns true if there is at least one item in the cart that has a download
associated
CONFIG
$this->config->get($key) - returns setting value by keyname based on application (catalog or admin)
$this->config->set($key, $value) - set the value to override the setting value. DOES NOT SAVE TO DATABASE
CURRENCY
$this->currency->set($currency) - set or override the currency code to be used in the session
$this->currency->format($number, $currency = '', $value = '', $format = TRUE) - format the currency
$this->currency->convert($value, $from, $to) - convert a value from one currency to another. Currencies must
exist
$this->currency->getId() - get the database entry id for the current currency (1, 2, 3, 4)
$this->currency->getCode() - get the 3-letter iso code for the current currency (USD, EUR, GBP, AUD, etc)
$this->currency->getValue($currency) - get the current exchange rate from the database for the specified
currency.
$this->currency->has(currency) - Check if a currency exists in the opencart currency list
CUSTOMER
$this->customer->login($email, $password) - Log a customer in
$this->customer->logout() - Log a customer out
$this->customer->isLogged() - check if customer is logged in
$this->customer->getId() - get the database entry id for the current customer (integer)
$this->customer->getFirstName() - get customer first name
$this->customer->getLastName() - get customer last name
$this->customer->getEmail() - get customer email
$this->customer->getTelephone() - get customer telephone number
$this->customer->getFax() - get customer fax number
$this->customer->getNewsletter() - get customer newsletter status
$this->customer->getCustomerGroupId() - get customer group id
$this->customer->getAddressId() - get customer default address id (maps to the address database field)
DATABASE
$this->db->query($sql) - Execute the specified sql statement. Returns row data and rowcount.
$this->db->escape($value) - Escape/clean data before entering it into database
$this->db->countAffected($sql) - Returns count of affected rows from most recent query execution
$this->db->getLastId($sql) - Returns last auto-increment id from more recent query execution 4
DOCUMENT (*Called from controller only before renderer)
$this->document->setTitle($title) - Set page title
$this->document->getTitle()- Get page title
$this->document->setDescription($description) - Set meta description
$this->document->getDescription()- Get meta description
$this->document->setKeywords()- Set meta keywords
$this->document->getKeywords()- Get meta keywords
$this->document->setBase($base) - Set page base
$this->document->getBase() - Get page base
$this->document->setCharset($charset) - Set page charset
$this->document->getCharset() - Get page charset
$this->document->setLanguage($language) - Set page language
$this->document->getLanguage()- Get page language
$this->document->setDirection($direction) - Set page direction (rtl/ltr)
$this->document->getDirection()- Get page direction (rtl/ltr)
$this->document->addLink( $href, $rel ) – Add dynamic <link> tag
$this->document->getLinks()- Get page link tags
$this->document->addStyle( $href, $rel = 'stylesheet', $media = 'screen' ) – Add dynamic style
$this->document->getStyles()- Get page styles
$this->document->addScript( $script ) - Add dynamic script
$this->document->getScripts()- Get page scripts
$this->document->addBreadcrumb($text, $href, $separator = ' > ') – Add breadcrumb
$this->document->getBreadcrumbs()- Get Breadcrumbs
ENCRYPT
$this->encryption->encrypt($value) - Encrypt data based on key in admin settings
$this->encryption->decrypt($value) - Decrypt data based on key in admin settings
IMAGE
$this->image->resize($width = 0, $height = 0)
JSON
$this->json->encode( $data )
$this->json->decode( $data , $assoc = FALSE)
LANGUAGE
$this->language->load($filename);
LENGTH
$this->length->convert($value, $from, $to) - convert a length to another. units must exist
$this->length->format($value, $unit, $decimal_point = '.', $thousand_point = ',') - format the length to use
unit
LOG
$this->log->write($message) - Writes to the system error log
REQUEST
$this->request->clean($data) - Cleans the data coming in to prevent XSS
$this->request->get['x'] - Same as $_GET['x']
$this->request->post['x'] - Same as $_POST['x']
RESPONSE
$this->response->addHeader($header) - additional php header tags can be defined here
$this->response->redirect($url) - redirects to the url specified
TAX
$this->tax->setZone($country_id, $zone_id) - Set the country and zone id for taxing (integer)
$this->tax->calculate($value, $tax_class_id, $calculate = TRUE) - Calculate all taxes to be added to the total
$this->tax->getRate($tax_class_id) - Get the rates of a tax class id
$this->tax->getDescription($tax_class_id) - Get the description of a tax class id
$this->tax->has($tax_class_id) - Check if a tax class id exists in opencart
SESSION
$this->session->data['x'] - Same as $_SESSION['x']
答案 2 :(得分:9)
OpenCart Wiki网站上有初学者开发人员的文档。 请按照以下网址获取更多详细信息:
<击> http://wiki.opencarthelp.com/doku.php?id=start 击>
<击> http://wiki.opencarthelp.com/doku.php?id=methods_reference 击>
INTERNET ARCHIVE链接
http://web.archive.org/web/20160305131349/http://wiki.opencarthelp.com/doku.php?id=start http://web.archive.org/web/20160305131349/http://wiki.opencarthelp.com/doku.php?id=methods_reference
E.g。方法参考有以下详细信息:
仍然有一些页面在建,但它会有所帮助。
<强> [更新] 强>
截至2018年1月,opencarhelp.com域已关闭。
答案 3 :(得分:1)
PHP是一种使用over 5000 built-in functions的相当大的语言,因此学习新平台的一个策略是确定最常用的功能,并花一些时间了解这些功能。
我在OpenCart源代码上运行了一些查询,最常用的十大函数是:
array()
count()
explode()
implode()
mktime()
delete()
time()
date()
sprintf()
list()
此处列出的所有52个以及Linux bash命令,您可以在任何代码库上使用它们来识别常用功能: https://www.antropy.co.uk/blog/efficient-learning-for-new-opencart-developers/
答案 4 :(得分:1)
此youtube视频播放列表也有助于成为OpenCart开发人员Gurus:
MVCL pattern, code flow and request & response in OpenCart它显示了OpenCart中的MVCL模式,代码流以及请求和响应。 它们描述流程如下图所示:
Install, Configure and Uninstall Opencart module它显示了三种上传模块,然后安装,配置和卸载OpenCart 3模块/扩展的方法。
Layouts and position in Opencart 3它描述了OpenCart 3的布局和位置。它显示了如何显示不同页面的自定义布局,并给出了类别页面的示例。我们为不同的类别显示不同的布局。
Event overview of Opencart您将了解OpenCart中的事件,事件如何工作以及使其变得如此有用。
Opencart API documentation for developer该视频将演示如何使用和制作自定义opencart API
看到这些视频后,就可以开始编码了:)
答案 5 :(得分:1)
尽管已经多次回答了这个话题,但我想根据我的经验提供另一种掌握OpenCart的方法。
通过使用少量文件从头开始创建自己的OpenCart框架,您可以了解所有内容的组合方式。我将为您模仿OpenCart的文件结构。
创建文件index.php
<?php
// My simpleCart
Opencart使用注册表模式列出所有已加载类的实例。这是您的OpenCart应用程序的心脏。然后,将注册表对象传递给每个类别,模型和库,以快速访问其他对象。
创建路径为/system/engine/registry.php
的文件
<?php
// Registry class.
class Registry
{
private $data = array();
public function set($key, $value){
$this->data[$key] = $value;
}
public function get($key){
return (isset($this->data[$key])) ? $this->data[$key] : false;
}
}
在您的index.php
<?php
// My simpleCart
//load dependency files
require_once('system/engine/registry.php');
//initialize registry
$registry = new Registry;
现在让我们添加一个输出,它将是将来的HTML。毕竟,整个想法是将一串文本发送到浏览器。
创建文件system/library/response.php
<?php
class Response {
private $output;
public function getOutput() {
return $this->output;
}
public function setOutput($output) {
$this->output = $output;
}
public function output() {
if ($this->output) {
echo $this->output;
}
}
}
以及您的index.php
<?php
// My simpleCart
//load dependency files
require_once('system/engine/registry.php');
require_once('system/library/response.php');
//initialize registry
$registry = new Registry;
//initialize response
$response = new Response;
//add response object to the registry
$registry->set('response', $response);
//lets set an output as a test
$registry->get('response')->setOutput('Hello World');
//send the output to the client
$registry->get('response')->output();
通知我仅以示例添加Hello world。我们将进一步删除它。刷新您的网站进行检查。浏览器应显示
Hello World
。
将控制器视为页面。他们将定义将显示给客户端的内容:文本,html,json,下载或什至图像。现在,我们只需要一个发送文本的页面。
我们将为home
页面创建一个控制器。
添加路径为catalog/controller/common/home.php
的文件
<?php
class ControllerCommonHome{
private $registry = array();
public function __construct($registry){
$this->registry = $registry;
}
public function index(){
$output = 'Home Page';
//using the registry to get the response object and set the Output
$this->registry->get('response')->setOutput($output);
}
}
并编辑您的index.php
<?php
// My simpleCart
//load registry
require_once('system/engine/registry.php');
//load response
require_once('system/library/response.php');
//initialize registry
$registry = new Registry;
//initialize response
$response = new Response;
//add resoinse object to the registry
$registry->set('response', $response);
//load controller common/home
require_once('catalog/controller/common/home.php');
$controller = new ControllerCommonHome($registry);
$controller->index();
//send the output to the client
$registry->get('response')->output();
注意如何将
$refistry
传递到ControllerCommonHome,以便可以在控制器内部访问它。
我们不希望对控制器进行硬编码,对。我们将使用URL地址中的参数route
来告知购物车要加载哪个控制器。
创建路径为system/library/request.php
的文件
<?php
class Request {
public $get = array();
//for now I just need the $_GET parameter
public function __construct() {
$this->get = $_GET;
}
}
根据路由创建负责初始化Controller文件的Router类(换句话说:动态调用控制器)
<?php
class Router {
private $registry;
public function __construct($registry) {
$this->registry = $registry;
}
public function dispatch($route) {
require_once('catalog/controller/'.$route.'.php');
$class = "Controller".str_replace('/', '', $route);
$controller = new $class($this->registry);
$controller->index();
}
}
将其加载到您的index.php
<?php
require_once('system/engine/registry.php');
require_once('system/engine/router.php');
require_once('system/library/response.php');
require_once('system/library/request.php');
$registry = new Registry;
$response = new Response;
$registry->set('response', $response);
$request = new Request;
$registry->set('request', $request);
//get the route from the url
if(isset($registry->get('request')->get['route'])){
$route = $registry->get('request')->get['route'];
}else{
$route = 'common/home';
}
//initiate the router and dispatch it base on the route
$router = new Router($registry);
$router->dispatch($route);
$registry->get('response')->output();
请注意如何将所有内容加载到
$registry
中,然后将其传递到$router
,然后再将其传递到$controller
。
这篇文章已经太长了,但是我希望它能对OpenCart中的MVC模式有一个基本的了解。
如果您希望我继续这篇文章,并告诉您其他事物(例如模型和视图)是如何工作的,请对该答案进行评分,以便我知道。
还请查看我的YouTube https://www.youtube.com/dreamvention和博客https://dreamvention.com/blog,我将在那里为您发布更多的提示和教程!