……Marco Valli's Blog……

Internet, Tecnologia e SharePoint!!!

Come autocompilare campi nella NewForm.aspx grazie ai javascript


Il problema iniziale: creare da una lista un elemento in un’altra lista mantenendo un link all’elemento della lista originale

L’idea: creare nella dispform.aspx dell’elemento della lista di origine un link alla newform.aspx della lista di destinazione

Il problema secondario: passare le informazioni relative al link dell’elemento padre all’elemento figlio

La soluzione: utilizzare le querystring per passare le informazioni necessarie

La realizzazione: nella newform.aspx della lista di destinazione inserire subito dopo <asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server"> questo script:

<script type="text/javascript">
_spBodyOnLoadFunctionNames.push("fillDefaultValues");
function fillDefaultValues(){

var qs=location.search.substring(1,location.search.length);
var args=qs.split("&");
var vals=new Object();
for (var i=0; i<args.length;i++){
var nameVal=args[i].split("=");
var temp=unescape(nameVal[1]).split(‘+’);
nameVal[1]=temp.join(”);
vals[nameVal[0]]=nameVal[1];
}
var link=vals["Link"];
if(link==undefined) return;
var theSelect=getTagFromIdentifierAndTitle("select","URLFieldURL","nome del campo url");
if(theSelect==null){

var theInput=getTagFromIdentifierAndTitle("input","","nome del campo url");
if(theInput==null){
return;
}
theInput.value=link;
document.getElementById(theInput.id).readOnly=true;
}else{
theSelect.value=link;
document.getElementById(theSelect.id).readOnly=true;
}
var descrizione=vals["Descrizione"];
if(descrizione==undefined) return;
var theSelect=getTagFromIdentifierAndTitle("select","URLFieldURL","Descrizione");
if(theSelect==null){

var theInput=getTagFromIdentifierAndTitle("input","","Descrizione");
if(theInput==null){
return;
}
theInput.value=descrizione;
document.getElementById(theInput.id).readOnly=true;
}else{

tehSelect.value=descrizione;
document.getElementById(theSelect.id).readOnly=true;
}
}
function setSelectedOption(select,value){
var opts=select.options;
var l=opts.length;
if(select==null) return;
for(var i=0; i<l; i++){
if(opts[i].value==value){

select.selectedIndex=i;
return true;
}
}
}
function getTagFromIdentifierAndTitle(tagName,identifier,title){

var len=identifier.length;
var tags=document.getElementsByTagName(tagName);
for(var i=0;i<tags.length;i++){
var tempString=tags[i].id;
if(tags[i].title==title && (identifier=="" ||
tempString.indexOf(identifier)==tempString.length – len)){

return tags[i];
}
}
return null;
}
function freezeValue(tag){

var chosen=tag.options.selectedIndex;
tag.onchange=function(){

tag.options.selectedIndex=chosen;
}
tag.className="ms-MenuUIItemTableCellDisabled";
}</script>

la doppia query è necessaria per poter compilare correttamente sia l’url che la descrizione del link..

Una volta modificata la pagina, è necessario creare un pulsante nella displayform.aspx della lista padre, va benissimo un normalissimo pulsante ASP.NET nel quale, alla voce OnClientClick bisogna inserire il seguente script:

javascript:window.open(‘http://server/Lists/nomelistafiglio/NewForm.aspx?Link=http://server/Lists/nomelistapadre/DispForm.aspx?ID%3D{@ID}%26Source%3Dhttp%253A%252F%252Fserver%252FLists%252Fnomelistapadre%252FAllItems%252Easpx%26RootFolder%3D%252FLists%252Fnomelistapadre&Descrizione={@Title}&#8217;,’_blank’);history.go(0);

Come si può notare l’URL non può essere semplicemente copiato ma deve subire l’encoding per permettere al javascript di interpretarlo correttamente (in particolare, se lasciato "normale" in questo caso avrebbe copiato il link fino a ID ignorando il segno = e tutto quello che ne seguiva) l’encoding NON va applicato alle variabili che rimangono quindi normali (in questo caso {@ID}). In questo modo si aprirà una nuova finestra con la newform.aspx della lista figlio e il campo "nome del campo url" si autocompilerà con il collegamento diretto alla displayform.aspx della lista padre e dell’elemento di partenza e come descrizione (nell’esempio) il titolo dell’elemento padre.

Sottolineo che questo metodo è scaturito da innumerevoli ricerche su internet culminate con il post "illuminante" di Patrik Luca

http://patrikluca.blogspot.com/2008/01/how-to-set-default-values-based-on_20.html

la parte di javascript è anch’essa un collage di informazioni reperite su internet di cui al momento non ho memoria…

Grande soddisfazione e soprattutto una tecnica molto utile in innumerevoli casi…

 

Enjoy!! 🙂

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: