Php silverstripe 4.7-许多外部字段-如何使用它们?
我有一个“产品”类和一个“材料订单”类。 它们共享一个多-多关系,其中MaterialOrder中的产品具有外字段“PriceSum”和“Quantity”。因此,从理论上讲,人们应该能够订购一些东西,在那里他可以看到所有活动产品的列表,每个条目上都有一个inputfield来定义他想要的产品数量。点击“创建”按钮后,应使用当前价格和定义的数量创建一个新的materialorder条目 现在我找不到任何正确访问这些额外字段的方法,我也不知道如何在gridfield中添加inputfield,然后用这些信息保护新materialorder对象 MaterialOrder.phpPhp silverstripe 4.7-许多外部字段-如何使用它们?,php,many-to-many,silverstripe-4,Php,Many To Many,Silverstripe 4,我有一个“产品”类和一个“材料订单”类。 它们共享一个多-多关系,其中MaterialOrder中的产品具有外字段“PriceSum”和“Quantity”。因此,从理论上讲,人们应该能够订购一些东西,在那里他可以看到所有活动产品的列表,每个条目上都有一个inputfield来定义他想要的产品数量。点击“创建”按钮后,应使用当前价格和定义的数量创建一个新的materialorder条目 现在我找不到任何正确访问这些额外字段的方法,我也不知道如何在gridfield中添加inputfield,然后
<?php
use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Member;
use SilverStripe\Forms\CurrencyField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TabSet;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\GridField\GridField;
class MaterialOrder extends DataObject
{
private static $db = [
"LastReminder" => "Date",
"IsOrdered" => "Boolean",
"IsPaid" => "Boolean"
];
private static $has_one = [
"Member" => Member::class
];
private static $many_many = [
"Products" => Product::class
];
private static $many_many_extraFields = [
"Products" => [
"PriceSum" => "Currency",
"Quantity" => "Int"
]
];
public function getCMSfields()
{
$fields = FieldList::create(TabSet::create("Root"));
$fields->addFieldsToTab("Root.Main", [
$grid = GridField::create("Products", "Products", Product::getAllProducts(true))
]);
// GridField configuration
$config = $grid->getConfig();
return $fields;
}
}
<?php
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Forms\CurrencyField;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TabSet;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataObject;
class Product extends DataObject
{
private static $db = [
"Name" => "Varchar",
"Price" => "Currency",
"IsActive" => "Boolean",
];
private static $has_one = [
"Category" => Category::class,
"Image" => Image::class,
];
private static $belongs_many_many = [
"MaterialOrders" => MaterialOrder::class,
];
private static $summary_fields = array(
"IsActive" => "Is active?",
"Name" => "Name",
"Category.Title" => "Category",
"Price" => "Price",
);
public function getCMSfields()
{
$fields = FieldList::create(TabSet::create("Root"));
$fields->addFieldsToTab("Root.Main", [
CheckboxField::create("IsActive", "Is active?"),
TextField::create("Name"),
CurrencyField::create("Price", "Price (per piece)"),
DropdownField::create("CategoryID", "Category")
->setSource(Category::get()->map("ID", "Title")),
$upload = UploadField::create(
"Image",
"Product image"
),
]);
$upload->getValidator()->setAllowedExtensions(array(
"png", "jpeg", "jpg", "gif",
));
$upload->setFolderName("product-images");
return $fields;
}
public static function getAllProducts($filterValue = null)
{
$products = Product::get();
if (!is_null($filterValue)) {
$products = $products->filter(["IsActive" => $filterValue]);
}
return $products->sort("Name");
}
}
我不久前遇到了这个问题,并在中写下了它
在您的情况下,必须添加MaterialOrder::getcmsiels()
类似的内容
$detailFormComponent = $grid->getConfig()->getComponentByType(GridFieldDetailForm::class);
$detailFormComponent->setItemEditFormCallback(function ($form, $itemrequest) {
$record = $itemrequest->record;
$priceField = CurrencyField::create('ManyMany[Price]', 'Price (per piece)', $record->Price);
$form->Fields()->add($priceField);
});
编辑deatail表单中的许多字段
我们获取网格字段配置的GridFieldDetailForm组件,并通过向MaterialOrder的CMSFields添加一个字段来修改它。使用setItemEditFormCallback()方法,我们可以添加一个匿名函数来添加所需的字段。许多外部字段是使用Manymany[FieldName]语法保存的,因此我们需要Manymany[Price]作为字段名;我们还需要从$itemrequest->record中获取当前值