Estamos trabajando en un proyecto que utiliza Silverstripe con el módulo Fluent para habilitar varias traducciones.

A continuación, se muestra un objeto de datos de ejemplo con Fluent habilitado. Primero creamos el objeto de datos y establecemos explícitamente los campos del CMS:

namespace Yard;

use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;

class Milkshake extends DataObject {
  private static $table_name = 'Milkshake';

  private static $db = [
    'Title' => 'Varchar(255)'
  ]

  public function getCMSFields() {
    $fields = new FieldList(
        new TextField('Title', 'Milkshake Title', null, 255)
    );
    $this->extend('updateCMSFields', $fields);
    return $fields;
  }
}

Luego configuramos Title como traducible en un archivo YML:

Yard\Milkshake:
  extensions:
    - 'TractorCow\Fluent\Extension\FluentExtension'
  translate:
    - 'Title'

Esto nos da un objeto con un campo Title traducible que puede tener diferentes valores en diferentes configuraciones regionales. Crea la siguiente tabla de base de datos:

Milkshake_Localised

ID | RecordID | Locale | Title

Hasta ahora todo bien, excepto usando:

$milkshake = Milkshake::get()->first() no devuelve los datos localizados y los extrae de la tabla Milkshake.

Creo que podría ser posible usar:

$locale= FluentState::singleton()->getLocale();
$milkshake = Milkshake_Localised::get()->filter(['Locale' => $locale])->first();

Pero esto se siente torpe y no tiene respaldo si los datos de la configuración regional no existen para ese campo (momento en el que debería volver a la configuración regional predeterminada, o en su defecto, el campo Milkshake original).

¿Cuál es la forma correcta de acceder a los datos de configuración regional en Fluent para que exista una alternativa si es necesario?

0
BaronGrivet 17 oct. 2019 a las 04:49

1 respuesta

La mejor respuesta

Obtuve el comportamiento deseado envolviendo el comando get en "withState "

use TractorCow\Fluent\State\FluentState; 

$milkshake = FluentState::singleton()->withState(function (FluentState $state) {
 return Milkshake::get()->first(); 
});
0
BaronGrivet 24 oct. 2019 a las 00:33