web-dev-qa-db-ja.com

言語によるフォームフィールド値のフィルタリング

選択したメニュー言語のカテゴリのみを表示するという特定の要件があります。したがって、私のコンポーネントでは、フィールドを以下のように宣言しています。

<field name="catid" type="categoryedit" label="JCATEGORY" description="JFIELD_CATEGORY_DESC" class="inputbox input-block-level" required="true"></field>

モデルでは、メニュー言語に基づいてフィールド属性を動的に設定しています。

public function getForm ($data = array(), $loadData = true)
{
  ....
  $language = JFactory::getLanguage()->getTag();
  $form->setFieldAttribute('catid', 'language', $language);
  ....
}

それは完全に正常に動作します。ただし、唯一の問題は、選択した言語のみを対象とするリストのみが表示されることです。たとえば、en-GBは、言語en-GBに割り当てられている値のリストのみを表示します。

選択した言語に割り当てられているすべてのフィールド値と「すべて」(または「*」、つまり言語が選択されていない)を表示する必要があります。

同じフィールド属性に2つの値を設定することはできません。2つの時間の上書きの拳に設定します。

$form->setFieldAttribute('catid', 'language', '*');

これはまったく機能しません

$form->setFieldAttribute('catid', 'language', $language.', *');

誰でもどのようにこれを行うことができますか?

1
Nagarjun

多くの調査の後、私はこれに対する可能な解決策を見つけることができませんでした。そのため、categoryeditフィールドタイプをオーバーライドし、getOptionsメソッドで次のコードを変更しました(フォームのxmlで参照できるように、フィールドをコンポーネントのmodels/fieldsディレクトリに作成できます)

// Filter language
if (!empty($this->element['language']))
{
    $subQuery->where('language = ' . $db->quote($this->element['language']));
}

// Filter language
$languages = array(JFactory::getLanguage()->getTag(), '*');
if (!empty($this->element['language']))
{
    $languages[] = $this->element['language'];
}

$subQuery->where('language IN (' . implode(',', $db->quote($languages)).')');

これが同様の解決策を探している人を助けることを願っています。

1
Nagarjun

Xml(models/forms/yourform.xml)フィールド定義を変更して、次のような追加のオプションを含めることができます。

<field name="catid" type="contentlanguage" label="yourlabel"
description="yourdescription">
<option value="*">JALL</option></field>

JALLは自動的にあなたの言語「すべて」のWordに翻訳されます。

それが役に立てば幸い

0
itsam