sharepoint etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
sharepoint etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Perşembe, Ekim 13, 2016

Getting Values from SharePoint 2013 Property Bags

SharePoint 2013 has a hierarchical set of property bags. At each of the following levels in a SharePoint farm, one can store properties and their corresponding values:

  • Farm
  • Web Application
  • Site
  • Web
  • List

This can be extremely handy when writing code. For example, if you have four different environments (Development, QA, Staging, Production), you could store properties in each environment's farm property bag that specifies things like connection strings, debugging constants, or host URLs.

It's even handier when you have a simple means to extract these properties from the property bag in your code. I generally make a class (FarmProperty in the example below) with a "Get" method that extracts the string value for the given property.

    public class FarmProperty
    {
        public static string Get(string name)
        {
            string value = null;
            SPSecurity.RunWithElevatedPrivileges(() =>
            {
                var farm = SPFarm.Local;
                foreach (var prop in farm.Properties.Cast().
Where(prop =>; prop.Key.Equals(name)))
                {
                    value = prop.Value.ToString();
                }
            });
            return value;
        }
    }


To use this code, just call the Get method on the FarmProperty class. If the property doesn't exist, it will return null.

    var reportServerHost = FarmProperty.Get("ReportServerHost");

Salı, Aralık 29, 2015

Sharepoint Rest Api ile Sharepoint Listeler Üzerinde Çalışmak

Merhaba,

Sharepoint listelerinde tutulan verileri farklı uygulamalarda kullandırım gereksinimi duyabiliyoruz. Bu durumda listelere erişime ve üzerinde işlem yapmamız olanak tanıyan rest api 'ler ile çalışma gereksinimi oluyor. Çalışmayı sağlayabilmek için kullanılabilecek örnek kod parçası alt kısımdaki şekilde olacaktır.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;

namespace iyh
{
    public class SPListReader
    {
        public List<ListItem> GetAllSPListItems()
        {
            List<ListItem> posts = new List<ListItem>();
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://webapp/site/_api/web/lists/getbytitle('listName')/items?$select=id,Title");
            request.Method = "GET";
            request.Accept = "application/json;odata=verbose";
            request.ContentType = "application/json;odata=verbose";
            request.Credentials = System.Net.CredentialCache.DefaultCredentials;
            WebResponse response = request.GetResponse();
            Data data = null;

            // Read the returned posts into an object that can be consumed by the calling application
            using (response)
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    JavaScriptSerializer serializer = new JavaScriptSerializer();
                    try
                    {
                        string jSON = reader.ReadToEnd();
                        data = serializer.Deserialize(jSON);
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(string.Format("An error occurred when reading the list items from SharePoint: {0}; {1}", ex.Message, ex.StackTrace));
                    }
                }
            }
            foreach (ListItem post in data.d.results)
            {
                posts.Add(post);
            }
            return posts;
        }
    }

    public class Data
    {
        public Results d { get; set; }
    }

    public class Results
    {
        public ListItem[] results { get; set; }
    }

    public class ListItem
    {
        public string id { get; set; }
        public string Title { get; set; }
    }
}

Herkese iyi çalışmalar dilerim.
TT

Çarşamba, Aralık 11, 2013

Sharepoint – Lokalizasyon (LCID) Kodları

Merhaba,

 

Geçen günlerde ilgilendiğim bir proje ile ilgili Localizasyon kodlarına gereksinim oldu. Elimin altında olması ve gerekirse sizlere de kolaylık sağlayabilmesi amacıyla alt kısımda bu listeyi paylaşıyorum.

 

Listenin alındığı orjinal adres: http://msdn.microsoft.com/en-us/goglobal/bb964664 şeklindedir.

