Так как Tapestry не предоставляет диалоговое окно, давайте посмотрим, насколько сложно (или просто) создать его самостоятельно. Мы будем использовать ModalBox, поскольку он имеет лицензию MIT и написан в прототипе (скоро это не будет критерием для выбора скрипта, так как Tapestry будет независимым от прототипа). Скрипт ModalBox очень прост в использовании. Существует метод ModalBox.show (), который отображает диалоговое окно. Он принимает элемент dom и параметры конфигурации в качестве параметров. Если вы хотите создать мастера, просто продолжайте использовать тот же метод в диалоговом окне. Существует также метод ModalBox.hide (), чтобы скрыть диалог.
Наш скрипт — это больше, чем просто вызов ModalBox.show (). Он должен вызвать обработчик события, используя URL-адрес события, и использовать ответ для создания элемента, который будет отображаться в диалоговом окне. Он также предоставляет возможность обновить зону после закрытия диалогового окна.
Tapestry.Initializer.setupModalDialog = function(params)
{
// Setup zone
var element = $(params.id);
$T(element).zoneId = params.zone;
var showModalbox = function()
{
var loadContentWithScripts = function(transport)
{
var node = new Element('div').update(transport.responseJSON.content);
params.options.onContentLoaded = function()
{
Tapestry.loadScriptsInReply(transport.responseJSON, function() {});
};
params.options.afterHide = function()
{
if(params.zone)
{
var zoneManager = Tapestry.findZoneManager(element);
zoneManager.updateFromURL(params.closeLink);
}
};
Modalbox.show(node, params.options);
};
Tapestry.ajaxRequest(params.openLink, {
method : 'get',
onSuccess : loadContentWithScripts
});
};
Event.observe($(params.id), params.event, showModalbox);
};
Функция сценария принимает следующие параметры
- id: идентификатор элемента
- событие: клиентское событие на элементе, который будет вызывать событие
- openLink: ссылка для вызова диалогового окна
- closeLink: ссылка вызывается после закрытия диалога
- зона: зона, которая будет обновлена после закрытия диалога
- параметры: другие параметры, которые должны быть переданы в ModalBox.show (), например ширина, высота, заголовок
Сценарий связывает клиентское событие элемента с методом, который делает запрос на основе ajax для получения содержимого диалогового окна с сервера, а затем вызывает функцию Tapestry.loadScriptsInReply () для загрузки любых встроенных сценариев.
Параметры передаются в сценарий нашим классом компонентов ModalDialog.
@SupportsInformalParameters
@Import(library = {
"modalbox/builder.js",
"modalbox/effects.js",
"modalbox/modalbox.js",
"modalbox/modalboxinit.js"
} ,
stylesheet = "modalbox/modalbox.css"
)
@Events({TawusAddonsEventConstants.SHOW_DIALOG})
public class ModalDialog implements ClientElement
{
/**
* Javascript id, if not supplied is auto-generated
*/
@Parameter(value = "prop:componentResources.id", defaultPrefix = BindingConstants.LITERAL, allowNull = false)
private String clientId;
/**
* Client event that will trigger the modal dialog
*/
@Parameter(value = "click", defaultPrefix = BindingConstants.LITERAL, allowNull = false)
private String clientEvent;
/**
* Zone to update when dialog is closed
*/
@Parameter(defaultPrefix = BindingConstants.LITERAL)
private String zone;
/**
* Context to be passed to the page
*/
@Parameter
private Object[] context;
@Environmental
private JavaScriptSupport javaScriptSupport;
@Inject
private ComponentResources resources;
private String assignedClientId;
public ModalDialog()
{
}
ModalDialog(JavaScriptSupport javaScriptSupport,
ComponentResources resources)
{
this.javaScriptSupport = javaScriptSupport;
this.resources = resources;
}
void setupRender()
{
assignedClientId = javaScriptSupport.allocateClientId(clientId);
}
void beginRender(MarkupWriter writer)
{
writer.element("a", "href", "#", "id", getClientId());
}
void afterRender(MarkupWriter writer)
{
writer.end();
}
@AfterRender
void addJavaScript()
{
JSONObject params = new JSONObject();
params.put("id", getClientId());
params.put("event", clientEvent);
params.put("openLink", getPageLink());
params.put("closeLink", getCloseLink());
params.put("zone", zone);
params.put("options", getInformalParametersAsJSON());
javaScriptSupport.addInitializerCall("setupModalDialog", params);
}
private JSONObject getInformalParametersAsJSON()
{
JSONObject modalboxOptions = new JSONObject();
for(String parameter : resources.getInformalParameterNames())
{
modalboxOptions.put(parameter,
resources.getInformalParameter(parameter, String.class));
}
return modalboxOptions;
}
private Object getPageLink()
{
Link link = resources.createEventLink(TawusAddonsEventConstants.SHOW_DIALOG, context);
return link.toAbsoluteURI();
}
private String getCloseLink()
{
return resources.createEventLink(
TawusAddonsEventConstants.CLOSE_DIALOG).toAbsoluteURI();
}
public String getClientId()
{
return assignedClientId;
}
}
public class TawusAddonsEventConstants
{
public static final String SHOW_DIALOG = "showDialog";
public static final String CLOSE_DIALOG = "closeDialog";
}
Компонент создает тег привязки и вызывает функцию javascript с надлежащими параметрами. Неформальные параметры используются для предоставления ModalBox других опций конфигурации.
использование
<a t:type='tawus/modaldialog' t:zone='closeZone'>Open Dialog</a> <div t:type='zone' t:id='closeZone'>Call this zone on closure</div> <t:block t:id='modaldialogContents'> Some content </t:block>
@Inject
private Block modalDialogContents;
public Block onShowDialog()
{
return modalDialogContents;
}
public Zone onCloseDialog()
{
return closeZone;
}
От http://tawus.wordpress.com/2011/07/02/a-modal-dialog-for-tapestry/