Кастомизация
31
Май
11

Файловый менеджер в окне IFrame

Dynamics CRM поддерживает несколько типов текстовых полей. Один тип, который не доступен в последней версии – это текстовое поле, которое поддерживает UNC путь (\\) или сетевой диск (Y:) к расшареной папке на сервере или на локальной машине пользователя.

Следующий пример преобразовывает обычное текстовое поле в ссылку, которое ссылается на страницу Explorer.aspx, содержащей IFRAME с открытой расшаренной папкой (путь которой передается в строке запроса).

Explorer.aspx должна быть помещена в папку ISV. Когда пользователь производит двойной щелчок на поле, откроется окно с указанной расшаренной папкой. Элемент также обеспечивает удобный API интерфейс для дополнительных параметров запроса: менеяющие стиль элемента, особенности окна проводника и устанавливающие дефолтный сетевой путь. Последней может быть удобная особенность, если Вам требуется, чтобы проводник указал на личную папку учетной записи в пределах общедоступного дерева файловой системы.

Вот реализация страницы Explorer.aspx (поместите ее в папку C:\Inetpub\wwwroot\ISV):

<%@ Page Language="C#" %>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
	<title>Dynamics File Explorer</title>
	<style>
		.header {
			background-color:#639ace;
			padding-left:10px;
			color:White;
			font-size:x-large;
			font-family:arial;
			height:30px;
		}
  
		.iframe {
			border:1px solid #94b2de;
			height:100%;
			width:100%;
		}
  
		body {
			margin:0px;
			border:0px solid;
		}
    </style>
</head>
<body scroll="no">
	<table border="0" cellpadding="1" cellspacing="0" style="width:100%;height:100%">
		<tr>
			<td class="header">File Explorer</td>
		</tr>
		<tr>
			<td>
				<iframe class="iframe" src="<%=Request["path"] %>"></iframe>
			</td>
		</tr>
	</table>
</body>
</html>

А этот скрипт нужно поместить на событие OnLoad (не забыв поменять имя поля в первых строчках: для ссылки я создал новый атрибут new_docs и вывел его на форму бизнес-партнеров):


// JavaScript File
function OnCrmPageLoad() {
	//Измените название поля на Ваше
	var networkPath = new NetworkPath("new_docs");
	//Пример добавления параметра к строке запроса
	networkPath.Params.Add("test","1");
	//Пример удаления параметра из строки запроса
	networkPath.Params.Remove("test");
	//Пример изменения дефолтного стиля 
	networkPath.Style.Add("color","red");
	//Преобразование текстового поля в ссылку 
	networkPath.Transform();
}

