使用Zend_Form生成动态输入

时间:2012-09-21 07:41:45

标签: php zend-framework doctrine-orm zend-form

早上好,

我有一个多语言后端应用程序,必须支持n种语言。 语言存储在数据库中,可以随时添加。 现在我的后端功能,我需要根据我的数据库中存储的语言动态生成<input>个字段,例如:

  
      
  1. 德语:<input type="text" id="title_de">
  2.   
  3. 英文<input type="text" id="title_en">
  4.   
  5. 意大利语<input type="text" id="title_it">
  6.   
  7. ...
  8.   

我目前使用Zend_Form添加这些内容:

  foreach($languages as $language){
    $title = new Zend_Form_Element_Text("title_" . $language->getPrefix());
    $title->setLabel("Title " . $language->getPrefix())
      ->setRequired(true)
    $this->addElements(array($title));
  }

这就是我使用Doctrine将字段保存到我的数据库的方式:

//get language-dependent title and write to DB
  foreach($languages as $language){
    $title->setLanguage($language);
    $title->setContent($form->getValue("title_" . $language->getPrefix()));
    $touristArea->addTitle($title);

    //persist and flush
    $em->persist($touristArea);
    $em->flush();            
  } 

无论如何,因为我有很多语言相关的字段(标题,标题等),处理表单的代码可能会非常讨厌,我总是要查询我的数据库中的语言表,以便知道输入有什么输入已经生成。 有一个更好的方法吗?像一系列输入或类似的东西?感谢您的任何意见:)

1 个答案:

答案 0 :(得分:0)

我建议你使用Zend_Translate组件 首先创建带有翻译的源文件 - &gt; 创建阵列源文件

数组源文件是普通数组。但是你必须手动定义它们,因为没有工具来帮助它。但是因为它们非常简单,所以如果您的代码按预期工作,它是查找消息的最快方式。它通常是开始翻译业务的最佳适配器。

$english = array(
    'message1' => 'message1',
    'message2' => 'message2',
    'message3' => 'message3');

$german = array(
    'message1' => 'Nachricht1',
    'message2' => 'Nachricht2',
    'message3' => 'Nachricht3');

$translate = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => $english,
        'locale'  => 'en'
    )
);

$translate->addTranslation(array('content' => $german, 'locale' => 'de'));

从1.5版开始,它还支持将数组包含在外部文件中。您只需提供文件名,Zend_Translate将自动包含它并查找数组。有关源文件的详细信息,请参阅以下page

然后查看 Zend_Form的国际化

为了在表单中初始化I18n,您需要Zend_Translate对象或Zend_Translate_Adapter对象,如Zend_Translate文档中所述。拥有翻译对象后,您可以使用setTranslator()方法将翻译器附加到特定表单实例或特定元素:

// Tell *this* form instance to use a specific translate adapter; it
// will also be used to translate validation error messages for all
// elements:
$form->setTranslator($translate);

// Tell *this* element to use a specific translate adapter; it will
// also be used to translate validation error messages for this
// particular element:
$element->setTranslator($translate);

详细指南为here