1

私はYiiの初心者です。公式ドキュメントには、CDbMessageSourceの例は記載されていません。質問:1)CDbMessageSourceをMessageSourceとして設定するにはどうすればよいですか?

2)現在のアプリケーションでは、カテゴリを1つのテーブルに保存し、カテゴリの翻訳を別のテーブルに保存しています。テーブル構造:

CATEGORY
----------  
cat_id  (PK)

CATEGORY_TRANSLATION
--------------------    
cat_id  (FK)
en
ru

ここで、サブカテゴリを導入すると、次のようにDBをモデル化できます。

SUB_CATEGORY
------------
sub_cat_id (PK) 
cat_id  (FK)

SUB_CATEGORY_TRANSLATION
------------------------
sub_cat_id (FK) 
en
ru

YiiでCDbMessageSourceを使用して翻訳を保存する場合は、CATEGORYとSUB_CATEGORYを1つのテーブルにマージしてから、CATEGORY_TRANSLATIONとSUB_CATEGORY_TRANSLATIONを別のテーブルにマージして、次の構造を取得する必要があることを正しく理解していますか?ここhttp://www.yiiframework.com/doc/api/1.1/CDbMessageSource):

CREATE TABLE SourceMessage
(
    id INTEGER PRIMARY KEY,
    category VARCHAR(32),
    message TEXT
);
CREATE TABLE Message
(
    id INTEGER,
    language VARCHAR(16),
    translation TEXT,
    PRIMARY KEY (id, language),
    CONSTRAINT FK_Message_SourceMessage FOREIGN KEY (id)
         REFERENCES SourceMessage (id) ON DELETE CASCADE ON UPDATE RESTRICT
);

ありがとうございました !

4

1 に答える 1

3

有効にする方法CDbMessageSource

メッセージ ソースは、"messages" という名前のアプリケーション コンポーネントです。したがって、アプリケーション構成ファイル内の他のコンポーネントと同じように構成します。

array(
    ......
    'components'=>array(
        ......
        'messages'=>array(
            'class'=>'CDbMessageSource',
            // additional parameters for CDbMessageSource here
            ),
        ),
    ),
)

メッセージ ソースとローカライズ可能なモデル -- 理想的な関係ではない

メッセージ ソースは、既知のメッセージの翻訳のみを提供することに注意してください。モデルのローカリゼーションにメッセージ ソースを含めることはあまり意味がありません。

のカテゴリがあるとしますid = 1。ローカライズされたタイトルをどのように取得しますか? のようなものYii::t('category', 'title_'.$category->id)は機能しますが、やや不器用です (望ましい構文ではありません。表示コードに主キー情報を「焼き込む」必要があるなど)。タイトルのローカリゼーションもユーザーが変更できるようにする場合、これはさらに複雑になります。(いずれにせよ、これを行いたい場合は、2 つの変換テーブルをマージし、データを入力するときに別の値を使用するSourceMessage.categoryことをお勧めします)。

モデルをローカライズするための代替アプローチ

モデルを簡単にローカライズする方法を簡単に説明します。Roomローカライズ可能なnameプロパティを持つモデルがあるとしましょう。という名前の新しいテーブルとLocalizedString、次のような構造を持つ対応するモデルを作成できます。

CREATE TABLE IF NOT EXISTS `localized_string` (
  `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `LocaleCode` char(5) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `StringTemplate` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`Id`,`LocaleCode`),
);

次に、Roomリレーションを使用してモデルを構成しLocalizedStringます。

public function relations()
{
    $localeCode = Yii::app()->getLanguage();

    return array(
        'nameStringTemplate' => array(
            self::BELONGS_TO, 'LocalizedString', 'NameStringTemplateId',
            'condition' => 'nameStringTemplate.LocaleCode = \''.$localeCode.'\''),
    );
}

読み取り専用プロパティを追加します。

public function getName() {
    return $this->nameStringTemplate->StringTemplate;
}

$room->nameこれにより、どこにでも書き込めるようになり、アプリケーションの現在の言語のローカライズされた翻訳が自動的に返されます。

対処する必要のある多くの詳細があり、ここでは詳しく説明していませんが、アイデアは明らかなはずです。

于 2012-08-01T14:07:52.337 に答える