【问题标题】:Saving multiple translations at once with CakePHP使用 CakePHP 一次保存多个翻译
【发布时间】:2013-11-26 17:24:11
【问题描述】:

我有一个选项卡式表单,每个选项卡中都有一组相同的字段,只是语言不同。例如,我在每个选项卡中都有一个名称和描述字段,我将使用 CakePHP 的表单助手以下列方式创建每个输入:

英文标签

$this->Form->input("Service.en.name");
$this->Form->input("Service.en.description");

法语标签

$this->Form->input("Service.fr.name");
$this->Form->input("Service.fr.description");

之后(这可能是错误的,但它有效)我会将特定字段的值设置为包含由各种语言环境键入的值的数组。

我正在使用 TranslateBehavior,在升级到最新的 CakePHP(从 2.3 到 2.4.3)之前,一切都很好。现在,每当我尝试保存时,我都会收到一条错误消息:Unknown column "Array"

我找不到关于一次保存多种语言的任何信息。任何想法将不胜感激!

更新 1

我也尝试过像这样将语言环境移到最后:

$this->Form->input("Service.name.en")

结果相同

更新 2

根据 xdebug,这是 SQL:

UPDATE `cc_dev`.`services` SET `name` = Array, `description` = Array, `duration` = 60, `category_id` = 1, `backend_only` = "0", `id` = 1, `vendor_id` = 116, `updated` = "2013-11-26 18:46:11"  WHERE `cc_dev`.`services`.`id` = "1"

它发生在保存期间。我只是先检查以确保请求数据不为空,仅此而已。

if (!empty($this->request->data)) {
    $this->Service->save($this->request->data);
}

更新 3

提交的请求数据的内容,目前采用Update 1中指定的格式

<pre>Array (
[Service] => Array
    (
        [name] => Array
            (
                [en] => One-to-One Session
                [fr] => Séance individuelle
            )

        [description] => Array
            (
                [en] => Choose a personalized training session of 45 minutes.
                [fr] => Choisissez une séance de formation individuelle de 45 minutes.
            )

        [duration] => 60
        [category_id] => 1
    )
)
</pre>

【问题讨论】:

  • 能否发布 Cake 尝试执行但失败的 SQL 查询?另外,您能否发布与正在生成的错误相关的代码行(您说它发生在您尝试保存时)?
  • 我更新了我的帖子以包含请求的详细信息。
  • 最后一个请求:$this-&gt;request-&gt;data的内容。
  • 大功告成!我非常感谢这一点:)
  • 对不起,我对你在这里想要做什么感到有点困惑。我假设Service 在数据库中只有一个name 列,对吗?那么您是否尝试将两个名称保存到单个列中?

标签: php cakephp internationalization cakephp-2.3


【解决方案1】:

好的,我终于让它工作了。

CakePHP 新的首选语言环境格式基于 ISO 639-2,因此我更新了所有当前的语言环境记录以匹配。当在 Cake 中使用 gettext 作为 *.po 文件更改的文件夹时,这一点尤其重要(不完全相关,但很高兴知道)。

之后我将表单的结构更改为:

$this->Form->input("Service.name.eng");
$this->Form->input("Service.description.eng");

最后,我现在必须调用 saveMany,而不是简单地调用 save,因为要注意 saveMany 需要一个记录数组。

if (!empty($this->request->data)) {
    $this->Service->saveMany(array($this->request->data));
}

所以现在我可以再次保存大量翻译。

【讨论】:

    【解决方案2】:

    语言环境不需要使用 ISO 639-2,默认情况下,Cake2 使用它,但在我的情况下,Configure:write('Config.language') = 'en' 和我的表单是:

    $this->Form->input("Service.name.en");
    $this->Form->input("Service.description.en");
    

    它工作得很好,我遇到的唯一问题是以正确的格式从 db 收集数据以自动适应这种形式。 在 find 函数之前,我使用了 CakePhp 文档中所述的 bindTranslation():

    $this->Service->bindTranslation(array('name'=>'nameTranslation'));  
    

    删除或调整包含或添加递归 = 1,它会获得翻译,但最后,必须将 nameTranslations 移动到数组中的服务索引以采用正确的格式,以便 CakeMagic Forms 工作。

    'Service' => array(
            'id' => '108',
            'name' => 'Hugs',
            'created' => '1391082480',
            'locale' => 'en'
        ),
        'nameTranslation' => array(
            (int) 0 => array(
                'content' => 'Hugs',
                'locale' => 'en',
                'foreign_key' => '108'
            ),
            (int) 1 => array(
                'content' => 'Abrazos',
                'locale' => 'es',
                'foreign_key' => '108'
            )
        )
    )
    

    如您所见,该数组格式很清楚,但肯定是无效的,所以我不得不添加以下 foreach 来移动值并清理它。

    $this->request->data['Service']['name'] = array();
    foreach($this->request->data['nameTranslation'] as $translation)
         $this->request->data['Service']['name'][$translation['locale']] = $translation['content'];
    
    unset($this->request->data['nameTranslation'],$this->request->data['Service']['locale']);
    

    结果正是我想要的:

    'Service' => array(
            'id' => '108',
            'name' => array(
                'en' => 'Hugs',
                'es' => 'Abrazos'
            ),
            'created' => '1391082480'
        )
    

    已经完成并在线,但必须有更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 2012-11-11
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2018-11-02
      相关资源
      最近更新 更多