Silverstripe - cms字段未保存到数据库

时间:2016-06-04 03:42:07

标签: php database silverstripe

由于将站点移动到配置选项卡下的新服务器表单字段,因此不再保存到数据库。运行与旧服务器,SilverStripe 2.3.3和PHP 5.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();
}



}

?>

2 个答案:

答案 0 :(得分:3)

来自$db上的Silverstripe 3.1,其他定义必须声明为private static变量,因此配置系统可以缓存(并覆盖)它们。

<?php

class Product extends Page {

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

还有module that upgrades your code for you并且有90%的工作用于在3.x上运行旧的2.4代码。

答案 1 :(得分:3)

虽然鼓励人们升级是合理的建议,但OP似乎有理由此时不这样做。

如果服务器配置和PHP版本相同,那么好 - 但数据库怎么样?您没有提到您在旧主机上使用的RDBMS和版本,以及您在新主机上使用的内容。

第一件事是第一件事 - 是否确实没有记录服务器错误?在您的新设置中,您的php.ini文件是否与旧服务器中的文件相匹配?这个问题只出现在dev或prod中吗?在您的开发环境中,我强烈建议您将error_reporting设为E_ALL,将dislay_errors设为on。检查php.ini说它记录错误的位置。这可以是服务器的syslog,apache日志或专用的php_errors日志文件。确保每个文件都是可读写的,否则不记录任何内容。

向下看你的数据模型我可以看到一些对DataObject::get()的调用,其中一些原始SQL作为SQL WHERE子句插入。这是可以的,但有些似乎不一致地逃脱(至少它们与你逃脱其他此类条款的方式不同),例如getPreviousSibling()getNextSibling()。您的RDBMS(MySQL,Postgres等)是否可能是一个不同的版本,对于如何构造和转义传入查询有不同的期望?

您是否检查了RDBMS的查询日志?这是什么意思?