【问题标题】:Change logo on language change Opencart更改语言更改徽标 Opencart
【发布时间】:2013-04-02 17:22:08
【问题描述】:

我正在尝试在更改语言时更改商店的主要徽标。 我的公司有一个不同的英文名称(最初是法文)。

这是我的代码:

我已更改(在目录/视图/主题/yourtheme/template/common/header.tpl 中)

 <?php if ($logo) { ?>
  <div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" /></a></div>
  <?php } ?>

对于:

<?php
if($lang == 'fr'){
$logo = 'image/data/Lg_Axesoirs_Blanc_FR_PNG.png';
} elseif($lang == 'en'){
$logo = 'image/data/Lg_Axesoirs_Blanc_EN_PNG.png';
}
?> 
<?php if ($logo) { ?>
<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" /></a></div>
<?php } ?>

但它不起作用,标志没有改变,但我不明白我的代码有什么问题。

谢谢!

【问题讨论】:

  • 是否设置了$lang?实际输出的是什么 - 它总是输出英文版还是法文版?如果$lang 既不是“en”也不是“fr”怎么办?
  • 当你在网站上时,$lang 已经设置好了。默认情况下,它以法语加载网站,因此如果网站是法语,则 $lang = fr。抱歉,我不太习惯 Opencart。
  • 我会尝试在代码的开头添加一些调试,以确保 $lang 是您所期望的 - 我看不出代码有什么问题,所以我只能认为$lang 设置不正确。
  • 我应该使用什么代码来确保 $lang 已设置?
  • 我会从echo '**' . $lang; 开始,看看它打印出来的内容。

标签: php opencart


【解决方案1】:

您的代码的问题是 $lang 不包含当前所选语言的语言。这存储在 $this-&gt;config-&gt;get('config_language'); 中的 index.php 之前

$language = new Language($languages[$code]['directory']);

如果你想知道怎么做。您可以简单地将您的代码修改为以下应该可以工作的代码

<?php
$lang = $this->config->get('config_language'); // ADDED LINE
if($lang == 'fr'){
    $logo = 'image/data/Lg_Axesoirs_Blanc_FR_PNG.png';
} elseif($lang == 'en'){
    $logo = 'image/data/Lg_Axesoirs_Blanc_EN_PNG.png';
}
?> 
<?php if ($logo) { ?>
<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" /></a></div>
<?php } ?>

或者假设您的原始徽标集是

image/data/Lg_Axesoirs_Blanc_FR_PNG.png

你可以使用

<?php
$logo = str_replace('_FR_', '_' . strtoupper($this->config->get('config_language')) . '_', $logo);
?> 
<?php if ($logo) { ?>
<div id="logo"><a href="<?php echo $home; ?>"><img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" /></a></div>
<?php } ?>

这将允许您为每个新语言徽标自动使用两个字母前缀

请注意,上面的代码都没有经过测试,但理论上应该可以工作

【讨论】:

  • 感谢您的意见。一切听起来都很合乎逻辑,但它不起作用。徽标保持不变......我真的不明白
【解决方案2】:

进入 OpenCart 管理员的语言部分并编辑语言。在 URL 中查找类似 language_id=1 的内容。记下每种语言的语言 ID。

在您的代码中,输入以下内容:

<?php

// $this->config->get('config_language_id') returns the language ID currently active for the session

switch ($this->config->get('config_language_id')) {

 case 1 : // Replace the "1" with your English language ID
   // The English logo
   $logo = 'image/data/Lg_Axesoirs_Blanc_EN_PNG.png';
   break;

 case 2 : // Replace the "2" with your French language ID
   // The French logo
   $logo = 'image/data/Lg_Axesoirs_Blanc_FR_PNG.png';
   break;

 default :
    // The default logo if none of the above cases match
   $logo = 'image/data/Lg_Axesoirs_Blanc_EN_PNG.png';

}
?>

<?php if ($logo) { ?>
<div id="logo">
   <a href="<?php echo $home; ?>">
       <img src="<?php echo $logo; ?>" title="<?php echo $name; ?>" alt="<?php echo $name; ?>" />
   </a>
</div>
<?php } ?>

请注意,此逻辑实际上应该在控制器中,而不是在模板视图文件中。 OpenCart 不允许您扩展核心控制器,因此不必太担心将其放入视图中,但如果您想正确执行此操作,请查看 vQmod 之类的东西以将其插入控制器。

