Development

HowToHandlei18nDbFieldsWithAdminGenerator

You must first sign up to be able to contribute.

Version 23 (modified by Jennifer, 7 years ago)
--

How To Handle i18n Db Fields With the Admin Generator

Notice: for symfony 1.2 read HowToHandlei18nDbFieldsWithAdminGenerator1.2 Data Recovery Services

You can manage i18n fields in the backend generated by the admin generator this way.

Imagine you got a schema like this for managing i18n categories :

  <table name="categories" isI18N="true" i18nTable="categories_i18n" baseClass="i18nBaseClass" phpName="Category">
    <column name="id" type="INTEGER" primaryKey="true" required="true" autoIncrement="true"/>
    <column name="name" type="VARCHAR" size="255" required="true"/>
    <column name="is_active" type="BOOLEAN"/>
  </table>
  <table name="categories_i18n" phpName="CategoryI18n">
    <column name="id" type="INTEGER" primaryKey="true" required="true"/>
    <column name="culture" isCulture="true" type="CHAR" size="3" primaryKey="true" required="true"/>
    <column name="title" type="VARCHAR" size="255" required="true"/>
    <column name="excerpt" type="LONGVARCHAR"/>
    <column name="description" type="LONGVARCHAR"/>
    <foreign-key foreignTable="categories">
      <reference local="id" foreign="id"/>
    </foreign-key>
  </table>

Did you notice our Category model extends the i18nBaseClass? All this class has is a constructor which adds the culture currently selected. This way, we're getting localized content in the edit and list actions without the need to override a bunch of methods:

<?php
class i18nBaseClass extends BaseObject
{
  public function __construct()
  {
    $this->setCulture(sfContext::getInstance()->getUser()->getCulture());
  }
}
?>

Then we must enable the external i18n fiels, by enabling them in the generator.yml for the categories module:

generator:
  class:                sfPropelAdminGenerator
  param:
    model_class:        Category
    theme:              default

    list:
      display:          [=name, title, excerpt, description]

    edit:   
      display:          [name, title, excerpt, description]
      fields:         
        title:          { params: disabled=false }
        excerpt:        { params: disabled=false, params: size=100x2, type: textarea_tag }
        description:    { params: disabled=false, params: size=100x4, type: textarea_tag }

Specify a default culture in the app/config/i18n.yml file:

all:
  default_culture:   en

Then, you'll probably want to add a lang chooser in your app/templates/layout.php, like this :

<div class="lang-area">
  <?php echo form_tag('utils/language') ?>
    <p>
      <?php echo label_for('culture', __('Langue courante d\'├ędition des contenus').' :') ?><br/>
      <?php echo select_language_tag('culture', $sf_user->getCulture(), array('id' => 'culture')) ?>
      <?php echo submit_tag('Go') ?>
    </p>
  </form>
</div>

And - for our example - in the utils module, for the executeLanguage action:

<?php

  ...  

  public function executeLanguage() {
    $this->getUser()->setCulture($this->getRequestParameter('culture'));
    $this->setFlash('notice', 'New current session locale : '.$this->getUser()->getCulture());
    $url = $this->getRequest()->getReferer() != '' ? $this->getRequest()->getReferer() : '@homepage';
    $this->redirect($url);
  }