微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverstripe 4.7 - manymanyextrafields - 如何使用它们?

如何解决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 举报,一经查实,本站将立刻删除。