因为将站点移动到“配置”选项卡下的新服务器表单字段不再保存到数据库。运行与旧服务器、SilverStripe2.3.3和PHP5.2.17相同的配置。看不到正在抛出的任何日志或php错误。
其他字段保存正常,因此问题特定于此字段集。
我假设这是负责函数的代码。有人能看出这不起作用的明显原因吗?是吗?

<?php

class Product extends Page {

public static $db = array(
    'ProductIntro' => 'Text',
    'ProductPrice' => 'Text',
    'SpecialOffer' => 'Boolean',
    'HidePrice' => 'Boolean',
    'OneMonthPrice' => 'Currency',
    'ThreeMonthPrice' => 'Currency',
    'FourMonthPrice' => 'Currency',
    'SixMonthPrice' => 'Currency',
    'OutrightPrice' => 'Currency',
    'DeliveryPrice' => 'Currency',
    'DefaultPrice' => 'Enum("OneMonthPrice,ThreeMonthPrice,FourMonthPrice,SixMonthPrice","OneMonthPrice")',
    'VideoEmbedCode' => 'HTMLText'
);

public static $has_one = array(
    'ProductImage' => 'EnhancedImage'
);

public static $has_many = array(
    'ProductGalleryImages' => 'ProductGalleryImage',
    'ProductDownloads' => 'ProductDownload'
);

public static $many_many = array(
    'RelatedProducts' => 'Product'
);

static $belongs_many_many = array(
    'IsRelatedProduct' => 'Product'
);


static $allowed_children = array( );


public function getNextSibling() {

    return DataObject::get("Product", "ParentID = $this->ParentID && Sort > $this->Sort && Status = 'Published'", "Sort ASC", null, 1);
}

public function getPreviousSibling() {
    return DataObject::get("Product", "ParentID = $this->ParentID && Sort < $this->Sort && Status = 'Published'", "Sort DESC", null, 1);
}


public function SiblingProducts() {
     if ($this->getField("ParentID")) {

        return DataObject::get("Product", "ParentID = " . $this->getField("ParentID").' AND `SiteTree_Live`.ID != '.$this->getField("ID"));
    } else return false;
}

public function SubCategory() {
    if ($this->getField("ParentID")) {
        return DataObject::get_one("ProductSubCategory", "`SiteTree_Live`.ID = " . $this->getField("ParentID"));
    } else return false;
}

public function HasSubCategory() {
    if ($this->SubCategory()) {
        return true;
    } else {
        return false;
    }
}

public function Category() {
    if ($this->HasSubCategory()) {
        $parent_id = $this->SubCategory()->getField("ParentID");
    } else {
        $parent_id = $this->getField("ParentID");
    }
    if ($parent_id) {
        return DataObject::get("ProductCategory", "`SiteTree_Live`.ID = " . $parent_id);
    } else return false;
}

public function IsFeaturedProduct() {
    $hp = DataObject::get_one("ProductHomepage");
    if ($hp) {
        if ($hp->FeaturedProduct()) {
            if ($hp->FeaturedProduct()->getField('ID') && $hp->FeaturedProduct()->getField('ID') == $this->getField('ID')) return true;
        }
    }
    return false;
}

public function IsCategorySpecial() {

    if( $this->parent()->CategoryFeaturedProductID == $this->ID ) {
        return true;
    }

    return false;
}


function onAfterWrite() {
if (isset($_POST['AddedViaObjectManager']) && $_POST['SetPageToLive'] && $this->stagesDiffer('Stage','Live')) {
    $this->Status = 'Published';
    $this->Publish('Stage', 'Live');
}
parent::onAfterWrite();
}

function getCMSFields_forPopup() {
  $fields = new FieldSet();
  $fields->push( new TextField( 'Title', 'Product Title' ) );
  $fields->push( new TextField( 'ProductIntro', 'Product Intro' ) );
  $fields->push( new TextField( 'ProductPrice', 'Price ($)' ) );
  $fields->push( new CheckboxField( 'SpecialOffer', 'This Product is a Special Offer' ) );
  $record = DataObject::get('ProductSubCategory', "");
  if ($record) {
      $map = $record->toDropDownMap('ID', 'Title');
  } else {
      $map = array();
  }
  $fields->push( new DropdownField('ParentID','Sub Category',$map) );
  $fields->push( new SimpleHTMLEditorField( 'Content', 'Content' ));
  $fields->push( new DropdownField('SetPageToLive','After Update, Set Product Page To:',array('1'=>'Live','0'=>'Draft')) );
  $fields->push( new FileIFrameField('ProductImage') );
  $fields->push( new HiddenField('AddedViaObjectManager','AddedViaObjectManager',1) );
  return $fields;
}

function getCMSFields() {
  $fields = parent::getCMSFields();

  $product = new VerticalTabSet(
        new VerticalTab('Configuration',array(
            new LiteralField("ConfDescription","<br /><em>Product pages support a range of additional features such as pricing.</em><br /><br />"),
            new TextField('ProductIntro', 'Intro Text'),
            new TextField('ProductPrice', 'From Text (Formerly Price)'),
            new CheckboxField("HidePrice","Hide Price"),
            new CheckboxField("SpecialOffer","This Product is currently on special."),
            new LiteralField("ldiv","<br /><br /><h2>Pricing</h2>"),
            new CurrencyField("OneMonthPrice", "One Month Hire Price"),
            new CurrencyField("ThreeMonthPrice", "Three Month Hire Price"),
            new CurrencyField("FourMonthPrice", "Four Month Hire Price"),
            new CurrencyField("SixMonthPrice", "Six Month Hire Price"),
            new CurrencyField("OutrightPrice", "Outright Purchase Price"),
            new CurrencyField("DeliveryPrice", "Delivery Price"),
            new DropDownField("DefaultPrice", "Selected Pricing Option", array('OneMonthPrice'=>'1 Month','ThreeMonthPrice'=>'3 Month','FourMonthPrice'=>'4 Month','SixMonthPrice'=>'6 Month'))
        )),
        new VerticalTab('RelatedProducts',array(
            new LiteralField("RelatedDescription","<br /><em>Related products are displayed on a product page to direct users to other options.</em><br /><br />"),
            new ManyManyDataObjectManager(
                $this, // Controller
                'RelatedProducts', // Source name
                'Product', // Source class
                array(
                    'Title' => 'Title'
                ), // Headings
                'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
            )
        )),
        new VerticalTab('Images',array(
            new LiteralField("ImageryDescription","<br /><em>The Main Image is used as the default image for this product.</em><br /><br />"),
            new FileIFrameField('ProductImage', 'Main Image'),
            new LiteralField ("ProdImages",'<br /><h4 style="margin-bottom:0px;padding-bottom:0px;">Upload Product Images</h4><br /><em>Supports all image types, however web images are recommended.</em><br /><br />'),
            new ImageDataObjectManager(
                $this, // Controller
                'ProductGalleryImages', // Source name
                'ProductGalleryImage', // Source class
                'Image', // File name on DataObject
                array(
                    'Title' => 'Title'
                ), // Headings
                'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
            )
        )),
        new VerticalTab('Downloads',array(
            new LiteralField("ImageryDescription","<br /><em>Add files users can download.</em><br /><br />"),
            new FileDataObjectManager(
                $this, // Controller
                'ProductDownloads', // Source name
                'ProductDownload', // Source class
                'File', // File name on DataObject
                array(
                    'Title' => 'Title'
                ), // Headings
                'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
            )
        )),
        new VerticalTab('Video',array(
            new LiteralField("VideoDescription","<br /><em>Add the embed code here.</em><br /><br />"),
            new TextareaField('VideoEmbedCode', 'Video Embed Code', 4)
        ))
  );

  $product->setOpenTab('Configuration');

  //$fields->addFieldToTab("Root.Content.Product",$product);

  $fields->insertAfter(new Tab('Configuration',$product),'Main');



  //$fields->insertAfter(new Tab('Related Products',$product_rel),'Main');



  //$main = $fields->fieldByName('Main');

  //$main->title = 'Product Details';


  return $fields;
}