Language - Country/Region LCID Hex LCID Dec
Afrikaans - South Africa 0436 1078
Albanian - Albania 041c 1052
Alsatian 0484 1156
Amharic - Ethiopia 045e 1118
Arabic - Saudi Arabia 0401 1025
Arabic - Algeria 1401 5121
Arabic - Bahrain 3c01 15361
Arabic - Egypt 0c01 3073
Arabic - Iraq 0801 2049
Arabic - Jordan 2c01 11265
Arabic - Kuwait 3401 13313
Arabic - Lebanon 3001 12289
Arabic - Libya 1001 4097
Arabic - Morocco 1801 6145
Arabic - Oman 2001 8193
Arabic - Qatar 4001 16385
Arabic - Syria 2801 10241
Arabic - Tunisia 1c01 7169
Arabic - U.A.E. 3801 14337
Arabic - Yemen 2401 9217
Armenian - Armenia 042b 1067
Assamese 044d 1101
Azeri (Cyrillic) 082c 2092
Azeri (Latin) 042c 1068
Bashkir 046d 1133
Basque 042d 1069
Belarusian 0423 1059
Bengali (India) 0445 1093
Bengali (Bangladesh) 0845 2117
Bosnian (Bosnia/Herzegovina) 141A 5146
Breton 047e 1150
Bulgarian 0402 1026
Burmese 0455 1109
Catalan 0403 1027
Cherokee - United States 045c 1116
Chinese - People's Republic of China 0804 2052
Chinese - Singapore 1004 4100
Chinese - Taiwan 0404 1028
Chinese - Hong Kong SAR 0c04 3076
Chinese - Macao SAR 1404 5124
Corsican 0483 1155
Croatian 041a 1050
Croatian (Bosnia/Herzegovina) 101a 4122
Czech 0405 1029
Danish 0406 1030
Dari 048c 1164
Divehi 0465 1125
Dutch - Netherlands 0413 1043
Dutch - Belgium 0813 2067
Edo 0466 1126
English - United States 0409 1033
English - United Kingdom 0809 2057
English - Australia 0c09 3081
English - Belize 2809 10249
English - Canada 1009 4105
English - Caribbean 2409 9225
English - Hong Kong SAR 3c09 15369
English - India 4009 16393
English - Indonesia 3809 14345
English - Ireland 1809 6153
English - Jamaica 2009 8201
English - Malaysia 4409 17417
English - New Zealand 1409 5129
English - Philippines 3409 13321
English - Singapore 4809 18441
English - South Africa 1c09 7177
English - Trinidad 2c09 11273
English - Zimbabwe 3009 12297
Estonian 0425 1061
Faroese 0438 1080
Farsi 0429 1065
Filipino 0464 1124
Finnish 040b 1035
French - France 040c 1036
French - Belgium 080c 2060
French - Cameroon 2c0c 11276
French - Canada 0c0c 3084
French - Democratic Rep. of Congo 240c 9228
French - Cote d'Ivoire 300c 12300
French - Haiti 3c0c 15372
French - Luxembourg 140c 5132
French - Mali 340c 13324
French - Monaco 180c 6156
French - Morocco 380c 14348
French - North Africa e40c 58380
French - Reunion 200c 8204
French - Senegal 280c 10252
French - Switzerland 100c 4108
French - West Indies 1c0c 7180
Frisian - Netherlands 0462 1122
Fulfulde - Nigeria 0467 1127
Galician 0456 1110
Georgian 0437 1079
German - Germany 0407 1031
German - Austria 0c07 3079
German - Liechtenstein 1407 5127
German - Luxembourg 1007 4103
German - Switzerland 0807 2055
Greek 0408 1032
Greenlandic 046f 1135
Guarani - Paraguay 0474 1140
Gujarati 0447 1095
Hausa - Nigeria 0468 1128
Hawaiian - United States 0475 1141
Hebrew 040d 1037
Hindi 0439 1081
Hungarian 040e 1038
Ibibio - Nigeria 0469 1129
Icelandic 040f 1039
Igbo - Nigeria 0470 1136
Indonesian 0421 1057
Inuktitut 045d 1117
Irish 083c 2108
Italian - Italy 0410 1040
Italian - Switzerland 0810 2064
Japanese 0411 1041
K'iche 0486 1158
Kannada 044b 1099
Kanuri - Nigeria 0471 1137
Kashmiri 0860 2144
Kashmiri (Arabic) 0460 1120
Kazakh 043f 1087
Khmer 0453 1107
Kinyarwanda 0487 1159
Konkani 0457 1111
Korean 0412 1042
Kyrgyz (Cyrillic) 0440 1088
Lao 0454 1108
Latin 0476 1142
Latvian 0426 1062
Lithuanian 0427 1063
Luxembourgish 046e 1134
Macedonian 042f 1071
Malay - Malaysia 043e 1086
Malay - Brunei Darussalam 083e 2110
Malayalam 044c 1100
Maltese 043a 1082
Manipuri 0458 1112
Maori - New Zealand 0481 1153
Mapudungun 0471 1146
Marathi 044e 1102
Mohawk 047c 1148
Mongolian (Cyrillic) 0450 1104
Mongolian (Mongolian) 0850 2128
Nepali 0461 1121
Nepali - India 0861 2145
Norwegian (Bokmål) 0414 1044
Norwegian (Nynorsk) 0814 2068
Occitan 0482 1154
Oriya 0448 1096
Oromo 0472 1138
Papiamentu 0479 1145
Pashto 0463 1123
Polish 0415 1045
Portuguese - Brazil 0416 1046
Portuguese - Portugal 0816 2070
Punjabi 0446 1094
Punjabi (Pakistan) 0846 2118
Quecha - Bolivia 046B 1131
Quecha - Ecuador 086B 2155
Quecha - Peru 0C6B 3179
Rhaeto-Romanic 0417 1047
Romanian 0418 1048
Romanian - Moldava 0818 2072
Russian 0419 1049
Russian - Moldava 0819 2073
Sami (Lappish) 043b 1083
Sanskrit 044f 1103
Scottish Gaelic 043c 1084
Sepedi 046c 1132
Serbian (Cyrillic) 0c1a 3098
Serbian (Latin) 081a 2074
Sindhi - India 0459 1113
Sindhi - Pakistan 0859 2137
Sinhalese - Sri Lanka 045b 1115
Slovak 041b 1051
Slovenian 0424 1060
Somali 0477 1143
Sorbian 042e 1070
Spanish - Spain (Modern Sort) 0c0a 3082
Spanish - Spain (Traditional Sort) 040a 1034
Spanish - Argentina 2c0a 11274
Spanish - Bolivia 400a 16394
Spanish - Chile 340a 13322
Spanish - Colombia 240a 9226
Spanish - Costa Rica 140a 5130
Spanish - Dominican Republic 1c0a 7178
Spanish - Ecuador 300a 12298
Spanish - El Salvador 440a 17418
Spanish - Guatemala 100a 4106
Spanish - Honduras 480a 18442
Spanish - Latin America 580a 22538
Spanish - Mexico 080a 2058
Spanish - Nicaragua 4c0a 19466
Spanish - Panama 180a 6154
Spanish - Paraguay 3c0a 15370
Spanish - Peru 280a 10250
Spanish - Puerto Rico 500a 20490
Spanish - United States 540a 21514
Spanish - Uruguay 380a 14346
Spanish - Venezuela 200a 8202
Sutu 0430 1072
Swahili 0441 1089
Swedish 041d 1053
Swedish - Finland 081d 2077
Syriac 045a 1114
Tajik 0428 1064
Tamazight (Arabic) 045f 1119
Tamazight (Latin) 085f 2143
Tamil 0449 1097
Tatar 0444 1092
Telugu 044a 1098
Thai 041e 1054
Tibetan - Bhutan 0851 2129
Tibetan - People's Republic of China 0451 1105
Tigrigna - Eritrea 0873 2163
Tigrigna - Ethiopia 0473 1139
Tsonga 0431 1073
Tswana 0432 1074
Turkish 041f 1055
Turkmen 0442 1090
Uighur - China 0480 1152
Ukrainian 0422 1058
Urdu 0420 1056
Urdu - India 0820 2080
Uzbek (Cyrillic) 0843 2115
Uzbek (Latin) 0443 1091
Venda 0433 1075
Vietnamese 042a 1066
Welsh 0452 1106
Wolof 0488 1160
Xhosa 0434 1076
Yakut 0485 1157
Yi 0478 1144
Yiddish 043d 1085
Yoruba 046a 1130
Zulu 0435 1077
HID (Human Interface Device) 04ff 1279

