Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php silverstripe 4.7-许多外部字段-如何使用它们?_Php_Many To Many_Silverstripe 4 - Fatal编程技术网

Php silverstripe 4.7-许多外部字段-如何使用它们?

Php silverstripe 4.7-许多外部字段-如何使用它们?,php,many-to-many,silverstripe-4,Php,Many To Many,Silverstripe 4,我有一个“产品”类和一个“材料订单”类。 它们共享一个多-多关系,其中MaterialOrder中的产品具有外字段“PriceSum”和“Quantity”。因此,从理论上讲,人们应该能够订购一些东西,在那里他可以看到所有活动产品的列表,每个条目上都有一个inputfield来定义他想要的产品数量。点击“创建”按钮后,应使用当前价格和定义的数量创建一个新的materialorder条目 现在我找不到任何正确访问这些额外字段的方法,我也不知道如何在gridfield中添加inputfield,然后

我有一个“产品”类和一个“材料订单”类。 它们共享一个多-多关系,其中MaterialOrder中的产品具有外字段“PriceSum”和“Quantity”。因此,从理论上讲,人们应该能够订购一些东西,在那里他可以看到所有活动产品的列表,每个条目上都有一个inputfield来定义他想要的产品数量。点击“创建”按钮后,应使用当前价格和定义的数量创建一个新的materialorder条目

现在我找不到任何正确访问这些额外字段的方法,我也不知道如何在gridfield中添加inputfield,然后用这些信息保护新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;
    }
}
<?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中获取当前值