如何给模型做个多语插件

因接触yii时间较短,目前对于插件还不太熟悉

提一个我的需求:

如 Product 产品模型,我希望做一个多语的模型如 ProductMui

这个多语模型ProductMui会放置多语言部分的字段,

利用插件(Behavior?),使得如下效果:

透明读取多语字段值

$product = Product::model()->getOne();

echo $product->name; – name 为 ProductMui的字段,这里是插件通过魔术方法获取

透明写入多语字段值

$product = new Product();

$product->name = ‘abc’;

$product->save();

插件会自动将生成一条 Product记录及一个ProductMui记录,并且 在新的ProductMui中,name会被赋值为 ‘abc’

插件,我还会做一些常用的方法,如:

$products = Product::model()->existsBy(‘name’)->getAll();

这样会得到所有 ProductMui中,name值不为空的行~~

诸如:

$product = Product::model()->getOne()->langpack(‘zh_cn’); 这样会返回 关联的 ProductMui 中,语言标记为“zh_cn”的数据~~

不知道这样的插件是否已经被开发并共享了?

据我所知,目前还没有这样的插件。另外,核心框架也不会提供这样的插件。核心框架的一个目标是避免很automagic的代码,因为这种代码不容易维护。

qiang, 你的web开发应该面面俱到~

你觉得,像我这种需求,使用什么方法更好实现呢?

考虑到多语字段“透明”使用,是因为,项目是否多语,是有可能变化的~ 更多的是考虑到通用~

数据库多语言的实现有很多种办法,各有利弊。我还没有看到一种比较完美的解决方案,这也是没有提供核心插件的一个原因。

那现在yii的model behavior是否可以做到动态加属性呢?

如在插件中,获取多语模型如 ProductMui 中的字段,

然后将非关联字段(product_id, lang)外的字段,都动态加到主模型 Product 去,

主模型就可以使用:

$product = Product::model()->find()->getOne();

echo $product->name; — name 为ProductMui 字段值~