2 に答える
ドロップダウン値を提供する関数を変更できます。呼び出しDataObject::get()
には、2 番目の引数のフィルターを含めることができます。CarID が 0 の所有者をすべて選択するだけです。
したがって、提供したチュートリアルから、この変更されたコードを使用できます。
new DropdownField(
'OwnerID',
'Please choose an owner',
Dataobject::get("Owner","CarID='0'")->map("ID", "Title", "Please Select")
);
2 つの注意事項:
これは、DataObjects が呼び出され、(必要に応じて変更しますが、上記のように名前の末尾にある ID を保持することを前提として
Car
いOwner
ます)$has_one
これは、DataObjectの割り当てとの関係の設定方法によっては機能しない場合があります。CarID
テーブルにフィールドがない場合Owner
、このコードは役に立ちません (逆に設定することもできます)。その場合、すべての車をループし、その DataObjectSet からOwnerID
が 0 の DataObjects を削除する関数を作成する必要があります。これが意味をなさない場合は、コメントを追加してください。
Benjamin Smith の回答は、あなたが求めていたドロップダウンに対して完全に有効です。別のアプローチを示したかっただけです。1 対 1 の関係を自分で処理する代わりに、これを処理する 'HasOneComplexTableField' があります。
Car クラスに次のコードを使用します。
class Car extends Page {
public static $has_one = array(
'Owner' => 'Owner'
);
function getCMSFields() {
$fields = parent::getCMSFields();
$tablefield = new HasOneComplexTableField(
$this,
'Owner',
'Owner',
array(
'Title' => 'Title'
)
);
$tablefield->setParentClass('Car');
$tablefield->setOneToOne();
$tablefield->setPermissions(array());
$fields->addFieldToTab('Root.Content.Owner', $tablefield);
return $fields;
}
}
「setOneToOne()」呼び出しに注意してください。これは、別の車でまだ選択されていない所有者のみを選択できるようにテーブルフィールドに指示します。
この詳細については、silverstripe チュートリアルを参照してください: http://doc.silverstripe.org/framework/en/tutorials/5-dataobject-relationship-management