Selamlar,
Projemde karşılaştığım bir sorun var. Sorun şu:
Şöyle bir ürün kategori tablom var.
public function up() {
Schema::create('pro_categories', function(Blueprint $table) {
// These columns are needed for Baum's Nested Set implementation to work.
// Column names may be changed, but they *must* all exist and be modified
// in the model.
// Take a look at the model scaffold comments for details.
$table->increments('id');
$table->integer('parent_id')->nullable();
$table->integer('lft')->nullable();
$table->integer('rgt')->nullable();
$table->integer('depth')->nullable();
// Add needed columns here (f.ex: name, slug, path, etc.)
$table->string('name', 80);
$table->string('about', 800)->nullable();
$table->string('tags', 300)->nullable();
$table->tinyInteger('enable')->default(0);
$table->string('alias', 80)->nullable();
$table->string('image_url', 255)->nullable();
$table->string('slug', 200);
$table->string('meta_desc',400)->nullable();
$table->string('meta_keys', 100)->nullable();
$table->softDeletes();
$table->timestamps();
// Default indexes
// Add indexes on parent_id, lft, rgt columns by default. Of course,
// the correct ones will depend on the application and use case.
$table->index('parent_id');
$table->index('lft');
$table->index('rgt');
$table->unique(array('name','slug', 'alias'));
$table->index(array('name', 'enable', 'tags'));
});
}
Bu tablonun çoklu dil desteği olsun diye de şöyle basitçe bir tasarım yaptım:
Schema::create('product_categories_langs', function($table) {
$table->increments('id');
$table->integer('category_id')->unsigned();
$table->integer('lang_id')->unsigned();
$table->string('name', 100)->unique();
$table->string('meta_desc', 400)->nullable();
$table->string('meta_keys',100)->nullable();
$table->string('tags',300)->nullable();
$table->string('about', 1000)->nullable();
$table->timestamps();
$table->softDeletes();
$table->index(array('category_id', 'lang_id'));
$table->foreign('category_id')->references('id')->on('pro_categories');
$table->foreign('lang_id')->references('id')->on('langs');
});
Refrans edilen dil tablosu da şu:
Schema::create('langs', function($table) {
$table->increments('id');
$table->string('lang_code', 10);
$table->string('name', 50);
$table->string('name_native', 50);
$table->tinyInteger('enable' )->default(0);
$table->timestamps();
$table->softDeletes();
$table->index('lang_code');
$table->unique(array('lang_code', 'name'));
});
Genellikle çoklu dilli içeriklerde bir ana tablo oluyor. Bir de bunların çevirilerinin olduğu tablolar oluyor. Mesala ürünler için bir model ve tablo gereksinimi duyulacak ve onlar içinde çok dil içerikleri olacak.
Elbette diğer sayfa, blog gibi db'de saklanan içeriklerinde farklı dillerde çevirilerde olması da olasıdır.
Örneğin controller ve blade yardımıyla ile şu postu oluşturacak bir tasarım yaptım.
<?php
array(
'name' => 'name',
'enable' => '0',
'slug' => 'slug',
'tags' => 'tags',
'meta_desc' => 'meta_desc',
'meta_keys' => 'meta_keys',
'alias' => 'alias',
'image_url' => '/files/uploads/category/qA1q6Z0Rh9I.jpg',
'parent_id' => '0',
'about' => '<p>234324</p>',
'name@gb' => 'name@gb',
'tags@gb' => 'tags@gb',
'meta_desc@gb' => 'meta_desc@gb',
'meta_keys@gb' => 'meta_keys@gb',
'about@gb' => '<p>234324</p>',
'name@de' => 'name@de',
'tags@de' => 'tags@de',
'meta_desc@de' => 'meta_desc@de',
'meta_keys@de' => 'meta_keys@de' ,
'about@de' => '<p>234324</p>',
'name@fr' => 'name@fr' ,
'tags@fr' => 'tags@fr' ,
'meta_desc@fr' => 'meta_desc@fr',
'meta_keys@fr' => 'meta_keys@fr' ,
'about@fr' => '<p>23324</p>',
'name@ru' => 'name@ru' ,
'tags@ru' => 'tags@ru' ,
'meta_desc@ru' => 'meta_desc@ru' ,
'meta_keys@ru' => 'meta_keys@ru',
'about@ru' => '<p>2342</p>',
'name@ar' => 'name@ar' ,
'tags@ar' => 'tags@ar' ,
'meta_desc@ar' => 'meta_desc@ar' ,
'meta_keys@ar' => 'meta_keys@ar',
'about@ar' => '<p>23432</p>',
);
Element değerlerini dikkate almayın .
Misal, 'about' => '<p>234324</p>' gibi bir post girişimiz var. Bir de 'about@ru' => '<p>2342</p>' gibi aynı türün farklı dil ekiyle gelen bir post parçası var.
Şimdi bunların model kontrol edilip veritabanına kayıt edilmesi gerekir. Ben bunun kolay bir yolunu arıyorum.
Proje ilerledikçe diğer içeriklerin başka dillere çevrilmesi olasılığı çok yüksek. Öyle bir yol bulmalıyım ki tek çözümle meala bir model ile tüm içeriklerin hangi dillere ait olduğunu bulup bunu gereken tablolara kayıt etmeli ve elbette öncesinde validate de etmeli.
Daha önceki projemde buna benzer bir şey yapmıştım. Ama esnek ve basit bir yol değildi.
Biraz kodlar dağınıktır, kusura bakmayın. Yazdığımda yazılım işinde 4 ayımdaydım.
http://pastebin.com/nDe8KeVZ
Nette arraştırdım. Sağlam duran bir sınıf ya da laravel eklentisi bulamadım. Hala arıyorum. Bir kaç örneğe ulaştım. Ama bu örneklerde hem pratik değil hem de esnek değil.
Ben bu farklı çevirileri ayıklayıp kontrol edip kayıt ettme işinin en makul çözümünün sonradan yazılacak olan modelleri extends edebileceği bir model ile çözülebileceğini düşünüyorum.
Sorunumu çözebilecek bir yöntem, bir class ya da bir laravel eklentisi tavsiye edebilir misiniz?