function NetworkPath(baseControlId) {
	nk = this;
	nk.ID = baseControlId;
	nk.Control = document.all[nk.ID];
	/* Путь по умолчанию */
	nk.Path = "\\\\crmtest\\files"; //default path
	nk.Window = null;
	/* Свойства File Explorer (window.open)*/
	nk.Features = new Dictionary(",","=");
	/* Если Вы хоите то можете расширить Explorer.aspx и добавить больше парметров строки запроса */
	nk.Params = new Dictionary("&","=");
	/* Дополнительные стилевые правила */
	nk.Style = new Dictionary(";",":");
 
	nk.Transform = function() {
		if (nk.Control) {
			/* Назначает дефлотный путь если поле с сетевым адресом пустое */
			if (nk.Control.DataValue == null) {
				nk.Control.DataValue = nk.Path;
			}
   
			nk.Control.title = "Дважды щелкните чтобы открыть Network Explorer";
			/* Параметры окна по умолчанию */
			if (!nk.Features.Exist("width")) {
				nk.Features.Add("width",700);
			}
			if (!nk.Features.Exist("height")) {
				nk.Features.Add("height",400);
			}
			if (!nk.Features.Exist("resize")) {
				nk.Features.Add("resize","yes");
			}
			if (!nk.Features.Exist("toolbar")) {
				nk.Features.Add("toolbar","no");
			}
			if (!nk.Features.Exist("menubar")) {
				nk.Features.Add("menubar","no");
			}
			if (!nk.Features.Exist("titlebar")) {
				nk.Features.Add("titlebar","no");
			}
			/* Прикрепление проверки на события изменения и сохраниения */
			nk.Control.attachEvent( "onchange" , nk.Validate );
			crmForm.attachEvent( "onsave" , nk.Validate );
   
			/* Задаем стиль поля */
			nk.Style.Add("text-decoration","underline");
			if (!nk.Style.Exist("color")) {
				nk.Style.Add("color","blue");
			}
			nk.Style.Add("cursor","hand");
			nk.Control.style.cssText += ";" + nk.Style.ToString();
   
			/* Обрабатываем двойной щелчок */
			nk.Control.ondblclick = nk.Open;
		}
	}
 
	nk.Validate = function() {
		if (nk.Control.DataValue == null) {
			return true;
		}
  
		/* Проверка \\ UNC пути или сетевого диска */
		var regex = new RegExp("^(\\\\|[a-zA-Z]:)");
		if (!regex.exec(nk.Control.DataValue)) {
			alert("Не корректный сетевой адрес или диск");
			return (event.returnValue = false);
		}
  
		return true;
	}
 
	nk.Open = function() {
		if (nk.Control.DataValue != null) {
			nk.Window = window.open( SERVER_URL + "/isv/explorer.aspx?path=" + nk.Control.DataValue + nk.Params.ToString() , "" , nk.Features.ToString());
		}
	}
 
	nk.Close = function() {
		nk.Window.close();
	}
 
	/* Пары ключ, значение */
	function Dictionary(sep,delim) {
		this.list = [];
		this.Seperator = sep;
		this.Delimiter = delim
  
		this.Add = function(key , value) { 
			this.list[key] = value; 
		}
  
		this.Remove = function(key) {
			this.list[key] = "";
		}
  
		this.Exist = function(key) {
			return this.list[key] != null && this.list[key] != "";
		}
  
		this.ToString = function() {
			var result = new StringBuilder();
			result.Append(this.Seperator);
			for(var key in this.list) {
				if (this.list[key]!="") {
					result.Append(key).Append(this.Delimiter);
					result.Append(this.list[key]).Append(this.Seperator);
				}
			}
			var tmp = result.ToString();
			return tmp.substring(0,tmp.length-1);
		}
	}
 
	function StringBuilder() {
		this.data = [];
  
		this.Append = function(text) {
			this.data[this.data.length] = text;
			return this;
		}
  
		this.Reset = function() {
			this.data = [];
		} 
    
		this.ToString = function() {
			return this.data.join("");
		}
	}
}

OnCrmPageLoad();



Комментарии (11)
  • Lester 31.05.2009

    Прошу прощения за беспокойство. А можно в окне IFRAME какой нить тулбар прикрутить? Или какое нить иерархическое древо,чтоб по уровням папок двигаться в обоих направлениях.
    Благодарю за беспокойство.

  • slivka_83 31.05.2009

    Добрый день 🙂

    А backspace’ом Вы не можете передвигаться в обратном направлении?

  • Lester 31.05.2009

    Пробовал, но чё то в IFRAME не срабатывает((( Есть ещё варианты?))
    Премного благодарен за беспокойство.

  • slivka_83 31.05.2009

    ну, тогда нужно подумать как это реализовать… скорее всего через объект history (браузера) можно…

    Если не забуду займус на выходных 🙂 а Вы не стесняйтесь — напоминайте 🙂

  • Lester 31.05.2009

    А в этом скрипте только одно поле надо поменять?:
    nk.Path = «\\\\crmtest\\files»; //default path, или ещё нужно что то менять? Чего то не находит CRM страничку Explorer.aspx 🙁 Помогите бездарю..

  • slivka_83 31.05.2009

    Также в четвертой строчке необходимо изменить поле на Ваше:
    var networkPath = new NetworkPath(«new_docs»);

    Вы поместили Explorer.aspx в папку C:\Inetpub\wwwroot\ISV ?

  • Lester 31.05.2009

    Поместил (Explorer.aspx в папку C:\Inetpub\wwwroot\ISV) и эти два поля изменил, но система не находит страницу:(

  • slivka_83 31.05.2009

    Извините, но в первых комментариях Вы писали, что он у Вас не перемещается в обратном направлении 🙂 значит работал? Так что случилось?

  • Lester 31.05.2009

    Не, его мне так и не удалось реализовать, работало просто окно iframe, без страницы Explorer.aspx, а вот с её реализацией пока проблемы 🙁

  • Lester 31.05.2009

    не может найти файл /C:/Inetpub/wwwroot/ISV/<%=Request[, может в этой строке нужно ,что то поменять?

  • Lester 31.05.2009

    Огромное спасибо!!! Респект и уважуха! Всё работает как часы.)))

*

code