Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CakePHP一次保存多个翻译_Php_Cakephp_Internationalization_Cakephp 2.3 - Fatal编程技术网

使用CakePHP一次保存多个翻译

使用CakePHP一次保存多个翻译,php,cakephp,internationalization,cakephp-2.3,Php,Cakephp,Internationalization,Cakephp 2.3,我有一个选项卡式表单,在每个选项卡中都有一组相同的字段,这些字段只在语言上有所不同。例如,我在每个选项卡中都有一个名称和描述字段,我将使用CakePHP的form helper以以下方式创建每个输入: 英文标签 $this->Form->input("Service.en.name"); $this->Form->input("Service.en.description"); <pre>Array ( [Service] => Array (

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

英文标签

$this->Form->input("Service.en.name");
$this->Form->input("Service.en.description");
<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>
法式标签

$this->Form->input("Service.fr.name");
$this->Form->input("Service.fr.description");
在这之后(这可能是错误的,但它起作用了),我会将一个特定字段的值设置为一个数组,其中包含由不同地区键入的值

我正在使用TranslateBehavior,在升级到最新的CakePHP(从2.3升级到2.4.3)之前,一切都很好。现在,每当我尝试保存时,都会出现一个错误,错误是:未知列“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

提交的请求数据的内容,当前采用更新1中指定的格式

数组(
[服务]=>阵列
(
[名称]=>数组
(
[en]=>一对一会话
[fr]=>Séance Individualle
)
[说明]=>阵列
(
[en]=>选择45分钟的个性化培训课程。
[fr]=>选择45分钟个人队形。
)
[持续时间]=>60
[类别id]=>1
)
)

好的,我终于让它工作了

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

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

if (!empty($this->request->data)) {
    $this->Service->saveMany(array($this->request->data));
}
最后,我现在必须调用saveMany,而不是简单地调用save,因为saveMany需要一个记录数组

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

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

ISO 639-2中不要求区域设置,默认情况下,Cake2使用它,但在我的例子中,
Configure:write('Config.language')='en'
,因此我的表单是:

$this->Service->bindTranslation(array('name'=>'nameTranslation'));  
它工作得很好,我遇到的唯一问题是以正确的格式从db收集数据以自动适应此表单。 在使用find函数之前,我使用了CakePhp文档中所述的bindTranslation():

'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'
        )
    )
)
移除或调整contain或adding recursive=1,它将获得翻译,但最后,名称翻译必须以正确的格式移动到数组中的服务索引,以便CakeMagic表单工作

$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']);
如您所见,该数组格式是清晰的,但肯定是无效的,因此我必须添加以下foreach来移动值并进行清理

'Service' => array(
        'id' => '108',
        'name' => array(
            'en' => 'Hugs',
            'es' => 'Abrazos'
        ),
        'created' => '1391082480'
    )
结果正是我想要的:


它是在线完成的,但必须有更好的方法来完成。

您可以发布SQL查询蛋糕正在尝试执行但失败的消息吗?另外,你能发布与生成的错误相关的代码行吗(你说这是在你试图保存时发生的)?我更新了我的帖子,以包含请求的详细信息。最后一个请求是:
$this->request->data
的内容。完成了!我真的很感激:)对不起,我有点困惑你在这里想做什么。我假设
服务
在数据库中只有一个
名称
列,对吗?那么,您是否正在尝试将两个名称保存到单个列中?
'Service' => array(
        'id' => '108',
        'name' => array(
            'en' => 'Hugs',
            'es' => 'Abrazos'
        ),
        'created' => '1391082480'
    )