Opencart 3 管理面板的商店设置中有一个“工作模式”字段。我需要使这个领域多语言。我决定效仿其他页面的示例。
文件 admin\view\template\setting\setting.twig。我找到了这个领域的代码
<div class="form-group">
<label class="col-sm-2 control-label" for="input-open"><span data-toggle="tooltip" data-container="#tab-general" title="{{ help_open }}"> {{ entry_open }}</span></label>
<div class="col-sm-10">
<textarea name="config_open" rows="5" placeholder="{{ entry_open }}" id="input-open" class="form-control">{{ config_open }}</textarea>
</div>
</div>
我给它加上{% for language in languages %},标记图片,和语言ID。结果是这样的:
{% for language in languages %}
<div class="form-group">
<label class="col-sm-2 control-label" for="input-open{{ language.language_id }}"><img src="language/{{ language.code }}/{{ language.code }}.png" title="{{ language.name }}" /><span data-toggle="tooltip" data-container="#tab-general" title="{{ help_open }}"> {{ entry_open }}</span></label>
<div class="col-sm-10">
<textarea name="config_open{{ language.language_id }}" rows="5" placeholder="{{ entry_open }}" id="input-open{{ language.language_id }}" class="form-control">{{ config_open }}</textarea>
</div>
</div>
{% endfor %}
管理面板中出现了每种语言的两个字段。但是当我输入数据并保存时,保存后这些字段中的信息就会消失。

我与其他多语言字段进行比较,模板和控制器中的所有内容都相同。我看不出我的创作和标准的多语言领域有什么区别。但如果它不起作用,那么我错过了一些东西。请告诉我具体是什么。
更新
将 textarea 更改为输入,现在保存但不输出到前端。
<input type="text" name="config_open[{{ language.language_id }}][title]" placeholder="{{ entry_open }}" id="input-open{{ language.language_id }}" value="{{ config_open[language.language_id] ? config_open[language.language_id].title }}" class="form-control" />
在前端控制器中,我是这样输出的。只要有一种语言,一切都会显示出来
$data['open'] = nl2br($this->config->get('config_open'));
结果,它给出了以下错误:警告:nl2br() 期望参数 1 是字符串,数组在 /var/www/fastuser/data/www/localstite.loc/storage/modification/catalog/controller/common/ 中给出第 81 行的 header.php
opencart设置组中名称中带有前缀的任何字段的值config_都存储在setting类型为 的表中text。这是合乎逻辑的,因为 所有设置本质上都是字符串。有时数组会写在那里,模型类ModelSettingSetting( ) 为其提供数据序列化admin/model/setting.php逻辑。当你将带本地化的字段带到视图时,一个数组开始到达
textareaconfig_open模型中,保存时,其中键是语言,值是内容$this->request->post['config_open']idconfig_open此外,当在前端控制器中获取此数据时,可以预见的是,您开始接收的不是字符串,而是一个反序列化的数组。
config_open管理面板中的字段有 typetextarea,这意味着可以保存带有连字符的行,保存时会转换为字符 (\n\r) 在这一行nl2br($this->config->get('config_open'));中,前端控制器使用nl2br函数,它将换行符转换为 html (<br/>) 它需要一个字符串作为输入,但接收一个数组,php 直接报告:因此,有必要更改接收/处理通过接收的设置的逻辑
$this->config->get('config_open')问题解决了。在另一个网站上帮助过。这是需要做的事情。首先,在管理控制器文件中,编辑该变量的输出代码并添加一个语言变量。
而不是这个
写它
然后在管理模板中
写它
在前端控制器中,我们像这样输出它