2013-11-26 4 views
1

У меня есть вкладка и на каждой вкладке множество одинаковых полей, которые отличаются только языком. Например, у меня есть имя и описание поля в каждой вкладке, и я хотел бы создать каждый вход, используя форму помощника CakePHP в следующем виде:Сохранение нескольких переводов сразу с помощью CakePHP

English Tab

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

французский Tab

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

После этого (это может быть неправильно, но это сработало) я задал значение определенного поля как массив, содержащий значения, введенные различными локалями.

Я использую TranslateBehavior, и все прошло хорошо, пока я не обновился до самого последнего из CakePHP (2.4.3 из 2.3). Теперь, когда я пытаюсь сэкономить, я получаю сообщение об ошибке: Неизвестная колонка «Array»

Я ничего не могу найти при сохранении нескольких языков одновременно. Благодарим за любую идею!!

Update 1

Я также попытался переместить локаль до конца так:

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

С такими же результатами

Update 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); 
} 

Update 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> 
+0

Не могли бы вы разместить SQL-запрос, который Cake пытается выполнить, но не удается? Кроме того, можете ли вы разместить строки (строки) кода, относящиеся к генерируемой ошибке (вы сказали, что это происходит, когда вы пытаетесь сохранить)? – iso27002

+0

Я обновил свое сообщение, чтобы включить запрошенные детали. – riula

+0

Последний запрос: содержимое '$ this-> request-> data'. – iso27002

ответ

2

Хорошо, я, наконец, получил это работает.

Новый предпочтительный формат локали для CakePHP основан на ISO 639-2, поэтому я обновил все текущие записи локали, чтобы они соответствовали. Это особенно важно при использовании gettext в Cake в качестве папки для ваших файлов * .po файлов (не совсем релевантных, но полезных).

После этого я изменил структуру моих форм быть:

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

Наконец, я должен был теперь называем saveMany, в отличие от простого вызова сохранить тактичность, что saveMany ожидает массив записей.

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

Так что теперь я могу сохранить многочисленные переводы еще раз.

0

локаль не требуется, чтобы быть в ISO 639-2, по умолчанию, Cake2 использует его, но в моем случае, Configure:write('Config.language') = 'en' и поэтому мои формы были:

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

Это работает прекрасно, только проблема, с которой я столкнулся, собирала данные из db в правильном формате для автоматической установки этой формы. Перед функцией поиска, я использовал bindTranslation(), как указано в CakePHP документации:

$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' 
     ) 
    ) 
) 

Как вы видите, что формат массива ясно, но, безусловно, это не действует, поэтому я должен был добавить следующее Еогеасп переместить значения и очистить его.

$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' 
    ) 

Это делается и в Интернете, но там должен быть лучший способ сделать это.

Смежные вопросы