Kolay gelsin.

--

TT

Cumartesi, Mart 23, 2013

Teknoloji Seçimi - Kurumsal Projeler (SAP, Microsoft, vd…)

Merhaba,

 

Bir önceki yazıda firmaların uygulama seçiminde dikkat ettiği kararları ve organizasyonel yapılanma hakkında kısa kısa bilgiler vermeye çalışmıştık. Bu yazıda ise kalıcı projelerin oluşturulması ve stratejik kararların verilmesi anında yaşanan süreçleri irdeleyeceğiz.

 

BT insanlarının kariyerlerinin en başlarında yaşadıkları bir ironi vardır. Hangi uygulama geliştirme platformunu kullanmalıyım? Sen Java ‘cısın ben .Net ‘çiyim, o Delphi ‘ci. Bunlardan hangisi daha iyi. Hangisinde kendimi geliştirmeliyim. Yoksa ben uygulama geliştiremiyor muyum? Peki analist mi olmalıyım? Yoksa veri tabanı yöneticisi mi? Bu sorular sürekli geldi geçti başımızdan… Öncelikle dikkat etmemiz gereken konu hepsinin en sonunda aynı noktaya ve aynı amaca hizmet ettiğini görmek. Bir sonraki süreçte ise proje, yaşam ve stratejilere bağlı olarak farklı teknolojiler ve farklı firmaların ürünlerini kullanmamız gerekebilir. Eğer fanatik bir teknoloji sever iseniz içinizde yanan ateşi söndürerek işinizi yapmaya bakın.

