0

コントローラーが不明なサブフローを呼び出したい。パラメータで beginFlow に渡され、それをフロー スコープに保存します。goToForm 内で、flow.theController に保存されているコントローラーを使用して呼び出したいと思います。


def beginFlow = {
    enter {
        action {
            if (params?.redirectTo != null) {
                String flow.theController = params.redirectTo
            }

            if ( flow.theController() ) { 
                success()
            }
        }
        on("success").to("beginPage")
    }
    beginPage {
        on('next').to('goToForm')
    }       
    goToForm {
                    // I'd like this:
                    // subflow(controller: flow.theController, action:'start'

                    // this subflow works, but won't work for all cases
        subflow(controller: 'AZ_A4', action:'start')
        on('done').to('showResults')
        on('notDone').to('beginPage')
    }

    showResults {
        redirect(action: 'results')
    }
}
4

1 に答える 1

0

ユーザーリストで説明したように、フロー構造が構築されているとき (アプリケーションの起動時) にサブフロー名を認識している必要があるため、これを直接行うことはできないようです。しかし、フロー定義 DSL は Groovy コードであるため、次のようなことができます。

beginPage {
    on('next').to('selectSubflow')
}
selectSubflow {
    action {
        return "subflow_${flow.theController}"()
    }
    for(subController in listOfControllers) {
        on("subflow_${subController}").to("subflow_${subController}")
    }
}
for(subController in listOfControllers) {
    "subflow_${subController}" {
        subflow(controller:subController, action:'start')
        on('done').to('showResults')
        on('notDone').to('beginPage')
    }
}

listOfControllers はどこかで静的である可能性があります。または、フロー定義の上部でこのようなことを行うこともできます

def beginFlow = {
    def listOfControllers = grailsApplication.controllerClasses.findAll {
        it.flows.containsKey('start')
    }.collect { it.logicalPropertyName }
    enter {
        // ...

startFlow を定義するアプリケーション内のすべてのコントローラーを列挙します。クラスでが必要になる場合がありdef grailsApplicationます。Grails のどの場所でデフォルトで使用可能で、どの場所で使用できないかをいつも忘れてしまいます...

于 2012-06-23T11:05:48.617 に答える