SilverStripe 4.0.3 DataObject onBeforeWrite出现Undefined Index错误
解决SilverStripe 4.0.3中DataObject的Undefined index: PrezzoIva问题
首先,这个错误大概率是因为你在onBeforeWrite方法里直接通过数组索引(比如$this->record['PrezzoIva']或者$_POST['PrezzoIva'])访问字段导致的——SilverStripe的DataObject字段应该通过对象属性或者官方提供的字段方法来操作,直接碰内部的数组存储很容易触发索引未定义的提示。
结合你的需求(在write前计算并同步保存PrezzoIva),给你一套正确的实现方案:
1. 修正onBeforeWrite的字段操作方式
不要直接操作$this->record这个内部数组,改用SilverStripe推荐的方式访问和设置字段:
- 读取字段:用
$this->PrezzoIva或者$this->getField('PrezzoIva') - 设置字段:直接赋值
$this->PrezzoIva = $计算后的值,或者用$this->setField('PrezzoIva', $计算后的值)
2. 完整的示例代码
假设你的Prodotto类还有PrezzoNetto(不含税价格)和IvaPercentuale(税率百分比)字段,用来计算PrezzoIva,代码可以这么写:
/** * Classe Prodotto */ class Prodotto extends DataObject { // 声明属性 private static $db = [ // 其他字段... 'PrezzoNetto' => 'Currency', 'IvaPercentuale' => 'Decimal', 'PrezzoIva' => 'Currency', // 其他字段... ]; /** * Metodo gestione calcolo PrezzoIva prima del salvataggio */ public function onBeforeWrite() { // 必须先调用父类的onBeforeWrite,否则会破坏SilverStripe的生命周期流程 parent::onBeforeWrite(); // 处理字段可能为空的情况,用空合并运算符设置默认值 $prezzoNetto = $this->PrezzoNetto ?? 0; $ivaPercentuale = $this->IvaPercentuale ?? 0; // 计算含税后价格 $this->PrezzoIva = $prezzoNetto * (1 + ($ivaPercentuale / 100)); } }
3. 关键注意点
- 必须调用父类方法:
parent::onBeforeWrite()一定要放在方法开头,SilverStripe需要通过这个来处理内部的前置逻辑 - 避免直接用$_POST:表单提交的数据已经自动绑定到DataObject实例上了,直接访问
$this->字段名就能拿到值,不需要自己读POST数组 - 处理空值:用
??运算符给字段设置默认值,避免因为字段为空导致的计算错误或者警告
这样修改后,既不会触发Undefined index的提示,也能确保在保存前正确计算并同步PrezzoIva的值。
内容的提问来源于stack exchange,提问作者user7554217
相关产品推荐
相关产品推荐