İçten yanan ateşe en güzel örneği kendimden verebilirim. Sektöre başladığımdan beri elimden geldiğinde en yeni teknolojiyi geliştirmiş / geliştirtmiş olduğum projeler tercih etmeye çalıştım. Ancak elimden geldiğince dememin bir sebebi var. Kendim için gariptir ki dahil oldğum projelerin neredeyse tamamı .Net 1.0 ‘da ya da asp ‘de hazırlanmış olan projelerin yeni teknolojiye (.Net 2.0 ne kadar yeniyse artık… ( Daha yeni teknolojilerede geçiyoruz bu arada. ) Smile ) taşıma ve sürdürebilirlik projeleri oldu. Burada bir projeyi .Net 3.5 ya da .Net 4.0 var iken .Net 2.0 yapacaksın demeleri en başlarda içsel bir huzursuzluğa yol açsa da zamanla kurumsal kimliklerden kaynaklı olarak böyle stratejiler yapıldığı gözlemlenebiliyor. Farklı firmalarda da buna benzer konular yaşandıkça artık insan alışıyor ve uyum sağlayarak iyi en iyi şekilde yapmaya çalışıyor.

 

Herhangi bir firmanın proje grubunda yer aldığınızda öncelikli olarak göreceğimiz ilk proje CRM uygulaması olacaktır. Ayrıca sürekli olarak bu uygulamayı geliştirmenin ve iyileştirmenin çabaları ve organizasyonel yapılandırmaları yapılır. Genellikle CRM uygulamaları Mıcrosoft .Net Framework üzerinde web ya da desktop application olarak hazırlanmış projelerdir. Eğer ki Desktop application ise Citrix üzerinde çalıştırmanın yollarına ya da web uygulaması ile yeniden yapılandırılması amaçlanır. Bu iki adımda gerçekleşti ise günümüzde sağlamış olduğu standartlık ve stabilizasyonu sebebi ile uygulamayı SAP üzerine taşımak adımı yaşanmaya başlıyor. Eğer ki Intranet uygulamaları var ise bu uygulamalarda Sharepoint server üzerinde tasarlanmaya çalışıyor.

 

Olayın bir de çok farklı bir boyutu var. Neredeyse Microsoft ile anlaşması olan firmaların büyük çoğunluğunda Sharepoint server kurulu ve döküman yönetim sistemi olarak kullanıldığı gözlemlenir. Ancak crawl kurgulanmadığı için arama kriterlerinden öte sadece saklama alanı olarak kullanılır. Zamanla bu uygulamaların daha efektif kullanılması için planlama yapılır ve geliştirilir.

 

Uygulamaların geliştirilmesi ve sürdürülebilmesi için kararlar alınmalıdır ve gerçekleştirilebilmelidir.

 

Günümğz polüler seçimlerini dikkat aldığımızda

  • CRM uygulamaları için Dynamics CRM ve SAP kullanımı
  • Portal ve Intranet uygulamalarında Sharepoint kullanımı
  • Web uygulamalarında MVC Framework ‘I kullanma
  • Desktop application için WPF ve XAML form kullanımı
  • Azure servislerinin kullanımı
  • Santral sistemlerinde Avaya kullanımı
  • ve tabiki sosyal medyanın yüksek olan ve yükselme potansiyeli daha fazla olan gücü
    şeklinde sırayabiliriz.
Tekrardan görüşmek üzere…

Pazartesi, Ekim 18, 2010

SharePoint - Style Individual Navigation Items for 2007 & 2010

Here is a simple yet effective way to stylize individual top navigation items for SharePoint 2007 & 2010 just using CSS. SharePoint 2010 will need a slight modification to the master page but the same effect can be achieved. See bottom of post for 2010 implementation.

To start off with lets review how this can be accomplished for 2007. SharePoint 2007 provides a unique ID for each note in the navigation.

  1. 1st Tab: Dedicated as your default Home or root node
    • ID: zz1_TopNavigationMenun0
  2. 2nd Tab: This is the first child node from the root
    • ID: zz1_TopNavigationMenun1
  3. 3rd Tab: This is the second child node from the root
    • ID: zz1_TopNavigationMenun2
  4. 4th Tab: This is the third child node from the root
    • ID: zz1_TopNavigationMenun3 