(有点跑题了;在即将发布的 OpenCart 版本中内置了一个 vQmod-ish 类型的东西,希望它可以让您编辑控制器而不会弄脏和下载 vQmod - 但我不能说它需要多长时间'直到发布为止)。

希望有帮助!

【讨论】:

  • 嗨,我试过你说的,但它不工作:S...没有出现在标志应该是的地方。
  • 查看页面源代码。图片 src 属性中是否有有效的 URL?如果有,请单击它并确保您没有收到 404。如果您收到 404
  • 否 404。我看到了图像 src 的有效 URL。我通过管理面板“设置”页面上传了一个徽标。我尝试删除它并让 head.tpl 文件完成这项工作。但是当我这样做时,根本不会出现任何徽标。
  • 你有链接可以告诉我你的意思吗?如果有一个 img 并且它有一个有效的 src,那么它没有理由不应该出现。唯一可能的其他原因是您的浏览器缓存以某种方式认为图像不存在,或者您有一些隐藏图像的 CSS 规则。
  • 我的意思是,是的,有一个有效的 src。但该图像可能与我在管理面板的“设置”页面中上传的图像相关联。但是由于我在头文件中添加了一个 PHP 函数,我猜想通过删除管理面板的“设置”页面中上传的徽标不会改变任何内容,因为每种语言的好徽标上的链接都是在 PHP 中完成的功能。抱歉,这很难解释...
【解决方案3】:

这是我应该可行的解决方案:

打开你的控制器catalog\controller\common\header.php,找到这行代码:

$this->data['logo'] = $server . 'image/' . $this->config->get('config_logo');

(如果 OC 版本为 1.5.5.1,则应为第 30 行)并将此行注释掉(在行前添加 //)。

现在在这条注释行下方(应保留在if 语句中)添加以下内容:

$this->load->model('localisation/language');
$language = $this->model_localisation_language->getLanguage($this->config->get('config_language_id'));
$logo = $server . 'image/' . $language['code'] . '/' . $this->config->get('config_logo');
$this->data['logo'] = file_exists($logo) ? $logo : $server . 'image/' . $this->config->get('config_logo');

通过此代码,您可以像这样设置您的徽标图像的路径

  • .../image/EN/data/Lg_Axesoirs_Blanc.png
  • .../image/FR/data/Lg_Axesoirs_Blanc.png

确保您在您的管理员中设置了您通常应该设置的徽标(因此它应该存储在image/data/)文件夹中,然后手动将英文/法文副本复制到文件夹image/EN/dataimage/FR/data - 请注意,图片名称必须相同。代码应测试该文件是否存在于该目录中,如果不存在则选择默认文件。

您的头模板文件中的代码应该保持不变。

【讨论】:

  • “image/EN”和“FR”文件夹不存在,这正常吗?我创造了它,并按照你告诉我的做了。现在我通常在管理面板中设置的标志不再出现。图片链接似乎在前端被破坏了。但是我在“图像/数据”中检查了我的服务器,并且徽标文件在那里。但我检查了链接,图像现在链接到“image/image/data/...”而不是“image/data”。怎么了?
  • 有时只是虚拟复制粘贴是不够的。尝试解决图像问题的路径,我认为整个解决方案很好并且应该可以工作。 $this-&gt;config-&gt;get('config_logo'); 的值是多少?当然 /EN//FR/ 文件夹不存在,您必须创建它们...
  • 图片的路径甚至没有链接到“image/EN/data”(或FR)。而且由于我在您发布的代码中看不到此路径,因此我不确定如何解决此问题。谢谢
  • 尝试在$logo = $server . 'image/' . $language['code'] . '/' . $this-&gt;config-&gt;get('config_logo'); 行之后回显$logo 变量 - 它包含什么?通常$this-&gt;config-&gt;get('config_logo') 包含data/My_Logo.png 之类的东西——这就是为什么我们在路径前添加/image/ 和'EN/'...EN 部分应该来自$language['code'] 部分...
  • 它与“MyWebsite.com/image/image/data/Lg_Axesoirs_Blanc_FR_PNG.png”相呼应。为什么它没有“EN/data/Lg_Axesoirs_Blanc.png”路径?
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多