Hallo zusammen
Ich möchte auf dem DispForm.aspx einer Aufgabe einen Button erstellen, der mir unter dieser Aufgabe einen Subtask generiert. Folgender Code funktioniert wunderbar:
<script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/javascript"></script><script type="text/javascript">
function newSubTask(){
var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo);
oListItem.set_item('Title', 'Test'); oListItem.set_item('ParentID', '5');
oListItem.update();
clientContext.load(oListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this,
this.onQueryFailed));
}
function onQuerySucceeded() {
alert('Item created: ' + oListItem.get_id());
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
</script><input id="Button1" onclick="newSubTask()" type="button" value="Teilaufgabe erstellen"/>
Nun möchte ich aber, dass es mir die ID des aktuellen Elements immer gleich übernimmt (s. gelbe Markierung im code), je nachdem auf welchem Element ich mich befinde. Ich möchte dort also keine Zahl eingeben, sondern eine Variable für die ID des aktuellen Elements. Ich krieg das irgendwie nicht hin. Kann mir jemand weiterhelfen?
DANKE!
Wenn es mit einer Zahl funktioniert, dann mache aus dem String eine Zahl:
var strLookupId = getQueryStringParameter("ID");var intLookupId = parseInt(strLookupId, 10);
Zum Abschluss dieses Forums: Es hat nun geklappt. Ich habe die ParentID vom übergeordneten Element gleich dem subtask mitgegeben und ins Feld "Hilfstext" geschrieben. Im Editform kann der Wert des Feldes aber nicht einfach mit Hilfe von SPUtility ausgelesen werden:
function newSubTask(){ var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo); var feld = SPUtility.GetSPField('Hilfstext'); var value = $(feld.GetValue()).wrap('<p>').parent().find('div').text(); var titel = SPUtility.GetSPField('Titel'); var titelwert = titel.GetValue(); if(value) { oListItem.set_item( 'ParentID', value); oListItem.set_item( 'Title', titelwert); oListItem.set_item('Body', value); oListItem.update(); clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } else { alert('ParentID was not found in QueryString!'); }}function onQuerySucceeded() { var neueID = oListItem.get_id(); alert('Teilaufgabe wurde erstellt. Sie werden gleich auf die soeben erstellte Aufgabe weitergeleitet.'); window.location = '/csa/Lists/Briefings/EditForm.aspx?ID=' + neueID;}function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());} //Get QueryStringByNamefunction getQueryStringByName(name) { name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), results = regex.exec(location.search); return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));}</script><input id="btnNewSubTask" type="button" value="Nächste Teilaufgabe" onclick="newSubTask();if (!PreSaveItem()) return false; WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ctl40$g_d4bd4b32_3af9_4de3_adb9_2ccaf99f5685$ctl00$toolBarTbl$RightRptControls$ctl00$ctl00$diidIOSaveItem", "", true, "", "", false, true))" />
Im Grunde ist das ganz einfach, weil genau diese ID immer in der Adresse enthalten ist ( DispForm.aspx?ID=123 ). Du mußt sie also nur per JavaScript abholen. Du kannst dazu die Suchmaschine Deiner Wahl mit sowas füttern "javascript get url parameter" oder die Funktion von mir nehmen, die Du z:b: hier findest: http://blogs.evocom.de/af/archive/2013/04/26/link-zum-erstellen-eines-detaildatensatzes.aspx
Hallo Andi
Vielen Dank für die Rückmeldung! Diesen Artikel kann ich als nächstes auch sehr gut gebrauchen! Die ID habe ich jetzt, wie in deinem Artikel erwähnt mittels JavaScript:
var lookupId = getQueryStringParameter("ID");
abgeholt. Die Funktion habe ich ebenfalls noch hinzugefügt. Nun möchte ich diese ID einfach als ParentID in meienm neuen Element angeben:
oListItem.set_item('ParentId', 'lookupId');
Es funktioniert aber leider nicht. Ich muss statt lookupId eine Zahl ein geben, dann klappt es... unten der gesamte Code, vielleicht kannst du mir weiter helfen:
function getQueryStringParameter(paramName) {
var params = document.URL.split("?")[1].split("&"),
i,
singleParam;
for (i = 0; i < params.length; i++) {
singleParam = params[i].split("=");
if (singleParam[0] == paramName)
return singleParam[1];
return "";
var lookupId = getQueryStringParameter("ID"); var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo);
oListItem.set_item('Title', 'new subtask'); oListItem.set_item('ParentId', 'lookupId'); oListItem.update();
Leider funktioniert es immer noch nicht.
Benötige ich die Funktion "function getQueryStringParameter(paramName) { " überhaupt? Ich habe es nun mit folgendem Code versucht - der leider aber auch nicht klappt. Hat jemand eine Idee wie es funktionieren könnte?
var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo); var strlookupId = getQueryStringParameter("ID"); var intlookupId = parseInt(strlookupId, 10); oListItem.set_item('Title', 'new subtask'); oListItem.set_item('ParentId', intlookupId); oListItem.update();
Vielen Dank im Voraus!
Ich habe den Fehler gefunden! Beim Einfügen des Codes habe ich ParentID falsch geschrieben. So hat es nun geklappt.
Vielen Dank Andi für deine Hilfe!
Jetzt komme ich leider schon wieder nicht mehr weiter. Wenn ich nun den mittels js generierten Subtask bearbeite, möchte ich dort auch wieder ein Button haben, der mir direkt einen subtask erstellt. Mit der gleichen ParentID wie der bestehende subtask. Ich muss also nun die ParentID des subtasks herauskriegen. Habe es mal mit SPUtility versucht, der Wert liefert aber immer "undefinded". Bin leider noch totale js anfängerin...
<script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/javascript"></script><script src="/csa/SiteCollectionDocuments/jquery-1.11.1.min.js"></script><script src="/csa/SiteCollectionDocuments/sputility.min.js"></script><script type="text/javascript">
var parentid = SPUtility.GetSPField('ParentID');var parentidvalue = parentid.GetValue();var intparentid = parseInt(parentidvalue, 10);
var clientContext = new SP.ClientContext.get_current(); var oList = clientContext.get_web().get_lists().getByTitle('Briefings'); var itemCreationInfo = new SP.ListItemCreationInformation(); this.oListItem = oList.addItem(itemCreationInfo); oListItem.set_item('ParentID', intparentid); oListItem.update();
Danke im Voraus!!
Ich kann Dir nur sagen, daß SPUtility normalerweise mit Lookups klarkommt. Ich nehme an, daß es ein ähnliches Problem wie oben ist, d.h. Du hast Dich wahrscheinlich beim Namen verschrieben.
Eine andere Möglichkeit wäre, die Methoden zum Setzen des Wertes zu verwenden. Du hast es ja geschafft, den Wert aus der URL auszulesen und zu setzen. Diese Methode kann man leicht abgewandelt auch zum Auslesen verwenden.
Verschrieben habe ich mich (leider) nicht.
Ich komme einfach nicht an die ParentID des aktuellen Subtasks ran...
Wie hast du das mit dem Auslesen gemeint? Die Parent ID ist ja nicht in der URL drin...
Mel89:Verschrieben habe ich mich (leider) nicht
Vielleicht ein Problem mit dem sichtbaren Namen und dem internen Namen? Jede Spalte hat einen sichtbaren Namen, der sprachabhängig sein kann und nach Belieben geändert werden kann. Und sie hat einen unveränderlichen internen Namen und den solltest Du mit SPUtility.GetSPFieldByInternalName() verwenden.
Mel89:Wie hast du das mit dem Auslesen gemeint? Die Parent ID ist ja nicht in der URL drin
Mit dem bestehenden Code holst Du ja die ID aus der URL und setzt sie in das Feld. Jetzt suchst Du das Feld und möchtest von ihm die ID haben...
GetSPFieldByInternalName habe ich auch bereits versucht, hat leider auch nicht geklappt...
Habe nun recherchiert wie ich das mit dem Auslesen machen könnte - komme da aber überhaupt nicht weiter. Dafür verstehe ich zu wenig von JavaScript.
Ich kann nicht glauben dass wirklich nirgends steht, wie man an die parentID eines subtask rankommt...
Trotzdem vielen Dank für deine Hilfe!
Ich habe oben vergessen zu erwähnen, wie man an den internen Namen kommt. Wahrscheinlich ist der einfach anders als Du denkst ;-)
Klicke in den Listeneinstellungen auf die Spalte und in der Adresszeile des Browsers findest Du den internen Namen bei Field=...
Das Problem dabei ist, dass die Parent ID nirgends als Spalte angezeigt wird. Ich kann da nicht irgendwo draufklicken. Diese Spalte ist irgendwo im Hintergrund. ABER sie existiert, da man sie braucht um überhaupt einen Subtask generieren zu können....
Im Quellcode habe ich "parentID" gefunden. Steht aber einfach so im Freien. Aber denke, dass dies der korrekte Name wäre.
Aaaah, jetzt erinnere ich mich, daß Du ja mit Aufgaben und Teilvorgängen rummachst. Ich muß zugeben, daß ich mich mit dem Feature noch nicht so ausführlich beschäftigt habe.
Wahrscheinlich gibt es da auf dem EditForm einfach gar kein Feld für die ParentID und dann kannst Du natürlich lange suchen. Die einzige Möglichkeit wäre dann das Element über das JavaScript Object Model zu laden und so die ParentID auszulesen. Da habe ich Dir aber kein Beispiel parat...