See the pattern… It keeps going and going. Here is what it looks like from the IE DOM Explorer in IE8:

image

So you might ask well what can I do with this unique ID? Well here is a quick sample of what you can do. Its not pretty but it shows off that you can have a custom Icon, background color, font, etc. for each node in the navigation.

image

Here is the CSS and OOTB Icon references that I used to create the above design. So how does it work? Basically it combines the trigger of the unique ID and attaches it to the class of “ms-topnav a”. You will notice that I had to do a funky bit of css to fill in the background behind the arrow for news.

.ms-topnav{
border: none;
background-color: transparent;
background-image: none;
font-weight: bold;
}
#zz1_TopNavigationMenun0 .ms-topnav a{
background-image: url(/_layouts/images/newshomepage.png);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #006699;
border: 1px #006699 solid !important;
padding:18px 20px 0px 80px;
height: 54px;
color: #FFF;
}
#zz1_TopNavigationMenun1 .ms-topnav a{
background-image: url(/_layouts/images/PLICON.PNG);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #FF9933;
border: 1px #FF9933 solid !important;
padding:18px 20px 0px 80px;
height: 54px;
color: #FFF;
}
#zz1_TopNavigationMenun2 .ms-topnav a{
background-image: url(/_layouts/images/ANNOUNCE.PNG);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #336633;
border: 1px #336633 solid !important;
padding:18px 20px 0px 80px;
height: 54px;
color: #FFF;
}
#zz1_TopNavigationMenun2 .ms-topnav td{
background-color: #336633;
}
#zz1_TopNavigationMenun3 .ms-topnav a{
background-image: url(/_layouts/images/ReportCenter.png);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #990000;
border: 1px #990000 solid !important;
padding:18px 20px 0px 80px;
height: 54px;
color: #FFF;
}
#zz1_TopNavigationMenun4 .ms-topnav a{
background-image: url(/_layouts/images/SMT_LARGE.PNG);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #660066;
border: 1px #660066 solid !important;
padding:18px 20px 0px 80px;
height: 54px;
color: #FFF;
}
#zz1_TopNavigationMenun5 .ms-topnav a{
background-image: url(/_layouts/images/categories.png);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #999;
border: 1px #999 solid !important;
padding:18px 20px 0px 80px;
height: 54px;
color: #FFF;
}

So how do you do this for SharePoint 2010…

Well first you will need to modify the master page and do a search for “UseSimpleRendering="true"”. This basically tells SharePoint to render the navigation using a clean unordered list <UL> <LI> format.

Since this is so clean, it does not have any unique ID’s attached to it like it did in SharePoint 2007.

image

So if you change it to false: UseSimpleRendering="false" you can clearly see that each node now has a unique ID:

image

So if we simply take the same approach for 2007 we can get similar results.  You will notice the only difference in the ID’s from 2007 to 2010 is that they put in a “V4” after the word “Menu” and before the “n#”

  1. 2007 ID: zz1_TopNavigationMenun0
  2. 2010 ID: zz1_TopNavigationMenuV4n0

You can also remove the “ms-topnav” since it is not needed. You should end up with something like this:

image

Below is the CSS that I used to achieve the design above for SharePoint 2010. Remember you need to make that modification to the master page noted above to get this to work. Also notice that I kept the “a” reference at the end of each ID.

#s4-topheader2{
border: none;
background-color: transparent;
background-image: none;
font-weight: bold;
height: 54px;
padding-bottom: 5px;
}
#zz1_TopNavigationMenuV4n0 a{
background-image: url(/_layouts/images/newshomepage.png);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #006699;
border: 1px #006699 solid !important;
padding:18px 20px 18px 80px;
color: #FFF;
}
#zz1_TopNavigationMenuV4n1 a{
background-image: url(/_layouts/images/PLICON.PNG);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #FF9933;
border: 1px #FF9933 solid !important;
padding:18px 20px 18px 80px;
color: #FFF;
}
#zz1_TopNavigationMenuV4n2 a{
background-image: url(/_layouts/images/ANNOUNCE.PNG);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #336633;
border: 1px #336633 solid !important;
padding:18px 20px 18px 80px;
color: #FFF;
}
#zz1_TopNavigationMenuV4n3 a{
background-image: url(/_layouts/images/ReportCenter.png);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #990000;
border: 1px #990000 solid !important;
padding:18px 20px 18px 80px;
color: #FFF;
}
#zz1_TopNavigationMenuV4n4 a{
background-image: url(/_layouts/images/SMT_LARGE.PNG);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #660066;
border: 1px #660066 solid !important;
padding:18px 20px 18px 80px;
color: #FFF;
}
#zz1_TopNavigationMenuV4n5 a{
background-image: url(/_layouts/images/categories.png);
background-repeat: no-repeat;
background-position: -40px -3px;
background-color: #999;
border: 1px #999 solid !important;
padding:18px 20px 18px 80px;
color: #FFF;
}

