2013-06-17 2 views
1

나는 비계 템플릿을 리팩토링 그리고 난이 문제와 벽에 부딪 :GRAILS : _FORM.GSP 템플릿에서 서비스 로직을 호출 할 수 있습니까?

내가 템플릿 _FORM.GSP에서 서비스 (일부 보안 로직을)를 호출하려고했던 -하지만 코드 부분이 아닌 출력 부

에서

본인은 여기에서 제안 된 것을 시도했다 : How do I call a Grails service from a gsp?

  1. 내가 태그 라이브러리를 사용하려고했지만, Grails의 내 지식은 내가 추가 해봤 그
  2. 충분히 광범위하지 않을 수 있습니다 가져 오기 및 _FORM.GSP 파일의 시작 부분에 def (grailsA 서비스 신청 및 응용 프로그램 인스턴스화가 누락 된 속성 응용 프로그램에 충돌했습니다. 누락 된 속성 grailsApplication)
  3. 나는 메소드에서 isAllowedToEdit 메소드로 직접 taglib를 호출하려고 시도 했었습니다. g.isAllowedToEdit도 알 수없는 메소드 resp에서 충돌했습니다. 어떤 방법이 있는지

    private renderFieldForProperty(p, owningClass, prefix = "") { 
        boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate') 
        boolean display = true 
        boolean required = false 
        if (hasHibernate) { 
         cp = owningClass.constrainedProperties[p.name] 
         display = (cp ? cp.display : true) 
         required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false) 
        } 
    
        /* trying to do this part */ 
        // I want to assign value to cp.editable - so later I can render read-only fields in renderEdit 
        if (!mySecurityService.canEdit(springSecurityService.currentUser, owningClass.getClass(), actionName, p.name)) { 
         cp.editable = false 
        } 
        /* trying to do this part */ 
    
        if (display) { %> 
    <div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}"> 
        <label for="${prefix}${p.name}"> 
         <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" /> 
         <% if (required) { %><span class="required-indicator">*</span><% } %> 
        </label> 
        ${renderEditor(p)} 
    </div> 
    <% } } %> 
    

    : "그런 속성 g"는

는 그 템플릿 _form.gsp 내가 이런 일을하고 싶지 표준 GSP보기

다른 규칙이 보인다 cp.editable 지정 - 귀하의 제안을 시도하겠습니다.

+0

페이지 상단에 서비스를 설치하려고 했습니까? – sanghavi7

+0

예, _form.gsp 상단에 가져 오기 및 가져 오기를 추가했습니다. - 다른 항목에서 설명한대로 – hoppo

+0

라고 표시되어 있습니다. 좋은 방법이라고 생각하지 않습니다. 그냥 컨트롤러에서 서비스를 호출하십시오. – sanghavi7

답변

1

하면 해당 템플릿 _form.gsp 표준 GSP보기

다른 규칙이 보인다 다른 GSPS하지만 내부의 템플릿으로 동일하게 작동 _form.gsp 생성 scr/templates/scaffolding/은 다릅니다. 당신이하고있는 것처럼 템플릿을 커스터마이징하는 것은 좀 더 까다 롭습니다. 쓰고있는 논리는 Grails가 어떻게 뷰 (gsp)를 생성하는지에 대한 것입니다. Grails가 메모리 나 파일에 뷰를 생성하기 전에 일부 로직을 검사하도록 지시하는 것을 의미합니다. 런타임시 동적 인 (메모리 내에서) 스캐 폴딩을 위해 확장 할 수 있지만 정적 스캐 폴딩에서는 그렇지 않을 수도 있습니다. Grails 은 템플릿을 생성 할 때 currentUser을 인식하지 못하기 때문입니다.

보기를 생성 한 다음 템플릿을 수정하는 대신 사용자 정의하면 문제가 훨씬 간단 해집니다. 그런 다음 서비스를 주입하고 다른 수표를 발행 할 수 있습니다. 그러나, 당신도 그 논리가 태그 라이브러리 here에서 더 나은 언급 언급했다.

보안에 대해서도 언급 했으므로 필드를 편집 할 수 없게 만든다고해서 필드를 편집 할 수 없다는 보장은 없습니다. 승인되지 않은 사용자가 필드를 편집하지 못하도록 예를 들어 SAVE 또는 UPDATE 조치에 점검 로직을 컨트롤러에 두는 것이 좋습니다.

+1

예, 저는 이런 식으로 될 것 같았습니다 - (렌더링) 템플리트는 템플리트의 표준 컨텍스트에서 벗어날 수 있습니다 (렌더링) 템플리트; 따라서 내가 본 것처럼 동적 인 (세션) 논리를 사용하는 유일한 방법은 현재 사용자 역할에 따라 "온라인"을 평가할 taglib를 사용하는 것입니다. 나는 그것을 시도 할 것이고 그것이 효과가있을 때 나는 당신의 답을 평가할 것이다 - 눈이 ​​뜨고 있었다 (슬프게도 ...) – hoppo

0

시도해 보셨습니까?

<%@ page import="com.myproject.MyService" %> 
<% 
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance() 
%> 

이것은 올바르게 작동합니다.

이 링크를 통해 이동 : click here

+0

템플릿 생성기를 통해 컴파일되지 않도록 표준 GOP가 아닌 GSP 템플릿에서 작업하고 있습니다. -> "템플릿 스크립트를 구문 분석하지 못했습니다" 서명 파싱 – hoppo

관련 문제