Кастомизация
25
Сен
3

Простой файловый менеджер на форме CRM

Относительное простое решение, которое позволит сделать из iFrame’а на форме объекта файловый менеджер. При этом для каждой записи будет создавать своя папка, в которой будут храниться только ее файлы. При удалении записи, соответствующая папка также будет удаляться. Для реализации будет использовать один плагин и и один JS Веб-ресурс.

Итак приступим…

  • Создайте новую расшаренную папку «docements» и дайте к ней доступ учетке «Evertone» на все действия;
  • Создайте в объекте Организация новое текстовое поле «new_acctfoldername» и вынесите его на форму объекта Организация. Поставьте для этого поля обязательность заполнения. В этом поле будет содержаться имя папки, в которой будут храниться документы соответствующей Организации;
  • Создайте на форме объекта Организация iFrame со следующими параметрами:
    • Имя: «IFRAME_documents»;
    • URL: «about:blank»;
    • Снимите галку «ограничить использование скриптов между кадрами».

    В этой iFrame’е собственно и будет отображаться документы текущей организации;

  • Создайте новый JS Веб-ресурс с таким кодом:
    if (typeof (MyFunctionsPack) == "undefined") { MyFunctionsPack = {}; }
    
    MyFunctionsPack.MyFunctions = {
        Documents: function () {
            if (Xrm.Page.ui.getFormType() == 2) {
                var acctFolderName = Xrm.Page.getAttribute('new_acctfoldername').getValue();
                if (acctFolderName) {
                    Xrm.Page.ui.controls.get('new_acctfoldername').setDisabled(true);
                    Xrm.Page.getControl("IFRAME_documents").setSrc('file://CRM2011/crmdocument/' + acctFolderName);
                }
            }
        }
    }
    

    В этом коде мы делаем следующее:

    • Проверяем что происходит обновление записи (у новой записи Организации еще нет своей папки);
    • Получаем значение атрибута «new_acctfoldername»…
    • Если он заполнен, то деактивируем поле «new_acctfoldername» и задаем для iFrmae’а URL для просмотра нужно папки (измените базовый путь на свой).

    Подключите это Веб-ресурс к форме Организации и вызовите на онлоаде функцию «MyFunctionsPack.MyFunctions.Documents»;

  • Создайте новый плагин с таким кодом:
    using System;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceModel;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Messages;
    using System.IO;
    
    namespace CRM_2011_Plug_in1
    {
        public class crtAcc : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                String acctfoldername;
                String path = @"\\CRM2011\crmdocuments\";
                Entity MessageImage;
    
                switch(context.MessageName) 
                {
                    case "Create":
                    case "Update":
                        // Получаем содержимое поля new_acctfoldername из пост-снимка
                        MessageImage = (Entity)context.PostEntityImages["PostImage"];
                        acctfoldername = (String)MessageImage.Attributes["new_acctfoldername"];    
                    
                        // Создаем новую папку
                        if (!Directory.Exists(path + acctfoldername))
                        {
                            Directory.CreateDirectory(path + acctfoldername);
                        }
                    break;
                    case "Delete":
                        // Получаем содержимое поля new_acctfoldername из пре-снимка
                        MessageImage = (Entity)context.PreEntityImages["PreImage"];
                        acctfoldername = (String)MessageImage.Attributes["new_acctfoldername"];
                        
                        // Удаляем папку Организации
                        if (Directory.Exists(path + acctfoldername))
                        {
                            Directory.Delete(path + acctfoldername);
                        }
                    break;
                }
            }
        }
    }
    

    Тут происходит следующее:

    • Получаем контекст плагина;
    • Для сообщений «Create» и «Update»:
      • Получаем пост-снимок и вытаскиваем из него значение поля «new_acctfoldername»;
      • Создаем новую папку относительного базового пути (Вам нужно его подправить на свой) с именем соответствующим значению поля «new_acctfoldername».
    • Для сообщений «Delete»:
      • Получаем пре-снимок и вытаскиваем из него значение поля «new_acctfoldername»;
      • Удаляем относительного базового пути «Вам нужно его подправить на свой» папку с именем соответствующим значению поля «new_acctfoldername».
  • Зарегистрируйте плагин в CRM и созадейте для него такие шаги/снимки:
    • Шаг: Create на объект Account, стадия Post.
      • Пост-снимок: с именем и алиасом «PostImage» и полем «new_acctfoldername».
    • Шаг: Update на объект Account и поле «new_acctfoldername», стадия Post.
      • Пост-снимок: с именем и алиасом «PostImage» и полем «new_acctfoldername».
    • Шаг: Delete на объект Account, стадия Pre.
      • Пре-снимок: с именем и алиасом «PreImage» и полем «new_acctfoldername».

После этого можете создавать новые Организации или изменять в существующих поле «Название папки» и плагин автоматически будет создавать для них новую папку в расшареной папке «documents». Ну, а через iFrаme на форме организации Вы сможете заполнять эту папку файлами! 🙂







Комментарии (3)
  • antonz 25.09.2011

    это будет работать только в локальной сети

  • Наталья 25.09.2011

    А для CRM 2013 это работать будет?

  • Наталья 25.09.2011

    Да, работает. Плохо только, что туда файл не запихать другой, только отображаются…

*

code