Enjoy!

Salı, Eylül 28, 2010

SharePoint - Sometimes you can't change the Colum ordering of a list or library

Sometimes the link (in the list or library settings) about the Colum ordering is not visible. If you want to change the column ordering of the SharePoint 2007 Form in that situation you can edit the url e.g. from:

http://my-url/_layouts/listedit.aspx?List=%7B02B1A398%2D7077%2D47AF%2DA455%2D4C4E82C77CC3%7D

to

http://my-url/_layouts/formEdt.aspx?List=%7B02B1A398%2D7077%2D47AF%2DA455%2D4C4E82C77CC3%7D

As you can see you only have to change to part before .apsx from listedit to formEdt.

image.axd

Pazartesi, Nisan 12, 2010

Visual Studio 2010 – RTM

Visual Studio 2010 çıktı.

Uzun bir gelişme sürecinin ardından Visual Studio 2010 resmi olarak satışa sunuldu.Visual Studio 2010

IDE üzerinde WPF ‘in nimetlerinden yararlanılarak yapılan değişiklikler, WWF ‘in tasarımın ve akış tiplerinin yenilenmesi, F# dilinin entegre edilmesi, MVC 2 ile beraber gelmesi ve diğer bir çok özelliği ile bugün VS2010 çıkmış bulunuyor. Deneme sürümünü indirip kurmak isteyenler aşağıda verecek olduğum linkten yararlanabilirler. Almak isteyenler için ise Visual Studio 2010 Ultimate satış fiyatı $11850. :)

http://www.microsoft.com/visualstudio/en-us/download

Cuma, Mart 26, 2010

Sharepoint 2010 – Beta VHD Download

Sharepoint 2010 çok güzel gelişmeler ile bizlerin karşısına çıkmaya hazırlanıyor. Beta sürümünü inceleyip kurmak isteyenler için Virtual PC sunucusu üzerinde çalıştırılmak üzere hazırlanan VHD dosyasını aşağıdaki linki kullanarak indirebilmeniz mümkündür.

Sharepoint 2010 Beta VHD

Salı, Kasım 03, 2009

Sharepoint - Dinamik Olarak MasterPage Değiştirmek

Microsoft Sharepoint Server ve MOSS teknolojisi günümüzde portal sistemleri denince akla ilk gelen ve şirket yöneticilerinin aklına gelen ilk teknolojidir. Esnek yapısı ve alt yapı mimarisi ile geliştiricilerin işlerini kolaylaştıran araçları ile insanların ilgilisini çok kısa zamanda çekti ve çekmeyede devam edecektir. 

Bu yazımızda Sharepoint teknolojileri kullananan kurumlardan en çok istenen isteklerden birinin nasıl çözüleceğini incelemeye çalışacağız. Örneklemek gerekirse, bir kurumun içinde üç farklı çalışma grubu var yöneticinizin bu çalışma gruplarından hangisi sisteme girdiyse ona özel bir tasarım görünmesini istiyorum şeklinde isteği olabilir. Bu durumda bizim yapmamız gereken gerekli çözümleri üretip işi sonuca ulaştırmaktır.

Sharepoint Server ile MOSS üzerinde geliştirme yapılmaya başlandığında ilk olarak default.master ve CSS dosyası bizlerin kullanımına sunulmaktadır. Farklı kullanıcı gruplarından hangi grup girerse farklı bir masterpage 'in açılmasına olanak tanıyabilmek için ilk olarak bu masterpage 'leri sharepoint e uygun şekilde düzenlemek gerekmektedir. Şimdi masterpage 'leri sisteme dahil olan kullanıcı grubuna göre nasıl değiştirebileceğimizi incelemeye başlayalım.

ASP.NET Sayfasının İçerisinde MasterPage Nasıl Değiştirilir?

