Alfresco: отправка почты всем пользователям. Пользовательская кнопка не работает на некоторых сайтах. - PullRequest
2 голосов
/ 13 марта 2012

В части приложения "Поделиться" возникла проблема на панели мониторинга конкретного сайта.
Эта проблема возникает случайно при создании сайта и, по-видимому, без особой причины.
Моя проблема касается дашлета "Профиль сайта". Я разработал пользовательскую кнопку, которая позволяет пользователю отправлять электронную почту одному или нескольким участникам, которые подписались на информацию сайта. Он основан на имени файла 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 &gt; 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>&nbsp;${msg("text." + profile.type?lower_case)}</p>
         <p><span class="label">${msg("label.visibility")}</span>&nbsp;${msg("text." + (profile.visibility!"unknown")?lower_case)}</p>
         <p><span class="label">${msg("ts-site-profile.siteMembersNbr")}</span>&nbsp;${profile.siteMembersNbr?html}</p>
         <p><span class="label">${msg("ts-site-profile.creationDate")}</span>&nbsp;${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>

Итак, если у вас есть какая-то конкретная идея ...

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Я нашел решение. Все, что мне нужно было сделать, это добавить эти строки в "site-profile.get.head.ftl":

<#include "../component.head.inc">

<script type="text/javascript" src="${page.url.context}/res/modules/editors/tiny_mce/tiny_mce.js"></script>
<@script type="text/javascript" src="${page.url.context}/res/modules/editors/tiny_mce.js"></@script>
<@script type="text/javascript" src="${page.url.context}/res/components/form/rich-text.js"></@script>
<@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>

<!-- Simple Dialog -->
<@script type="text/javascript" src="${page.url.context}/res/modules/simple-dialog.js"></@script>

Некоторые из этих строк были в файле дашлета "События списка" "head.ftl".
Теперь дашлет не нужно включать в работу, и нет конфликта.

0 голосов
/ 13 марта 2012

Прежде всего, вам не нужно снова включать tinyMCE, потому что это в основном уже сделано.

взгляните на файл шаблона alfresco-template.ftl, здесь вы увидите следующее;

<#macro templateHtmlEditorAssets>
<!-- HTML Editor Assets -->
    <script type="text/javascript" src="${page.url.context}/res/modules/editors/tiny_mce/tiny_mce${DEBUG?string("_src", "")}.js"></script>
    <@script type="text/javascript" src="${page.url.context}/res/modules/editors/tiny_mce.js"></@script>
    <@script type="text/javascript" src="${page.url.context}/res/modules/editors/yui_editor.js"></@script>
</#macro>

Так что это может быть конфликтом, так как он уже видит его как поле HTML и импортирует tinyMCE double.

Вы можете проверить это?

Если он уже загружен, вам нужно только правильно включить поле.

Во-вторых, у вас должен быть файл head.html.ftl, куда вы можете включить определенные библиотечные файлы.

Посмотрите на примеры дашлетов, как они строятся.

...