Silverstripe Framework模型管理、数据对象关系和选项设置字段保存到数据库中

Silverstripe Framework模型管理、数据对象关系和选项设置字段保存到数据库中,silverstripe,modeladmin,Silverstripe,Modeladmin,我正在建立一个网上商店。我正在尝试实现一个has_one:has_many关系,我正在使用ModelAdmin和单选按钮(Silverstripe中的OptionsetField)来管理DataObjects,但我有两个问题 在CMS中单击“保存”时,关系值未保存到数据库中 该状态不会持续,因此当我下次登录CMS时,我可以看到上次选择的单选按钮 接下来是我的代码 ----模型管理员---- 由于页面是一个has_-one关系,您需要将后缀ID添加到formfield(是的,这对初学者来说很烦人)

我正在建立一个网上商店。我正在尝试实现一个has_one:has_many关系,我正在使用ModelAdmin和单选按钮(Silverstripe中的OptionsetField)来管理DataObjects,但我有两个问题

  • 在CMS中单击“保存”时,关系值未保存到数据库中

  • 该状态不会持续,因此当我下次登录CMS时,我可以看到上次选择的单选按钮

  • 接下来是我的代码

    ----模型管理员----


    由于页面是一个has_-one关系,您需要将后缀ID添加到formfield(是的,这对初学者来说很烦人)

    所以

    应该有用。同一类别在子类别中有一个

    您已在代码中声明

    //将导致在表BoysCategory上创建列BoysPageID

    这是因为has_one关系Foo作为FooID保存在DB中,所以我们需要手动将ID添加到formfield中

    <?php
    
    class ProductAdmin extends ModelAdmin {
    
        private static $menu_title = 'Store Manager';
    
        private static $url_segment = 'StoreManager';
    
        private static $managed_models = array (
            'Product'=>array('title'=>'All Store Products'),
            'ProductCategory'=>array('title'=>'Product Categories'),
            'ProductSubcategory'=>array('title' => 'Product Sub Categories')
        );
    
        public $showImportForm = false;
    
        }
    
    <?php
    
        class ProductCategory extends DataObject {
    
            private static $db = array (
                'Title' => 'Varchar',
            );
    
            /**
             * This relation links the Category to the Menu Items e.g. Category BoysClothing will be related to Boys * Menu Item.
             */
            private static $has_one = array(
                'Page' => 'Page'
            );
    
            private static $has_many = array (
                'Subcategories' => 'ProductSubcategory'
            );
            public function getCMSFields(){
                $fields = FieldList::create(TabSet::create('Root'));
    
                $fields->addFieldsToTab('Root.Main', array(
                    TextField::create('Title', 'Name of Category'),
    
                    OptionsetField::create(
                        'Page', //name
                        'Page this category belongs to', //title
                        SiteTree::get()->filter(array('ShowInMenus' => '1'))->map('ID', 'Title'),
                        1
                    )
    
                )//close array of fields
                );//end adding fields to main tab 
    
                return $fields;
            }
    }
    
    <?php
    
        class ProductSubcategory extends DataObject {
    
            private static $db = array (
                'Title' => 'Varchar',
            );
    
            /**
             * This relation links the Sub Category to the Category e.g. Category Khakis will be related to Boys 
             * Category
             *
             */
            private static $has_one = array(
                'Category' => 'ProductCategory'
            );//will lead to creation of column BoysPageID on the table BoysCategory
    
            private static $has_many = array (
                'Products' => 'Product'
            );
    
             public function getCMSFields(){
                $fields = FieldList::create(TabSet::create('Root'));
    
                $fields->addFieldsToTab('Root.Main', array(
                    TextField::create('Title', 'Name of Sub Category'),
                    DropdownField::create(
                      'Category',
                      'Category this subcategory belongs to',
                      ProductCategory::get()->map('ID', 'Title')
                    )
    
    
                )//close array of fields
                );//end adding fields to main tab 
    
                return $fields;
            }
    
    
        }//end class
    
        ---- Product ----
        <?php
    
        class Product extends DataObject{
            private static $db = array (
                'Title'     => 'Varchar(255)',
                'Price'     => 'Varchar',
                'Colors'    => 'Varchar',
                'Sizes'     => 'Varchar',
                'FeaturedOnHomepage' => 'Boolean'
            );
    
            private static $has_one = array (
                'PrimaryPhoto' => 'Image',
                'ProductSubcategory' => 'ProductSubcategory'
            );
    
    
            static $summary_fields = array (
                'Title' => 'Name',
                'Price' => 'Price',
                'FeaturedOnHomepage.Nice' => 'Featured?',
                'Thumbnail' => 'Picture'
            );
    
    
    
            public function getCMSFields(){
                $fields = FieldList::create(TabSet::create('Root'));
    
                $fields->addFieldsToTab('Root.Main', array(
                    TextField::create('Title', 'Name of product'),
                    TextField::create('Price', 'Price of product'),
                    TextField::create('Colors', 'Available Colors'), //Make this a checkbox set or multiselect drop down
                    TextField::create('Sizes', 'Available Sizes'), //Make this a checkbox set or multiselect drop down
                    CheckboxField::create('FeaturedOnHomepage', 'Feature On HomePage'),
                    CheckboxSetField::create(
                        'ProductSubcategory',
                        'Sub categories this product belongs to',
                        ProductSubcategory::get()->map('ID', 'Title')
                    ),
                    $primary_photo = UploadField::create('PrimaryPhoto', 'Product Primary Photo')
                )//close array of fields
                );//end adding fields to main tab 
    
                //Add other photos related to this image in a deifferent tab
                $other_product_photos = UploadField::create('ProductImages', 'Product Photo');
                $fields->addFieldsToTab('Root.Other Photos', $other_product_photos);
    
                //limit image extensions
                $primary_photo->getValidator()->setAllowedExtensions(array('jpg', 'jpeg', 'png', 'gif'));
                $other_product_photos->getValidator()->setAllowedExtensions(array('jpg', 'jpeg', 'png', 'gif'));
    
                //set Folders
                $primary_photo->setFolderName('ProductPhotos');
                $other_product_photos->setFolderName('ProductPhotos');
    
    
                //return
                return $fields;
            }
    
    
            public function Link(){
                $sview_link = "prods/sview/";
                return $sview_link.$this->ID;
            }
    
            public function getThumbnail(){
                if($this->PrimaryPhoto()->ID){
                    return $this->PrimaryPhoto()->setWidth(80);
                }else{
                    return 'No Image';
                }
            }
    
    
        }//close class Product
    
                OptionsetField::create(
                    'PageID', //name
                    'Page this category belongs to', //title
                    SiteTree::get()->filter(array('ShowInMenus' => '1'))->map('ID', 'Title'),
                    1
                )