public static Dictionary<int, int> GetChildren(int id, Relation[] relations) { var children = new List<int>(); // also add the master children.Add(id); foreach (Relation relation in relations) { if (id == relation.Parent.Id) { children.Add(relation.Child.Id); } } // match nodes with languages and return result Dictionary<int, int> dictionary = new Dictionary<int, int>(); foreach (int child in children) { int langid = GetLanguageIdFromNodeId(child); if (langid != 0) dictionary.Add(langid, child); } return dictionary; }
private static int GetMasterLanguageNode(int nodeid, ref Relation[] masterChildren) { int pageid = 0; List<int> children = new List<int>(); foreach (Relation relation in Relation.GetRelations(nodeid)) { if (nodeid == relation.Parent.Id) // we're already at the "master" language so find childs { masterChildren = Relation.GetRelations(nodeid); return nodeid; } else if (nodeid == relation.Child.Id) // we're at a child so need to go up first to find the "master" { masterChildren = Relation.GetRelations(relation.Parent.Id); return relation.Parent.Id; } } return pageid; }
public static List<LanguageData> GetUrlsAndLanguages(int nodeid) { var dataList = new List<LanguageData>(); var masterchildren = new Relation[] { }; List<Domain> domains = GetDomains(); int masternodeid = GetMasterLanguageNode(nodeid, ref masterchildren); int pageid; int nodelang = GetLanguageIdFromNodeId(nodeid); var url_lang = new Dictionary<string, string>(); foreach (var lang in Language.GetAllAsList()) { LanguageData data = new LanguageData(); data.NativeName = System.Globalization.CultureInfo.GetCultureInfo(lang.CultureAlias.Substring(0, 2)).NativeName; data.LanguageCode = lang.CultureAlias.Substring(0, 2); data.CountryCode = lang.CultureAlias.Substring(lang.CultureAlias.Length - 2).ToLower(); if (nodelang == lang.id) { data.Url = ""; } else { if (GetChildren(masternodeid, masterchildren).TryGetValue(lang.id, out pageid)) { data.Url = library.NiceUrl(pageid); } else if ((domains.Where(d => d.Language.id == lang.id)).Count() > 0) { data.Url = "http://" + (domains.Where(d => d.Language.id == lang.id)).First().Name; } } if (data.Url != null) dataList.Add(data); } return dataList; }
/// <summary> /// Delete all relations using the content node for a given RelationType /// </summary> /// <param name="relationType"></param> /// <param name="contentNodeId"></param> /// <param name="reverseIndexing"></param> /// <param name="instanceIdentifier">NOT USED ATM</param> private static void DeleteRelations(RelationType relationType, int contentNodeId, bool reverseIndexing, string instanceIdentifier) { //if relationType is bi-directional or a reverse index then we can't get at the relations via the API, so using SQL string getRelationsSql = "SELECT id FROM umbracoRelation WHERE relType = " + relationType.Id.ToString() + " AND "; if (reverseIndexing || relationType.Dual) { getRelationsSql += "childId = " + contentNodeId.ToString(); } if (relationType.Dual) // need to return relations where content node id is used on both sides { getRelationsSql += " OR "; } if (!reverseIndexing || relationType.Dual) { getRelationsSql += "parentId = " + contentNodeId.ToString(); } getRelationsSql += " AND comment = '" + instanceIdentifier + "'"; using (IRecordsReader relations = uQuery.SqlHelper.ExecuteReader(getRelationsSql)) { //clear data Relation relation; while (relations.Read()) { relation = new Relation(relations.GetInt("id")); // TODO: [HR] check to see if an instance identifier is used relation.Delete(); } } }
public static Relation[] GetRelations(int NodeId, RelationType Filter) { System.Collections.ArrayList tmp = new System.Collections.ArrayList(); using (IRecordsReader dr = SqlHelper.ExecuteReader("select umbracoRelation.id from umbracoRelation inner join umbracoRelationType on umbracoRelationType.id = umbracoRelation.relType and umbracoRelationType.id = @relTypeId where umbracoRelation.parentId = @id or (umbracoRelation.childId = @id and umbracoRelationType.[dual] = 1)", SqlHelper.CreateParameter("@id", NodeId), SqlHelper.CreateParameter("@relTypeId", Filter.Id))) { while(dr.Read()) { tmp.Add(dr.GetInt("id")); } } Relation[] retval = new Relation[tmp.Count]; for (int i = 0; i < tmp.Count; i++) retval[i] = new Relation((int)tmp[i]); return retval; }