2013-06-17 3 views
1

Я рефакторинга шаблоны строительных лесов, и я врезался в стену с этим вопросом:GRAILS: Можно ли вызвать логику службы из шаблона _FORM.GSP?

Я пытался позвонить в службу (некоторые логики безопасности) из шаблона _FORM.GSP - но в части кода, а не в выходной части

Я прочитал и попробовал то, что было предложено здесь: How do I call a Grails service from a gsp?

  1. Я пытался использовать TagLib, но мое знание Грааль не может быть достаточно широким для того
  2. Я попытался надстройка import и def в начало файла _FORM.GSP (оба grailsA прикладная программа и прикладная инстанция службы терпели крах при отсутствии приложения свойств, соответственно. отсутствующее свойство grailsApplication)
  3. Я даже пытался вызывать taglib из кода как напрямую, так и методом isAllowedToEdit, а также как g.isAllowedToEdit как сбой по неизвестному методу, так и по ошибке. «Такое свойство г»

не кажется, что шаблон _form.gsp имеет различные правила, чем стандартный GSP зрения

Я хочу сделать что-то вроде этого:

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> 
<% } } %> 

если есть способ назначить cp.editable - я попробую ваши предложения

+0

Вы попробовали обслуживание в верхней части страницы? – sanghavi7

+0

Да, я добавил import и def поверх _form.gsp - как указано в другой теме, которую я перечислял – hoppo

+0

Я не думаю, что это хороший способ, просто позвоните в службу поддержки с контроллера. – sanghavi7

ответ

1

кажется, что шаблон _form.gsp имеет различные правила, чем стандартный GSP зрения

Сформированный _form.gsp работает так же, как и другие GS но шаблон внутри scr/templates/scaffolding/ отличается. Настройка шаблонов, как вы делаете, немного сложнее. Имейте в виду, что логика, которую вы пишете, предназначена для Grails о том, как создавать представления (gsp). Это означает, что вы говорите, что Grails проверяет некоторую логику перед созданием представлений в памяти или в файле. Возможно, вы сможете это сделать до некоторой степени для динамических (в памяти) строительных лесов во время выполнения, но наверняка не для статических строительных лесов. Это потому, что Grails не знает о currentUser при создании шаблонов.

Ваша проблема будет намного проще, если вы создадите свои представления и затем настройте их вместо изменения их шаблонов. Затем вы можете вводить свои услуги и выполнять другие проверки. Однако, поскольку вы также упомянули, что эти логики лучше в библиотеке тегов here.

Также, поскольку вы упомянули о безопасности, рендеринг поля, не редактируемый, не гарантирует невозможность редактировать ваши поля. Я бы предложил поставить логику проверки внутри вашего контроллера, например, в SAVE или UPDATE, чтобы предотвратить посторонние поля редактирования пользователем.

+1

Да, я боялся, что это будет что-то вроде этого - шаблон (scaffolding) для шаблона (рендеринга) может быть вне стандартных контекстов просмотров и (рендеринга) temlpates; Так как я вижу это, единственный способ использовать динамическую (сессионную) логику внутри них - использовать taglib, которые будут оценивать «онлайн» в зависимости от текущих пользовательских ролей; Я попробую, и когда это сработает, я буду оценивать ваш ответ - он был ослепляющим (к сожалению ...) – hoppo

0

Вы попробовали это?

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

это сработает наверняка.

пройти по этой ссылке: click here

+0

Я работаю в шаблонах GSP, а не в стандартных представлениях, поэтому это не будет сгенерировано через генератор шаблонов -> «Не удалось разобрать шаблонный скрипт», и он не удался на @ sign parsing – hoppo