Silverstripe 3 создайте декоратор для TreeDropDownField, чтобы я мог перегрузить функцию дерева

В Silverstripe 3 у нас возникают проблемы при создании декоратора для TreeDropDownField, чтобы мы могли перегрузить функцию дерева и скрыть типы страниц из списка.

Мы создали:

<?php

class TreeDropdownFieldDecorator extends Extension {

public function tree(SS_HTTPRequest $request) { ...

И в _config / config.yml:

TreeDropdownField:
extensions:
- TreeDropdownFieldDecorator

Однако на самом деле мы не заставляем нашу функцию дерева вызываться вместо первоначальной. Это расширяется в декораторе, и если нет, есть ли другой способ сделать это?

1

Решение

Похоже, вы неправильно используете расширения. Они не перегружают методы, как это делают подклассы. Они внедряют новые методы в существующие классы, и основной класс также может вызывать -> extended («someMethod»); предложить вам возможность изменить собственные методы во время выполнения, например, «UpdateCMSFields», но с точки зрения просто перегрузки метода, это может быть сделано только подклассом.

Два варианта:

1) Используйте любое количество хуков, которые предлагает TreeDropdownField. (setFilterFunction () выглядит как лучший кандидат для меня … принимает произвольный обратный вызов), но есть и такие вещи, как setChildrenMethod () и другие.

2) Используйте Инжектор, чтобы создать свой собственный TreeDropdownField.

Injector:
TreeDropdownField:
class: MyTreeDropdownFieldSubclass

И в вашем FieldList:

TreeDropdownField::create(...);

Обратите внимание, что новый класс не будет введен, если вы просто используете оператор «new».

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]