ASP.NET uygulama geliştiriciler sisteme dahil olan üyelere göre rahatlıkla masterpage ve sayfa içerisinde yer alan öğeleri değiştiebiliyorlar. Sisteme dahil olan kullanıcıları kontrol etmek için masterpage 'in içerisinde yer alan PreInit event 'ından yararlanmak gerekmektedir. Fakat unutulmaması gereken bir nokta var. Hazırlanmış olan uygulama da yalnızca üç beş tane asp.net sayfa olmayacak. Yüzlerce sayfa olacaktır. Bu durumda her sayfaya ve masterpage 'e PreInit olayını yakalamak ve belirteceğimiz kodları yazmak sistemi yavaşlatacak bir etken olacaktır. Bu sebepte her sayfa için taban bir sınıf oluşturup yapacak olduğumuz işlemleri bunun içerisinde yaparsak işlerimiz biraz daha kolaylayacaktır. Bu sebeple MyCustomBasePage isimli bir sınıf oluşturuyoruz ve Page sınıfından bu sınıfı türetiyoruz. Sonrasında ise, Page_PreInit olayına aşağıdaki kodları ekliyoruz.

public class MyCustomBasePage : System.Web.UI.Page
{
    protected void Page_PreInit(object sender, EventArgs e)
    {
        if (CurrentUser.UserType == UserType.Admin)
        {
            MasterPageFile = "~/MasterPages/AdminMaster.master";
        }
        else if (CurrentUser.UserType == UserType.NormalAuthenitcated)
        {
            MasterPageFile = "~/MasterPages/NormalAuthenticatedMaster.master";
        }
        else
        {
            MasterPageFile = "~/MasterPages/AnonymouskMaster.master";
        }
    }
}

Bu sınıfın içerisinde üç farklı kullanıcı grubu için master page ayarladık. Admin, Normal ve sistem tarafından tanınmayan kullanıcılara göre farklı masterpage ler çalışacak ve görsel olarak farklı bir görünüm ile karşılacaklardır.

Şimdi bu sınıfı oluşturduğumuza göre işimiz biraz daha kolaylaştı. Artık oluşturulan bütün sayfalardan MyCustomBasePage sınıfını kullanarak bu hazırlamış olduğumuz kontrolün aktifleşmesine olanak tanırız.

public partial class HomePage : MyCustomBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

Sharepoint İçerisinde MasterPage Nasıl Değiştirilir?

Ana mantık olarak web uygulamalarında her kullanıcı grubuna ya da değişik faktörlere göre masterpage 'i nasıl değiştrebileceğimizi biliyoruz. Biraz öncede incelemiştik. Harici bir sınıf oluşurulur ve sayfanın PreInit olayı yakalanılarak değişiklikler yapılabilirdi. Ancak Sharepoint içerisinde bu direk PreInit olayından yakalayabilmek dire mümkün değildir. Ancak bizden çözüm bekleniyor ve gerekli işlemleri yapmamız gerekmektedir. Sharepoint Sayfaları içerisinde PreInit olayını yakalayabilmek için HttpModule 'ün kullanılması gerekmektedir.

Asp.Net Pipeline Süreci

Asp.Net istek süreçleri pipeline mantığına göre işlemlerini sürdürmektedir. Aşağıdaki şekilde de göreceğiniz üzere her isteğe yanıt veren bir modül bulunmaktadır. İstekler yakalandıktan sonra gerekli modülün kullanılmasına olanak tanınır.



Genellikle istekler pipeline içerisinde yer alan modüller isteklere göre yanıt vermektedir. Eğer ki bir den fazla modüle istek yapılırsa da tek bir işleyici tarafında işlem yapılacaktır. Ancak bizim istediğimiz her modüle tek bir işleyicinin işlem yapmasıdır. Bu işlemide asp.net sayfasında PreInit olayı ile gerçekleştiririz.

HttpModule 'den yararlanarak PreInit Olayı İşlenmesinin Geliştirilmesi

HttpModule den yararlanarak bir sınıf geliştirilirken System.Web.IHttpModule sınıfı miraslanarak kullanılır. IHttpModule 'in iki tane metodu vardır. Bunlar Dispose ve Init 'dir. Init metodu başlatıldığında diğer aktif olan Initleri iptal ederek kendisini kullanmaya başlayacaktır.

public class DynamicMasterPageModule : IHttpModule
{
    public void Dispose()
    {
    }
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }
    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
                Page page = HttpContext.Current.CurrentHandler as Page;
           if (page != null)
           {
               page.PreInit += new EventHandler(page_PreInit);
           }
    }
    void page_PreInit(object sender, EventArgs e)
    {
    }
}

