Multilingue : supprimer une des traductions d’un enregistrement

Imaginons un catalogue de produits multilingue : tous les produits sont bien traduits dans chaque langue disponible, mais notre client appelle pour supprimer l’un des produits devenu indésirable dans l’une des langues. Il ne suffit pas de vider les champs qui ont été traduits, car l’enregistrement sera toujours présent dans la table i18n, et sera toujours affiché sur le site mais avec des champs vides. Nous avons donc ajouté une action dans l’administration qui permet de supprimer une traduction d’un enregistrement.

Voyons cette nouvelle action dans notre Contrôleur Produits :

// {app}/controllers/produits_controller.php
function admin_delete_translation($id = null)
{
	if(isset($this->data))
	{
		$translateModel =& $this->Produit->translateModel();
 
		$conditions = array(
			'model'       => 'Produit', 
			'foreign_key' => $this->data['Produit']['id'],
			'locale'      => $this->data['Produit']['locale']
		);
 
		$translateModel->deleteAll($conditions);
 
		$this->Session->setFlash(__("Traduction supprimée.", true), 'message_ok');
		$this->redirect('index');
	}
	$this->data = $this->Produit->read(null, $id);
}

Il ne reste qu’à créer un petit formulaire dans la Vue correspondante avec l’id de l’enregistrement en champ caché et une liste déroulante des langues du site.

// {app}/views/produits/admin_delete_translation.ctp
<?php
$langues = array_flip(Configure::read('Config.languages'));
 
echo $form->create('Produit', array('action' => 'delete_translation'));
echo $form->input('id');
echo $form->input('locale', array('options' => $langues));
echo $form->end(__("Supprimer la traduction", true));
?>
Pierre-Emmanuel Fringant

Participez

Pour insérer une portion de code, utilisez <pre lang="php">...</pre>