Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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();
				}
			}
		}
Ejemplo n.º 5
0
        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;
        }