Init metodunun içerisinde yer alan PreRequestHandlerExecute event 'ını yakalıyoruz. Asp.net sayfa başlarken bu olay tetiklenir. Sonrasıda açılacak olan sayfanın null olup olmadığının kontrolü sonrasında asp.net 'ten alışık oluğumuz PreInit olayının tetiklenmesi işlemini gerçekleştirebilmemize olanak tanınır.

Sharepoint MasterPage

Sharepoint 'in kendi varsayılan bir masterpage 'i vardır. Eğer bu masterpage üzerinde bir değişiklik ya da düzenleme yapmak istersek Sharepoint içeriğini görüntülemeye olanak tanıyan Sharepoint Designer içerisinde düzenleme yapmak gerekmektedir. Eğer ki oluşturulan ya da düzenlenen masterpage 'i kod tarafından çağırmak istersek Page.MasterPageFile özelliğini kullanmak gerekmektedir.

Page.MasterPageFile = "Masterpage 'in uygulama içerisindeki yolu";

Ancak dikkat edilmesi gereken bir nokta vardır. Masterpage sharepoint içerisinde farklı yerlerde bulıunabilir. Peki neden? Varsayılan sitenin içerisindeki olabilir, site koleksiyonunda olabilir gibi yerlerde olabilmektedir. Bunları örneklemek gerekirse,

"~site/MasterPageName.master"
Site klasörünün içerisinde yer alan masterpage 'in yolunu birden fazla masterpage olacağı için ~site/MasterPages/Masterpagename.master şeklinde güncellemelidir. MasterPage 'in yolunu adres çubuğunda görüntülemek için ise, http://sitecollection/site1 'in altında yer alan masterpage adresinden http://sitecollection/site1/masterpages/MyMaster.master yoluna göre güncelleriz.

"~sitecollection/MasterPageName.master"
Burada ise masterpage ~sitecollection yolunun içerisinden erişilebilmektedir. Ana sitenin yolu http://sitecollection iken http://sitecollection/MasterPageName.master yolu ile erişebilmek mümkündür.

Sharepoint İçerisinde Özel MasterPage Kullanımı

Eğer Sharepoint ile uygulama geliştirirken Sharepoint Designer yardımı ile yaparız. Özel bir masterpage oluşturmanın en kolay yolu var olan bir masterpage i tekrardan kopyalayarak yapıştırdıktan sonra gerekli düzenlemeleri yaparız.

Özel bir masterpage 'i oluşturduktan sonra diğer otomatik olarak bunun özel olarak oluşturulan bir masterpage olduğunu Sharepoint direkt anlamaz. Bu işlemi yapabilmek için Sharepoint Designer üzerinden de hazırlanan masterpage 'in üzerinde sağ tıklama yaparak bunu özel bir masterpage olduğunu belirten "Set as Custom Master Page" 'e tıklayarak belirtiriz.



Artık PreInit olayını yakaladıktan sonra web.config içerisinde MasterPage numarasını alıyoruz. Sonrasında eğer gelen sayfa numarası 1 ise custom1.master eğer gelen sayfa numarası 2 ise custom2.master 'ı aktif duruma getiriyoruz.


void page_PreInit(object sender, EventArgs e)
{
    Page page = sender as Page;
    string pageNo = ConfigurationManager.AppSettings["MasterPageNo"];


    if (page != null)
    {
        if (pageNo.Equals("1"))
            {
                page.MasterPageFile = "~masterurl/custom.master";
                if (SPContext.Current != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom1.master";
                }
            }
            else if (pageNo.Equals("2"))
           {
               page.MasterPageFile = "~masterurl/custom.master";
               if (SPContext.Current != null)
               {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom2.master";
               }

           }
           else
           {
                page.MasterPageFile = "~masterurl/default.master";
                if (SPContext.Current != null)
               {
                    SPContext.Current.Web.MasterUrl = "/_catalogs/masterpage/default.master";
               }
       }

}

web.config 'den gelen değere göre hangi masterpage 'in geleceği dinamik olarak görüntülenmektedir. Bu işlemi işinizi görecek şekilde güncelleyerek sorunlarınızı kolayca çözebilirsiniz.

Sonuç olarak bu yazımızda belirli kriterler doğrultusunda sharepoint server portal in masterpage 'ini dinamik olarak nasıl değiştirebileceğimizi incelemeye çalıştık.

Umarım yararlı olabilmiştir.