1 回答

TA貢獻1847條經驗 獲得超7個贊
我相信,問題最終是遞歸的。因為子表單也將有一個children字段,所有子表單也將有children字段......無限。因此,它只是為了創建它而耗盡了內存。(這個問題只在添加時發生prototype,因為它必須渲染一個未來的孩子,它也有原型,并且必須做同樣的事情 - 請注意,表單組件不是處理遞歸的最佳裝備。也許你可以找到一個技術上和視覺上處理這個問題的不同方式,例如 (pos,string,depth) 元組的列表,通過表單渲染/js 進行光學改進,并進行轉換等)
所以你必須限制這個遞歸的深度。一種通用的方法(我不確定這是否有效)是添加一個選項max_depth,它基本上告訴表單生成器它是否可以以及還有多少級別。
為此,您的表單類型類應包含一個方法configureOptions:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setRequired(['max_depth']);
$resolver->setDefaults([
'data_class' => Chapter::class, // you probably have this line!
'max_depth' => 3, // default value
]);
}
這會將配置選項添加到您的表單類型,現在我們必須在您的buildForm方法中使用它:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('libelleLong', textType::class, ['label'=> 'titre']);
// only add children sub form, if max_depth > 0, to stop infinite recursion
if($options['max_depth'] > 0) {
$builder->add('children', CollectionType::class,[
'entry_type' => ChapterType::class,
'entry_options' => [
'label' => false,
'block_name' => 'childrenList',
// IMPORTANT!!! reduce max_depth by 1
'max_depth' => $options['max_depth'] - 1,
],
'block_name' => 'childrenList',
'label'=> false,
'allow_add' => true,
'allow_delete'=> true,
'prototype'=> true,
'by_reference' => false,
]);
} // end if for max_depth
}
我會建議保持max_depth小,比如...... 2 或 3。
另一種方法是,創建另一種名為 SubChapterType 和 SubSubChapterType 的表單類型,它們本質上與 ChapterType 相同,只是它們的 是children下entry_type一個表單類型,其中最后一個表單類型沒有字段 children。
- 1 回答
- 0 關注
- 111 瀏覽
添加回答
舉報