В части приложения "Поделиться" возникла проблема на панели мониторинга конкретного сайта.
Эта проблема возникает случайно при создании сайта и, по-видимому, без особой причины.
Моя проблема касается дашлета "Профиль сайта". Я разработал пользовательскую кнопку, которая позволяет пользователю отправлять электронную почту одному или нескольким участникам, которые подписались на информацию сайта. Он основан на имени файла javascript "ts-send-mail-to-all-members.js".
Когда вы нажимаете на него, открывается всплывающее окно, содержащее флажки, которые позволяют вам выбирать участников, TinyMCE Компонент, который позволяет писать электронную почту и две кнопки, одна для отправки электронной почты, другая для закрытия всплывающего окна.
Кнопка подписки также была создана и не выдает никаких ошибок.
Проблема возникает при нажатии на кнопку, которая позволяет отправлять электронные письма.
Произошла ошибка javascript, которая генерируется в соответствии с конфигурацией панели мониторинга сайта.
1) Например, если на странице присутствует только один дашлет «Профиль сайта», у меня возникает следующая ошибка:
Alfresco.module.SimpleDialog is not a constructor
http://localhost:8080/share/res/modules/ts-send-mail-to-all-members.js
Line 139
Строка кода следующая:
var sendMailToAllMembersDialog = new Alfresco.module.SimpleDialog(this.id + "-sendMailToAllMembersDialog");
2) Я не нацеливался на конкретную конфигурацию, чтобы получить эту ошибку, но случайно вы также можете получить эту ошибку:
tinyMCE is not defined
[Break on this error] tinyMCE.init({
По-видимому, tinyMCE не идентифицируется Alfresco, который выдает исключение. В сценарии "tinyMCE.init" является первым оператором, где вызывается компонент. Я исследовал эту ошибку, и обычно вам просто нужно добавить тег <script>
с аргументом src=""
, чтобы указать, где находится tiny_mce.js. Я могу быть URL или его расположение в приложении Alfresco.
Тем не менее, мой сценарий полностью написан на JavaScript, и я не могу писать операторы HTML.
3) У вас есть третий случай, когда появляется всплывающее окно, и функциональность работает без каких-либо исключений. Это происходит, когда вы добавляете дашлет «Список событий» на панель управления сайта.
Вот исходный код "ts-send-mail-to-all-members.js":
/**
* Copyright (C) T&S.
*
*/
/**
* ts-abonnement-site module
*
*
*
* @namespace Alfresco.module
* @class Alfresco.module.TsAbonnementSite
*/
(function()
{
var Dom = YAHOO.util.Dom,
Event = YAHOO.util.Event,
Element = YAHOO.util.Element,
Bubbling = YAHOO.Bubbling,
KeyListener = YAHOO.util.KeyListener
nodeRef = "";
/**
* CreateSite constructor.
*
* @param htmlId {string} A unique id for this component
* @return {Alfresco.CreateSite} The new DocumentList instance
* @constructor
*/
Alfresco.module.TsSendMailToAllMembers = function(containerId)
{
var instance = Alfresco.util.ComponentManager.get(this.id);
if (instance !== null)
{
throw new Error("An instance of Alfresco.module.TsSendMailToAllMembers already exists.");
}
Alfresco.module.TsSendMailToAllMembers.superclass.constructor.call(this, "Alfresco.module.TsSendMailToAllMembers", containerId, ["button", "container", "connection", "selector", "json"]);
return this;
};
YAHOO.extend(Alfresco.module.TsSendMailToAllMembers, Alfresco.component.Base,
{
members:[],
options:{
siteId:""
},
onReady: function TS_onReady()
{
this.widgets.sendMailToAllMembersButton = Alfresco.util.createYUIButton(this, "btn-sendMailToAllMembers", this.showSendMailForm);
this.widgets.sendMailToAllMembersButton.set("className", "mailBtn mailToAllMembersBtn");
Bubbling.on('selectDeselectAllChanged', this.selectDeselectAllChanged);
Bubbling.on('selectDeselectMemberChanged', this.selectDeselectMemberChanged);
},
showSendMailForm: function()
{
// Intercept before dialog show
var doBeforeDialogShow = function TsSendMailToAllMembers_doBeforeDialogShow(
p_form, p_dialog) {
Alfresco.util.populateHTML(
[p_dialog.id + "-dialogTitle", this.msg("label.sendMailToAllMembersForm.title") ],
[p_dialog.id + "-dialogHeader", this.msg("label.sendMailToAllMembersForm.header") ],
[p_dialog.id + "-members-label", this.msg("label.sendMailToAllMembersForm.members") ],
[p_dialog.id + "-subject-label", this.msg("label.sendMailToAllMembersForm.subject") ],
[p_dialog.id + "-body-label", this.msg("label.sendMailToAllMembersForm.body") ],
[p_dialog.id + "-ok-label", this.msg("label.sendMailToAllMembersForm.btn.send.mail") ],
[p_dialog.id + "-cancel-label", this.msg("label.sendMailToAllMembersForm.btn.cancel") ]);
p_dialog.dialog.header.innerHTML = this.msg("label.sendMailToAllMembersForm.dialog.title");
Dom.get(p_dialog.id + "-shortName").value = this.options.siteId;
tinyMCE.init({
mode : "exact",
elements: p_dialog.id + "-body",
convert_fonts_to_spans: false,
theme: 'advanced',
width: "100%",
theme_advanced_buttons1: "bold,italic,underline,|,bullist,numlist,|,forecolor,|,undo,redo,removeformat",
theme_advanced_toolbar_location: "top",
theme_advanced_toolbar_align: "left",
theme_advanced_statusbar_location: "bottom",
theme_advanced_resizing: false,
theme_advanced_buttons2: null,
theme_advanced_buttons3: null,
theme_advanced_path: false,
language: 'fr'
});
Alfresco.util.Ajax.request(
{
url: Alfresco.constants.PROXY_URI + "api/sites/" + this.options.siteId + "/memberships",
dataObj:
{
htmlid : p_dialog.id + "-membersContainer"
},
successCallback:
{
fn: this.onMembersLoaded,
scope: this
}
});
};
var doBeforeFormSubmit = function ()
{
Dom.get(this.id + "-sendMailToAllMembersDialog-mailbody").value = tinyMCE.get(this.id + "-sendMailToAllMembersDialog-body").getContent({format : 'raw'});
var membersIds = "";
var cbs = YAHOO.util.Selector.query("input[id^='cb_']");
for (var i=0; i<cbs.length; i++)
{
var cb = cbs[i];
if (cb.checked)
{
var id = cb.id.replace("cb_", "");
if(cbs.length == 1 || i == cbs.length - 1) {
membersIds += id;
} else {
membersIds += id + ",";
}
}
}
Dom.get(this.id + "-sendMailToAllMembersDialog-membersIds").value = membersIds;
this.widgets.dialog.widgets.okButton.set("disabled", true);
this.widgets.dialog.widgets.cancelButton.set("disabled", true);
};
// Using Forms Service, so always create new
// instance
var sendMailToAllMembersDialog = new Alfresco.module.SimpleDialog(this.id + "-sendMailToAllMembersDialog");
this.widgets.dialog = sendMailToAllMembersDialog;
sendMailToAllMembersDialog.setOptions(
{
width : "60em",
templateUrl : Alfresco.constants.PROXY_URI + "ts/sendMailToAllMembers",
actionUrl : Alfresco.constants.PROXY_URI + "ts/sendHtmlMail",
destroyOnHide : true,
doBeforeFormSubmit:{
fn:doBeforeFormSubmit,
scope: this
},
doBeforeDialogShow : {
fn : doBeforeDialogShow,
scope : this
},
onSuccess : {
fn : function TsSendMailToAllMembers_success(response) {
YAHOO.Bubbling.fire(
"sendMailToAllMembersForm_success",
{
nodeRef : response.json.persistedObject
});
Alfresco.util.PopupManager.displayMessage({
text : this.msg("message.sendMailToAllMembersForm.success")
});
},
scope : this
},
onFailure : {
fn : function TsSendMailToAllMembers_failure(response) {
Alfresco.util.PopupManager.displayMessage({
text : this.msg("message.sendMailToAllMembersForm.failure")
});
},
scope : this
}
}).show();
},
onMembersLoaded: function TS_onMembersLoaded(response)
{
this.members = response.json;
this.updateMembersList(response.config.dataObj.htmlid);
},
updateMembersList : function TS_updateMembersList(containerId)
{
var div = Dom.get(containerId);
div.innerHTML = "<div class=\"memberDiv\">" +
"<input type=\"checkbox\" id=\"selectDeselectAllCb\" checked=\"true\" onclick=\"YAHOO.Bubbling.fire('selectDeselectAllChanged')\" class=\"memberCb\"/>" +
"<label for=\"selectDeselectAllCb\" class=\"memberLabel\">" +
this.msg('label.selectDeselectAll') + "</label>" +
"</div>";
for (var i=0; i<this.members.length; i++)
{
var member = this.members[i];
var avatar = Alfresco.constants.URL_CONTEXT + "/components/images/no-user-photo-64.png";
if (member.authority.avatar && member.avatar != "")
{
// exemple:
// api/node/workspace/SpacesStore/697ec77c-b881-4c16-82b6-4f80fea1514b/content/thumbnails/avatar
avatar = Alfresco.constants.PROXY_URI + member.authority.avatar + "?c=force";
}
div.innerHTML += "<div class=\"memberDiv\">" +
// "<img class=\"memberAvatar\" src=\"" + avatar + "\"/>" +
"<input type=\"checkbox\" id=\"cb_" + member.authority.userName + "\" checked=\"true\" onclick=\"YAHOO.Bubbling.fire('selectDeselectMemberChanged')\" class=\"memberCb\"/>" +
"<label for=\"cb_" + member.authority.userName + "\" class=\"memberLabel\">" +
member.authority.firstName + " " + member.authority.lastName + "</label>" +
"</div>";
}
},
selectDeselectAllChanged: function selectDeselectAllChanged(){
var selectDeselectAllCb = Dom.get('selectDeselectAllCb');
var checked = selectDeselectAllCb.checked;
var cbs = YAHOO.util.Selector.query("input[id^='cb_']");
for (var i=0, j=cbs.length; i<j; i++)
{
var cb = cbs[i];
cb.checked = checked;
}
},
selectDeselectMemberChanged: function selectDeselectMemberChanged(){
var selectDeselectAllCb = Dom.get('selectDeselectAllCb');
var cbs = YAHOO.util.Selector.query("input[id^='cb_']");
var firstChecked = false;
if (cbs[0] != null){
firstChecked = cbs[0].checked;
}
for (var i=0, j=cbs.length; i<j; i++)
{
var cb = cbs[i];
if (cb.checked === firstChecked){
continue;
}
else{
selectDeselectAllCb.checked = false;
return;
}
}
selectDeselectAllCb.checked = firstChecked;
},
/**
* Set messages for this component.
*
* @method setMessages
* @param obj {object} Object literal specifying a set of messages
* @return {Alfresco.SampleComponent} returns 'this' for method chaining
*/
setMessages: function SampleComponent_setMessages(obj)
{
Alfresco.util.addMessages(obj, this.name);
return this;
}
});
})();
Alfresco.module.geTsSendMailToAllMembersInstance = function()
{
var instanceId = "alfresco-TsSendMailToAllMembers-instance";
return Alfresco.util.ComponentManager.get(instanceId) || new Alfresco.module.TsSendMailToAllMembers(instanceId);
};
Вот исходный код "site-profile.get.head.ftl":
<#include "../component.head.inc">
<@link rel="stylesheet" type="text/css" href="${page.url.context}/res/modules/ts/ts.css" />
<@script type="text/javascript" src="${page.url.context}/res/modules/ts-abonnement-site.js"></@script>
<@script type="text/javascript" src="${page.url.context}/res/modules/ts-send-mail-to-all-members.js"></@script>
Вот исходный код "site-profile.get.html.ftl":
<script type="text/javascript">//<![CDATA[
new Alfresco.module.TsAbonnementSite("${args.htmlid}").setOptions(
{
siteId: "${profile.shortName}"
}).setMessages(${messages});
new Alfresco.module.TsSendMailToAllMembers("${args.htmlid}").setOptions(
{
siteId: "${profile.shortName}"
}).setMessages(${messages});
//]]></script>
<div id="${args.htmlid}-sendMailToAllMembersDialog"></div>
<div class="dashlet site-profile">
<div class="title">${msg("header.siteProfile")}</div>
<div class="body">
<div class="msg">
<#if profile.iconurl?exists && profile.iconurl != "">
<img src="/share/proxy/alfresco/api/node/${profile.iconurl}/content/thumbnails/avatar?c=force" height="60px" style="float:left;margin: 5px;"/>
</#if>
<h3><#if (profile.title != "")>${msg("text.welcome", profile.title)?html}<#else>${msg("text.welcome", profile.shortName)?html}</#if></h3>
<#if (profile.description != "")>
<p>${profile.description?html}</p>
</#if>
<#if profile.customProperties??>
<#list profile.customProperties?keys as prop>
<#assign customValue=profile.customProperties[prop].value>
<#if customValue?starts_with('alfresco-php://') == true>
<p><a href="${url.context}/proxy/alfresco-php/${customValue?substring(15)?html}" target="_blank" class="theme-color-1">${profile.customProperties[prop].title?html}</a></p>
<#else>
<p>
<span class="label">${profile.customProperties[prop].title?html}</span>
<span>${customValue?html}</span>
</p>
</#if>
</#list>
</#if>
<#if (sitemanagers?exists && sitemanagers?size > 0)>
<p>
<span class="label">${msg("label.siteAdmin")}</span>
<#list sitemanagers as sitemanager>
<#if sitemanager.authority.authorityType = 'USER'>
<a href="${url.context}/page/user/${sitemanager.authority.userName?url}/profile" class="theme-color-1">${sitemanager.authority.firstName?html}<#if sitemanager.authority.lastName != ""> ${sitemanager.authority.lastName?html}</#if></a><#if sitemanager_has_next>,</#if>
<#else>
<span>${sitemanager.authority.displayName?html}</span><#if sitemanager_has_next>,</#if>
</#if>
</#list>
</p>
</#if>
<p><span class="label">${msg("label.type")}</span> ${msg("text." + profile.type?lower_case)}</p>
<p><span class="label">${msg("label.visibility")}</span> ${msg("text." + (profile.visibility!"unknown")?lower_case)}</p>
<p><span class="label">${msg("ts-site-profile.siteMembersNbr")}</span> ${profile.siteMembersNbr?html}</p>
<p><span class="label">${msg("ts-site-profile.creationDate")}</span> ${profile.creationDate}</p>
<p>
<button id="${args.htmlid}-btn-sendMailToAllMembers" title='${msg("ts-site-profile.sendMailToAllMembers")}'>
<img class="mailBtn" src="${url.context}/res/modules/ts/images/email-icon.png"/></button>
<div id="${args.htmlid}-div-btn-abo" style="display:none;">
<button id="${args.htmlid}-btn-subscribeDaily" title='${msg("ts-site-profile.subscribeDaily")}'>
<img class="mailBtn" src="${url.context}/res/modules/ts/images/calendar-selection-day-icon.png"/></button>
<button id="${args.htmlid}-btn-subscribeWeekly" title='${msg("ts-site-profile.subscribeWeekly")}'>
<img class="mailBtn" src="${url.context}/res/modules/ts/images/calendar-selection-week-icon.png"/></button>
</div>
<div id="${args.htmlid}-div-btn-delete" style="display:none;">
<button id="${args.htmlid}-btn-delete">
<img class="mailBtn" src="" id="${args.htmlid}-img-btn-delete"/></button>
</div>
</p>
</div>
<div class="clear"></div>
</div>
</div>
Итак, если у вас есть какая-то конкретная идея ...
Спасибо.