【问题标题】:Dynamic input generation with Zend_Form使用 Zend_Form 生成动态输入
【发布时间】:2012-09-21 07:41:44
【问题描述】:

早上好,

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

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

无论如何,由于我有许多与语言相关的字段(标题、标题等),处理表单的代码可能会变得非常讨厌,我总是必须查询数据库中的语言表才能知道输入有哪些已生成。 有一个更好的方法吗?就像输入数组或类似的东西?感谢您的任何意见:)

【问题讨论】:

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


    【解决方案1】:

    我建议你使用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);
    

    详细指南here

    【讨论】:

    • 感谢您的回答!我之前遇到过Zend_Translate,我去看看。
    • 你认为我应该使用Zend_Translate 翻译我的<input> 的ID,而不是像$title = new Zend_Form_Element_Text("title_" . $language->getPrefix()); 那样手动设置它们吗?
    • 由于您使用的是 Zend 框架,使用 Zend_Translate 只会让您比手动执行的操作更有优势,并为您的应用程序提供更大的灵活性。稍后你会对自己说声谢谢。
    • 所以Zend_Translate 似乎更像是一个用于为多语言应用程序翻译字符串输出的简单工具。虽然这很好,我肯定会需要它,但我不认为它是我最初涉及创建和处理输入字段的问题的解决方案,具体取决于数据库表中存储了多少种语言......
    • 您似乎很难理解,您需要使用数据库中的翻译创建源(您甚至可以缓存它),然后将源用于单一表单,而不会像您那样乱七八糟。
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    相关资源
    最近更新 更多