Többnyelvű tartalmak kezelése symfony-val

Ha valaki végigolvassa a kézikönyv 13. fejezetét körülbelül képben van, hogyan kezeli a rendszer a többnyelvű felület-elemeket, tartalmakat, stb. Most elsősorban az i18n táblák tartalmának kezelésére, adminisztrálására szeretnék kitértni.

áttekintés

Nézzük meg első körben a kézikönyvben leí­rtakat. Ahhoz, hogy többnyelvű tartalmakat tudjunk kezelni először is be kell állí­tani az alapértelmezett nyelvet (culture – valójában persze ez nem csak a nyelvet jelenti). Ezt az alkalmazás config/ könyvtárában lévő i18n.yml file szerkesztésével érhetjük el.

all:
  default_culture: hu

Magát a nyelvre vontakozó információt az sfUser objektum tárolja (magyarul a session), tehát a fenti beállí­tás hatására a rendszer beállí­tja a nyelvet, ha az még nem történt meg. Ezt kézzel is megtehetjük:

// action-ben
$this->getUser()->setCulture('hu');

Ezután létre kell hoznunk egy, a symfony által kezelt, többnyelvű sémát: (olyan blog bejegyzés, ahol a cí­m fix, viszont a tartalom többnyelvű lehet)

propel:
  posts:
    _attributes: { phpName: Post }
    id:
    title: varchar(100)
  posts_i18n:
    _attributes: { phpName: PostI18n }
    body: longvarchar

A többnyelvű sémák tartalmaznak egy setCulture() metódus, amellyel beállí­tható az éppen használt nyelv. A kézikönyv azt javasolja, hogy minden modelben í­rjuk felül a hydrate() metódust, ahol könnyen beállí­thatjuk a modelhez tartozó nyelvet.

Adminisztráció

Eddig nem volt semmi érdekes. Most gondolkozzunk el egy kicsit. Ha több, mint egy többnyelvű táblánk van (márpedig több lesz), akkor ez a hydrate() felülí­rás minden modelben kissé feleslegesnek tűnhet. Ami ennél is nagyobb kérdés: az rendben van, hogy le tudjuk kérdezni az adatbázisból a többnyelvű tartalmainkat, viszont hogyan tudjuk azokat könnyen kezelni.

Itt szeretnék bemutatni egy módszert, amelynek segí­tségével egyszerűen, admin generator segí­tségével megoldható a probléma. Az itt bemutatott módszereket nem én találtam ki:

Valójában több módszer is van, én az első vonalán indultam el, az tűnik kényelmesebbnek🙂. Az egész onnan indul, hogy az admin generator alapvetően nem támogat többnyelvű tartalom-kezelést, viszont pár módosí­tással könnyen rávehető. Az áttekintésben vett táblát / modelt veszem a továbbiakban alapul.

Ennek a módszernek a lényege, hogy a model nyelvét hozzárendeljük az sfUser-ben beállí­tott nyelvhez, í­gy nyelvváltáshoz elég ha az sfUser-ben váltunk nyelvet. Ehhez létre kell hoznunk egy közös őst az i18n model-ek számára (/lib/model/i18nBase.php):

class i18nBase extends BaseObject {

  public function __construct() {
    $this->setCulture(
      sfContext::getInstance()->getUser()->getCulture()
    );
  }

}

Most álltsuk be ezt az osztályt a sémában a tábla ősének. Csak az alaptáblán kell ezt elvégezni (az _i18n végűekkel nem).

propel:
  posts:
    _attributes: { phpName: Post, baseClass: i18nBase }
...

Most még szükség van némi kódra, amely az sfUser-ben nyelvet vált. Ehhez itt a utils module – language action-t használjuk.

// template (általában layout-ban)

  
  'Magyar', 'en'=>'Angol'),
  		$sf_user->getCulture()
  	), array('onchange'=>'this.form.submit()')); ?>

// action
class utilsActions extends sfActions {

  public function executeLanguage() {
    $this->getUser()->setCulture(
      $this->getRequestParameter('culture')
    );

    $this->setFlash('notice', 'Nyelv: '.$this->getUser()->getCulture());

    if ($this->getRequest()->getReferer()) {
      $url = $this->getRequest()->getReferer();
    } else {
      $url = '@homepage';
    }
    $this->redirect($url);
  }

}

Most már “csak” az admin generatorra van szükség. Ha most elkészí­tünk egy admin generátort, akkor csak a title mezőt látjuk illetve csak azt tudjuk szerkeszteni. Miután a modelben a többnyelvű mezőkhoz ugyanúgy megtalálhatók a getter és setter metódusok, mint a saját mezőkhöz, í­gy semmi problémát nem jelent, hogy megjelení­tsük azokat (jelen esetben a body mezőt).

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

    list:
      title: Post list
      display: [=title, body]
      object_actions:
        _edit: ~
        _delete: ~

Már csak a szerkesztés van hátra. Ebben az állapotban továbbra is csak a title jelenik meg szerkesztéskor, viszont ott is megjelení­thetjük a body mezőt. A meglepetés akkor jön, amikor szerkeszteni akarjuk azt, ugyanis nem módosí­tható.

    edit:
      title: Edit of %%title%%
      display: [title, body]

Ezen könnyen segí­thetünk. Tudnunk kell, hogy a többnyelvű mezők minden tulajdonságát nekünk, kézzel kell beállí­tani. Ez persze nem nagy probléma, hiszen ezek gyakorlatilag csak szöveges beviteli mezők.

    edit:
      title: Edit of %%title%%
      display: [title, body]
      fields:
        body:
          type: textarea_tag
          params:
            disabled: false
            size: 80x8

Voila! Készen is vagyunk.

Végszó

Az itt leí­rtak a Propel model kezelését veszik alapul, Doctrine alatt nem működik a dolog. Várható a jövőben egy Doctrine alapú leí­rás is, lévén egyre inkább problémáim vannak a Propel-lel🙂.

Kategória: php, symfony, trükkök
Címke: , ,
Közvetlen link a könyvjelzőhöz.

Egy hozzászólás a(z) 0ejegyzéshez

  1. eFPe` szerint:

    Korrekt iras, nagyon hasznos🙂

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s