我正在扩展时事通讯区域,这样我就可以发送一封包含产品列表的电子邮件,但我找不到如何获得每个产品的seo url?
当我这样做的时候,我实际上得到了管理URL。
$this->url->link('product/product', 'product_id=' . $row['product_id'])
店面中的这段代码运行良好,并返回seo url(如果存在)。
我能让它工作的唯一方法是手动构建URL,显然没有seo URL。
HTTP_CATALOG .'index.php?route=product/product&product_id='.$row['product_id']
进一步研究,我发现管理区域缺少以下代码,但我不知道这是如何实际工作的,并且与$this->url->link
联系在一起,这样我就可以修改它为我工作。
$controller->addPreAction(new Action('common/seo_url'));
UPDATE-最后最简单的解决方案是添加我自己的方法,如下所示:
public function getUrl($route, $key, $value){
$url = "index.php?route={$route}&{$key}={$value}";
if($this->config->get('config_seo_url')){
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");
if($query->row['keyword']){
$url = $query->row['keyword'];
}
}
return $url;
}
前端链接
在不修改核心文件的情况下,从管理区域创建前端链接的最佳方法是创建自己的URL对象:
$url = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTP_CATALOG : HTTPS_CATALOG);
要创建url,您可以使用$url而不是$this->url,因此您的示例是:
$url->link('product/product', 'product_id=' . $row['product_id']);
SEO URL
获取SEO URL有点困难,不幸的是需要复制一些代码或进行一些篡改。
复制的代码
基本上,从catalog/controller/common/seo_url.php
复制整个rewrite($link)
函数,并将其添加到您正在创建的控制器类中。然后在上述新的$url
行之后添加以下行:
$url->addRewrite($this);
然后将当前控制器用作重写器,并重写所有URL。您可能可以使用一个单独的类,但也有一些依赖项来获得数据库访问权限。这似乎是最直接的方式,即使它很丑陋。
然后你的代码应该是:
<?php
class ControllerMyController extends Controller {
public function index() {
...
$url = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTP_CATALOG : HTTPS_CATALOG);
if ($this->config->get('config_seo_url')) {
$url->addRewrite($this);
}
$url->link('product/product', 'product_id=' . $row['product_id']);
...
}
public function rewrite($link) {
... [stuff from seo_url.php] ...
}
}
您将从管理区域获得SEO网址。
Bodging
如果您对任意的require
语句感到满意,那么您也可以执行以下操作并使用现有的SEO代码(这意味着如果它发生更改,它将保持最新状态,但如果文件移动,它将失败)。
要以这种方式创建SEO URL,您的代码需要是:
$url = new Url(HTTP_CATALOG, $this->config->get('config_secure') ? HTTP_CATALOG : HTTPS_CATALOG);
if ($this->config->get('config_seo_url')) {
// Require the SEO file directly - path is relative to /admin/index.php
require_once('../catalog/controller/common/seo_url.php');
$rewriter = new ControllerCommonSeoUrl($this->registry);
$url->addRewrite($rewriter);
}
$url->link('product/product', 'product_id=' . $row['product_id']);
管理部分不需要preAction进行SEO,因为管理中没有SEO链接。
你遇到的问题是,在前端,常数HTTP[S]_SERVER
指向http[s]://mydomain.com/
,而在管理中,相同的常数指向http[s]://mydomain.com/admin/
。
您想要的可能是编辑url
类(system/library/url.php
),并通过复制link
方法添加新方法frontend_link
,并用仅在管理中存在的HTTP[S]_CATALOG
常量替换方法体中的HTTP[S]_SERVER
常量。。。
扩展一下@IBBoard的信息丰富的答案:在Opencart 3.0.2及更高版本中,seo_url.php不再在catalog/common文件夹中。已将其移至目录/启动。
此外,强烈建议通过opencart的修改函数运行require_once语句中的文件名,如:
require_once modification(DIR_CATALOG . 'controller/startup/seo_url.php');