如何解决silverstripe 4.7 - manymanyextrafields - 如何使用它们?
我有一个“Product”类和一个“MaterialOrder”类。 它们共享一个 many_many 关系,其中 MaterialOrder 中的 Products 具有额外字段“PriceSum”和“Quantity”。所以从理论上讲,有人应该能够订购一些东西,他可以看到所有活动产品的列表,每个条目上都有一个输入字段来定义他想要的商品数量。点击创建后,它应该使用当前价格总和和定义的数量创建一个新的材料订单条目。
现在我找不到任何如何正确访问这些额外字段的方法,我也不知道如何在网格字段中添加输入字段,然后使用信息保护新的 materialorder 对象...
MaterialOrder.PHP
<?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;
}
}
Product.PHP
<?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");
}
}
解决方法
我不久前遇到过这个问题,并在 my blog 中写过。
在您的情况下,您必须添加 MaterialOrder::getCMSields()
之类的内容
$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表单中的manymany字段。
我们获取网格字段配置的 GridFieldDetailForm 组件,并通过向 MaterialOrder 的 CMSFields 添加一个字段来修改它。使用 setItemEditFormCallback() 方法,我们可以添加一个匿名函数来添加所需的字段。 Manymany extraFields 使用 ManyMany[FieldName] 语法保存,所以我们需要 ManyMany[Price] 作为 FieldName;我们还需要从 $itemrequest->record 中获取当前值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。