使用Zend_Form实现动态输入生成

3
早上好,
我有一个多语言的后端应用程序,需要支持n种语言。这些语言存储在数据库中,可以随时添加。
现在,为了我的后端功能,我需要根据数据库中存储的语言动态生成字段,例如:
  1. 德语:<input type="text" id="title_de">
  2. 英语:<input type="text" id="title_en">
  3. 意大利语:<input type="text" id="title_it">
  4. ...
我目前使用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

我建议您使用Zend_Translate组件。 首先创建带有翻译的源文件-> 创建数组源文件

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

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

详细指南在这里


谢谢你的回答!我之前遇到过 Zend_Translate,我会去看看它。 - Adrenaxus
你认为我应该使用 Zend_Translate 来翻译我的 <input> 标签的 ID,而不是像这样手动设置 $title = new Zend_Form_Element_Text("title_" . $language->getPrefix()); 吗? - Adrenaxus
由于您正在使用Zend Framework,使用Zend_Translate只会使您比手动执行操作更具优势,并为您的应用程序提供更大的灵活性。您以后会感谢自己的选择。 - divide by zero
所以 Zend_Translate 更像是一个用于多语言应用程序翻译字符串输出的简单工具。虽然这很好,我肯定会需要它,但我认为它不是解决我的初始问题(涉及根据存储在DB表中的语言数量创建和处理输入字段)的解决方案... - Adrenaxus
似乎你很难理解,你需要从数据库中创建带有翻译的源代码(甚至可以缓存它),然后在单个表单中使用该源代码,而不是像你现在这样搞得一团糟。 - divide by zero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接