В Silverstripe 3 у нас возникают проблемы при создании декоратора для TreeDropDownField, чтобы мы могли перегрузить функцию дерева и скрыть типы страниц из списка.
Мы создали:
<?php
class TreeDropdownFieldDecorator extends Extension {
public function tree(SS_HTTPRequest $request) { ...
И в _config / config.yml:
TreeDropdownField:
extensions:
- TreeDropdownFieldDecorator
Однако на самом деле мы не заставляем нашу функцию дерева вызываться вместо первоначальной. Это расширяется в декораторе, и если нет, есть ли другой способ сделать это?
Похоже, вы неправильно используете расширения. Они не перегружают методы, как это делают подклассы. Они внедряют новые методы в существующие классы, и основной класс также может вызывать -> extended («someMethod»); предложить вам возможность изменить собственные методы во время выполнения, например, «UpdateCMSFields», но с точки зрения просто перегрузки метода, это может быть сделано только подклассом.
Два варианта:
1) Используйте любое количество хуков, которые предлагает TreeDropdownField. (setFilterFunction () выглядит как лучший кандидат для меня … принимает произвольный обратный вызов), но есть и такие вещи, как setChildrenMethod () и другие.
2) Используйте Инжектор, чтобы создать свой собственный TreeDropdownField.
Injector:
TreeDropdownField:
class: MyTreeDropdownFieldSubclass
И в вашем FieldList:
TreeDropdownField::create(...);
Обратите внимание, что новый класс не будет введен, если вы просто используете оператор «new».
Других решений пока нет …