 function HirePrices() {
   $prices = new DataObjectSet();

   $keys = array(
     'OneMonthPrice' => 'One Month',
     'ThreeMonthPrice' => 'Three Month',
     'FourMonthPrice' => 'Four Month',
     'SixMonthPrice' => 'Six Month',
   );
   $f = true;
   foreach($keys as $price_item => $title) {
       if ($this->$price_item > 0) {
           $p = $this->$price_item;
           $prices->push(new ArrayData( array(
                'price' => $p,
                'nice_price' => '$'.number_format($p,2),
                'title' => $title,
                'First' => $f,
                'IsDefault' => ($this->DefaultPrice == $price_item) ? true : false
            )));
           $f = false;
       }
   }

   return ($prices) ? $prices : false;

}

}

class Product_Controller extends Page_Controller {

public function init() {
    parent::init();

}

function Category() {
    return $this->data()->Category();
}

function SiblingProducts() {
    return $this->data()->SiblingProducts();
}



}

?>

最佳答案

从SilverStripe3.1中的$db和其他定义必须声明为private static变量,这样它们就可以被配置系统缓存(和覆盖)。

<?php

class Product extends Page {

private static $db = array(
...
);

也有一个module that upgrades your code for you并且为在3.x上运行旧的2.4代码做了90%的工作。

关于php - Silverstripe-CMS字段未保存到数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37626113/

10-09 07:59