1. Go to this page and download the library: Download optimeconsulting/sf-utils library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
try {
// proceso
}catch(\Optime\Util\Exception\ValidationException $e){
// agregar error a un form de Symfony:
$e->addFormError($form, $translator);
// agregar un flash:
$this->addFlash("error", $e->getDomainMessage()->trans($translator));
}
try {
throw new DomainException("error.invalid_value");
} catch (\Optime\Util\Exception\DomainException $e) {
$this->addFlash('error', $e->getDomainMessage()->trans($translator));
}
// Otro caso:
try {
throw new DomainException(new TranslatableMessage(
"error.invalid_value",
['{invalid_value}' => 'aaa'],
'validators' // este es el domino de traducción.
));
} catch (\Optime\Util\Exception\DomainException $e) {
$this->addFlash('error', $e->getDomainMessage()->trans($translator));
}
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Optime\Util\Translation\TranslationsAwareInterface;
use Optime\Util\Translation\TranslationsAwareTrait;
/**
* @ORM\Entity()
*/
class Entidad implements TranslationsAwareInterface
{
use TranslationsAwareTrait;
...
}
$translation = ... obtenemos el servicio Optime\Util\Translation\Translation
########## Carga/Creación de un TranslatableContent #########
// traduccion nueva:
$newContent = $translation->newContent([
'en' => 'Hi',
'es' => 'Hola',
]);
// traduccion nueva a partir de un unico string:
$newContent = $translation->fromString('Hi'); // todos los locales tendrán el mismo texto
// Obtener traducciones existentes en una entidad.
$object = $repository->find(1); // object debe implementar TranslationsAwareInterface
$translation->refreshInDefaultLocale($object); // importante refrescar el objeto en el locale por defecto de la app.
$titleTranslations = $translation->loadContent($object, 'title');
$descriptionTranslations = $translation->loadContent($object, 'description');
// Todos los métodos anteriores retornan una instancia de TranslatableContent
########## Persitencia de un TranslatableContent #########
$titleContent = $translation->newContent([
'en' => 'Hi',
'es' => 'Hola',
]);
$newObject = new EntityClass(); // EntityClass debe implementar TranslationsAwareInterface
$translation->refreshInDefaultLocale($newObject); // importante refrescar el objeto en el locale por defecto de la app.
$newObject->setTitle((string)$titleContent); // castear a string retorna el valor en el locale por defecto.
$persister = $translation->preparePersist($newObject);
$persister->persist('title', $titleContent);
$entityManager->persist($newObject);
$entityManager->flush();
// Actualizando traducciones
$object = $repository->find(1); // object debe implementar TranslationsAwareInterface
$translation->refreshInDefaultLocale($object); // importante refrescar el objeto en el locale por defecto de la app.
$titleTranslations = $translation->loadContent($object, 'title');
$titleTranslations->setValues(['en' => 'Other title', 'es' => 'Otro titulo']);
$descriptionTranslations = $translation->fromString('Other Description');
$persister = $translation->preparePersist($object);
$persister->persist('title', $titleTranslations);
$persister->persist('description', $titleTranslations);
$entityManager->persist($object);
$entityManager->flush();
public function formAction(Request $request)
{
$data = [
'title' => null,
'description' => $translation->newContent(),
];
$form = $this->createFormBuilder($data)
->add('title', TranslatableContentType::class)
->add('description', TranslatableContentType::class, [
'type' => TextareaType::class,
])
->getForm();
if ($form->isSubmitted()) {
dump($form['title']->getData()); // TranslatableContent con los datos en cada idioma.
dump($form['description']->getData()); // TranslatableContent con los datos en cada idioma.
}
}
use Optime\Util\Translation\TranslationsFormHandler;
public function formAction(Request $request, TranslationsFormHandler $formHandler)
{
$entityObject = new EntityClass();
$form = $this->createFormBuilder($entityObject)
->add('title', AutoTransFieldType::class)
->add('description', AutoTransFieldType::class, [
'type' => TextareaType::class,
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
dump($form['title']->getData()); // retorna el string en locale por defecto
dump($form['description']->getData()); // retorna el string en locale por defecto
// para persistir las traducciones se debe llamar a:
$formHandler->persist($form); // si no se llama a esté método, no se guardarán las traducciones.
$entityManager->persist($entityObject);
$entityManager->flush();
}
}
public function formActionAutoSave(Request $request)
{
$entityObject = new EntityClass();
$form = $this->createFormBuilder($entityObject, [
'auto_save_translations' => true, // activamos guardado automatico.
])
->add('title', AutoTransFieldType::class)
->add('description', AutoTransFieldType::class, [
'auto_save' => true, // activamos guardado automatico para este campo.
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
// No hay que hacer nada con las traducciones, el auto_save ya
// hace el trabajo de persistirlas.
$entityManager->persist($entityObject);
$entityManager->flush();
}
}
public function formActionManualAutoSave(Request $request, TranslationsFormHandler $formHandler)
{
$entityObject = new EntityClass();
$form = $this->createFormBuilder($entityObject)
->add('title', AutoTransFieldType::class)
->add('description', AutoTransFieldType::class, [
'auto_save' => true,
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
// Hacemos flush del auto save.
// Util cuando no tenemos acceso al form y queremos
// hacer la persitencia de los AutoTransFieldType
// en un sitio especifico.
$formHandler->flushAutoSave();
$entityManager->persist($entityObject);
$entityManager->flush();
}
}
$translation = ... obtenemos el servicio Optime\Util\Translation\Translation
$object = $repository->find(1);
// importante refrescar el objeto en el locale por defecto de la app.
$translation->refreshInDefaultLocale($object);
// Se debe refrescar el objeto antes de hacerle algún cambio, ya que al refrescar
// se revierten todos los posibles cambios no guardados en la entidad.
$newContent = $translation->newContent([
'en' => 'Hi',
'es' => 'Hola',
]);
$object->setTitle((string)$titleContent);
$persister = $translation->preparePersist($object);
$persister->persist('title', $titleContent);
$entityManager->flush();
// Controlador:
use Optime\Util\Http\Controller\HandleAjaxForm;
#[HandleAjaxForm]
public function formAction(Request $request)
{
$form = $this->createForm(FormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$entityManager->persist($form->getData());
$entityManager->flush();
}
...
}
use Optime\Util\Http\Controller\HandleAjaxForm;
#[HandleAjaxForm(
type: string|null,
invalidStatus: Response::HTTP_UNPROCESSABLE_ENTITY,
preventRedirect: true,
replaceRedirectContent: true
)]
public function formAction(Request $request);
// Controlador:
use Optime\Util\Http\Controller\PartialAjaxView;
#[HandleAjaxForm]
#[PartialAjaxView]
public function formAction(Request $request)
{
$form = $this->createForm(FormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$entityManager->persist($form->getData());
$entityManager->flush();
}
...
}
use Optime\Util\Http\Controller\PartialAjaxView;
#[PartialAjaxView(
name: 'default' string|array,
method: null|string,
ignoreOnEmpty: false,
)]
public function formAction(Request $request);
use Optime\Util\Http\Controller\PartialAjaxView;
#[PartialAjaxView("table")]
public function index(Request $request);
use Optime\Util\Http\Controller\PartialAjaxView;
#[PartialAjaxView("table", method: "post")]
#[PartialAjaxView("header")]
public function index(Request $request);
#[PartialAjaxView("table", method: "post")]
#[PartialAjaxView]
public function other(Request $request);
use Optime\Util\Http\Controller\PartialAjaxView;
#[PartialAjaxView(["header", "table"])]
public function index(Request $request);
use Optime\Util\Http\Controller\PartialAjaxView;
#[PartialAjaxView(["list_counter", "list_data"])]
public function index(Request $request);
// Controlador:
use Optime\Util\Http\Request\ArgumentValue\LoadFromRequestContent;
public function actionOne(#[LoadFromRequestContent] array $userData)
{
// es equivalente a:
$userData2 = json_decode($request->getContent(), false);
...
}
public function actionTwo(#[LoadFromRequestContent] UserDataRequest $userData)
{
// es equivalente a:
$userData2 = $serializer->deserialize(
$request->getContent(),
UserDataRequest::class,
$request->getContentType() ?? 'json',
);
...
}
/**
* Cuando colocar el tipo en el parametro da problemas
* (Ejemplo con entidades de doctrine)
* Se puede indicar el tipo en el Atributo.
*/
public function actionThree(
#[LoadFromRequestContent(UserDataRequest::class)] $userData
) {
// es equivalente a:
$userData2 = $serializer->deserialize(
$request->getContent(),
UserDataRequest::class,
$request->getContentType() ?? 'json',
);
...
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.