2017-01-24 4 views
0

Ich habe einen Kundencontroller, der ein Formular enthält. Ich möchte ein Formular von einem anderen Controller zu derselben Kundenseite hinzufügen. Gibt es eine Möglichkeit, dies in der Silverstripe-Leiste mit einem iFrame zu tun?Silverstripe - Controller in den Controller einbeziehen

+0

Wenn Sie eine „Include“ Vorlage für diese Form haben, können Sie, dass aus einer anderen Vorlage enthalten kann, Ja –

Antwort

1

gut, ja, aber Sie müssen wahrscheinlich einige Änderungen an Ihrem Code.

gibt es zwei Hauptansätze ich Ihr Ziel zu erreichen denken kann:

1. trennt die Formularerstellung aus der Controller-Aktion:

class Foo extends Controller { 
    private static $allowed_actions = ['FooForm', 'BarForm']; 

    public function FooForm() { 
     return new Form($this, __FUNCTION, new FieldList(), new FieldList()); 
    } 

    public function BarForm() { 
     return Bar::get_bar_form($this, __FUNCTION__); 
    } 
} 

class Bar extends Controller { 
    private static $allowed_actions = ['BarForm']; 

    public function BarForm() { 
     return static::get_bar_form($this, __FUNCTION__); 
    } 

    /** 
    * A static function that accepts the controller (Bar or Foo in this case) and a name 
    * This way, this form can easily be used on other controllers as well 
    * Just be aware that this way, the Forms controller is not always the same, so if you have a custom form that calls specific methods of the Bar controller this will not work 
    */ 
    public static function get_bar_form($controller, $name) { 
     return new Form($controller, $name, new FieldList(), new FieldList()); 
    } 
} 

2. verschachtelter Controller:

Mit SilverStripe können Sie Controller verschachteln. Dies ist im Wesentlichen was Forms bereits tun. Ein SilverStripe-Formular ist ein Controller (oder besser RequestHandler).
In SilverStripe kann jede Controller Aktion eine andere RequestHandler (Controller ist eine Unterklasse von RequestHandler) zurückgeben, die dann verarbeitet wird.

So können Sie den gesamten Bar-Controller aus dem Foo Controller zurückgeben und es als Kind-Controller laufen lassen. Die URL könnte also /foo/bar/BarForm lauten.
Aber mit Standard-Controllern, denke ich, müssen Sie ein bisschen basteln, um verschachtelte URLs zu haben.

Werfen Sie einen Blick auf meine ContentBlock/PageBuilder Modul für ein fortgeschrittenes Beispiel von verschachtelten Controller mit Forms:
PageBuilder_Field.php#L179
PageBuilder_Field_Handler_Block.php#L32

Verwandte Themen