PSPCommunity.org ورود | ثبت نام | كمك

رامین احمدی

SharePoint Development

بيشترين بازديد شده

نسخه اصلاح شده سرویس پک 1 منتشر شد
بعد از مشکلاتی که در سرویس پک 1 شناسایی شد ، مایکروسافت برای مدتی سرویس پک 1 را از سرور خود حذف کرد تا اصلاحات را بر روی آن اعمال کند که هم اکنون پس از اصلاح مشکلات میتوانید سرویس پک 1 را از لینک های زیر دریافت کنید ، همچنین سرورهایی که به سرویس پک 1 قبلی آپدیت شده بودند میتوانند با نصب این آپدیت مشکلات را به وجود آمده را رفع نمایند. 


SharePoint Foundation SP1
SharePoint Server SP1
Project Server SP1
SharePoint Server Language Pack SP1
SharePoint Foundation Language Pack SP1
Office Web Apps Server SP1

SharePoint Server 2013 SP1 منتشر شد !

 روز گذشته مایکروسافت به طور رسمی سرویس پک 1 شیرپوینت و آفیس 2013 را منتشر کرد .

سرویس پک 1 شیرپوینت مشکلات امنیتی ، عملکرد و مسائل مربوط به ثبات را پوشش میدهد. برای دریافت سرویس پک 1 به این لینک مراجعه کنید . 

لیستی از مشکلات برطرف شده در این سرویس پک :

 

 

KB Number

Description

2817429​

Metadata is lost when documents that use a custom content type with a “Description” field are opened for editing.

2817429​

When an item is deleted, restored from recycle bin, and then deleted again, there is a primary key constraint error.

2817429​

An error occurs when files are moved between document libraries and the web time zone is behind that of the server.

2817429​

Metadata filtering at list level always lists all metadata terms.

2817429​

The hyperlink popup window drops the selected word to be linked when there is a delay of more than one second in opening the window.

2817429​

Multiple-column, SummaryLinkWebParts with a group heading style of “Separator” are rendered incorrectly.

2817429​

A hash tag that contains a full width space does not get created successfully.

2817429​

Search schema compression is now enabled by default to allow larger search schemas.

2817429​

Highlighting for FQL queries is now enabled for FQL as well as KQL.

2817429​

Opening a custom SharePoint list in datasheet view and applying multiple custom filters, where each filter has more than one condition, can result in an incomplete set of list items.

2817429​

When the “Export to Excel” button is clicked in a SharePoint document library that has the Content Type field displayed, the Content Type field does not appear in the Excel workbook.

2817429​

An error occurs after changing the “Manager” property in EditProfile.aspx page when the My Sites WebApp is not in the same farm as the UPA.

2817429​

SharePoint REST API does not return a well-defined error response for a duplicate key exception.

2817429​

Developers are unable to specify a Content Type ID when creating Content Types in the client object model.

2817429​

On list views in SharePoint sites, the Connect to Outlook button in the ribbon may be erroneously disabled.

2817429​

In some non-English languages of SharePoint, the text displayed in the callout UI for a document or list item, describing who last edited the item, may not be grammatically correct.

2817429​

Copy and Paste in a datasheet does not work correctly with Internet Explorer 11.

2817429​

Pages do not render in Safari for iPad when private browsing mode is used.

2817429​

When editing rich text fields in SharePoint, if the editing session exceeds 30 minutes, the edits may not be saved.

2817429​

An error that says “SCRIPT12004: An internal error occurred in the Microsoft Internet extensions” may occur intermittently when users visit their SkyDrive Pro or other pages on their personal site.

2817429​

InfoPath may crash when a form that points to a SharePoint list, with a lookup to another SharePoint list, is opened.

2817429​

An InfoPath form with extended characters in its name fails to open.

2817429​

An error that says “Security Validation for the form has timed out” may occur when an InfoPath form is digitally signed and hosted in a SharePoint site collection that uses the SharePoint version 2010 user experience.

2817429​

 ”Show document icon” remains unchecked and the document icon does not show in Edit Properties for a list item.

2817429​

A “Failed tagging this page” error occurs when the “I like it” button is clicked.

2817429​

The wrong term is removed when manually editing a multi-valued taxonomy field.

2817429​

When tagging list items using a language that is different from the term store default language, suggestions for labels are offered in multiple languages. The suggestions appear confusing because both language suggestions are listed without any identification of the language.

2817429​

An error that says “There was an error processing this request” may appear when editing the user profile.

2817429​

Times are missing from Date/Time results in certain filtered list web service calls.

2817429​

Minimal and no metadata are now enabled as supported JSON formats.

2817429​

Actions4 schema workflow actions can’t be deployed to SharePoint.

2817429​

Using Client Object Model, Stream.Seek() to seek to a particular position doesn’t seek at the proper offset.

2817429​

Refreshing a workflow status page generates the following error: “System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.”

2817429​

Setting custom, non-English outcomes in web pages on tasks in a workflow fails to set the value.

2817429​

Configurations of SharePoint using Azure Hybrid mode and Workflow Manager together can cause workflow callbacks to fail.

2817429​

Workflow task processes on wiki pages won’t start.

2817429​

Workflows won’t wait for changes to content approval status fields.

2817429​

E-mails generated by workflow cannot be disabled for approvals in SharePoint workflows.

2817429​

Workflows may fail to send an e-mail or send too many e-mails.

2817429​

Association variables do not update correctly for auto-start workflows.

2817429​

A KeyNotFoundException error may occur in a workflow when the associated task list uses unique permissions.

2817429​

Incomplete tasks are deleted when workflow task activities complete.

2817429​

Task activity is suspended when the task is completed using app-only credentials.

2817429​

An error that says “This task could not be updated at this time” occurs when trying to complete a workflow task using the “Open this task” button in Outlook.

2817429​

A workflow doesn’t respond properly when waiting for changes in specific types of list columns, such as Boolean, Date Time, and User.

 

 

 

تغییر هویت در شیرپوینت : SPUserToken ، Win32 API
 در مقاله قبلی در مورد RunWithElevatedPrivileges به صورت کامل صحبت کردیم ، در ادامه مقاله میخواهیم در مورد SPUserToken و Win32 API صحبت کنیم .

استفاده از User Token

یکی دیگر از راه های تغییر هویت در شیرپوینت استفاده از آبجکت SPUserToken می باشد .

با استفاده از این آبجکت کافیست شخص مورد نظر که میخواهیم عملیات با هویت او اجرا شود را بدانیم و با به دست آوردن Token عملیات را اجرا کنیم . با استفاده از مشخصه UserToken  از کلاس SPUser میتوانیم Token  یک شخص را بدست بیاوریم و سپس در Constructor  کلاس SPSite از آن استفاده کرده تا بتوانیم کدهای مورد نظر را اجرا کنیم .

این روش بهترین روش برای تغییر هویت می باشد ولی باید در هنگام استفاده از این روش مطمئن باشید که کاربری که قصد انجام عملیات با هویت وی را دارید در سایت وجود داشته باشد و همچنین مطمئن باشید که وی تمام دسترسی های لازم برای انجام عملیات شما را دارد .

به مثال زیر توجه کنید :

SPWeb oWeb = SPContext.Current.Web;

SPUserToken token = oWeb.AllUsers[@"RaminAhmadi"].UserToken;

using (SPSite elevatedSite = new SPSite(oWeb.Site.ID, token))

 {

    using (SPWeb elevatedweb = site.OpenWeb())

     {

      // codes

     }

 }

 در این مثال زمانی که کاربری درخواستی را صادر میکند ، کدها با هویت RaminAhmadi اجرا می شوند ، در واقع پس از ایجاد کلاس SPSite کلاس SPUser و SPUserTokenنیز ایجاد می گردد و تمام منابعی که در داخل شیرپوینت فراخوانی شوند با دسترسی های این کاربر خواهد بود .

اما نکاتی که در مورد این روش باید به آن توجه کنید :

Windows Security Context تغییر نمیکند !

 

در مثال بالا مقدار WindowsIdentity.GetCurrent().Name برابر SPContext.Current.Web.CurrentUser خواهد بود ، در واقع هویت Windows Security Context تغییری نخواهد کرد و برابر کاربری است که در شیرپوینت لاگین کرده است و درخواست را صادر نموده .

پس تمام دسترسی هایی که به منایع خارجی از جمله وب سرویس یا دیتابیس انجام شود برابر هویت ویندوز کاربر جاری خواهد بود !

Token  ها محدودیت زمانی دارند !

 

شما فقط 24 ساعت مهلت دارید تا از یک Token  استفاده کنید ، حتما میپرسید خوب معمولا اکثر عملیات در زمان های کوتاهی انجام می شود . باید خدمت شما عرض کنم که همیشه اینطور نیست ، در صورتی که Workflow یا Event Receiver ( از نوع asynchronous ) داشته باشید ممکن است زمان زیادی تا انجام گام بعدی وقفه وجود داشته باشد و در صورتی که Token در این مدت انقضا شده باشد کد شما با هویت کاربر جاری اجرا خواهد شد .

اما نگران نباشید ، این مورد قابل تغییر است ، شما میتوانید با یک خط دستور در PowerShell این موضوع را حل کنید :

   stsadm -o setproperty -propertyname token-timeout -propertyvalue 720

در مثال بالا ما زمان انقضا Token  را از 24 ساعت به 72 ساعت تغییر دادیم .

استفاده از Win32 API

 

همانطور که در روش های قبلی متوجه شده اید ما در هیچ یک از روش های قبلی نمیتوانیم خارج از شیرپوینت هویت را تغییر دهیم ( مثل Console Application ) .

اگر شما از پروژه های Console Application یا Windows Application استفاده کنید و نیاز به تغییر هویت برای فراخوانی وب سرویس و یا آبجکت مدل داشته باشید ، می بایست یک آبجکت از نوع WindowsIdentity ایجاد کنید :

class Program

    {

        // Declare signatures for Win32 LogonUser and CloseHandle APIs

        [DllImport("advapi32.dll", SetLastError = true)]

        static extern bool LogonUser(

        string principal,

        string authority,

        string password,

        LogonSessionType logonType,

        LogonProvider logonProvider,

        out IntPtr token);

        [DllImport("kernel32.dll", SetLastError = true)]

        static extern bool CloseHandle(IntPtr handle);

        enum LogonSessionType : uint

        {

            Interactive = 2,

            Network,

            Batch,

            Service,

            NetworkCleartext = 8,

            NewCredentials

        }

        enum LogonProvider : uint

        {

            Default = 0, // default for platform (use this!)

            WinNT35, // sends smoke signals to authority

            WinNT40, // uses NTLM

            WinNT50 // negotiates Kerb or NTLM

        }

 

        static void Main(string[] args)

        {

            string username;

            string password;

            string domain;

            Console.Write("Enter username:");

            username = Console.ReadLine();

            Console.Write("Enter domain:");

            domain = Console.ReadLine();

            Console.Write("Enter password: ");

            password = Console.ReadLine();

            IntPtr token = IntPtr.Zero;

            WindowsImpersonationContext impersonatedUser = null;

            try

            {

                bool result = LogonUser(username, domain, password, LogonSessionType.Network, LogonProvider.Default, out token);

                if (result)

                {

                    WindowsIdentity id = new WindowsIdentity(token);

                    // Begin impersonation

                    impersonatedUser = id.Impersonate();

                    Console.WriteLine("Identity after impersonation : " + WindowsIdentity.GetCurrent().Name);

                    // Call to Sharepoint Web services or object model

                }

                else

                {

                    Console.WriteLine("LogonUser failed: " + Marshal.GetLastWin32Error().ToString());

                }

            }

            catch

            {

            }

            finally

            {

                // Stop impersonation and revert to the process identity

                if (impersonatedUser != null)

                    impersonatedUser.Undo();

                // Free the token

                if (token != IntPtr.Zero)

                    CloseHandle(token);

            }

            // Verify the old process identity

            Console.WriteLine(String.Format("Identity after Undo: " + WindowsIdentity.GetCurrent().Name));

            Console.Read();

 

        }

 

    }

 

روش های دیگری هم برای این کار وجود دارد مثل RevertToSelf (به این لینک مراجعه نمایید ) و Impersonate(intPtr) ( مثال زیر ) :

private void ImpersonateCodeExecution()
{
            WindowsImpersonationContext ctx = null;
            try
            {
                if (!WindowsIdentity.GetCurrent().IsSystem)
                {
                    ctx = WindowsIdentity.Impersonate(System.IntPtr.Zero);
                    //execute your code here
                }
            }
            catch { }
            finally
            {
                if (ctx != null)
                {
                    ctx.Undo();
                }         
            }
 }

 

نکات مهم در مورد Impersonation در شیرپوینت :

·         سعی کنید به جای استفاده از SPSecurity.RunWithElevatedPrivileges از SPUserToken در کدهای خود استفاده کنید ، تنها در صورتی که نیاز به فراخوانی های خارج از شیرپوینت دارید که می بایست تحت اکانت Application Pool Identity اجرا شوند یا SPUser معتبر و یا شناخته شده ای برای انجام عملیات خود ندارید از SPSecurity.RunWithElevatedPrivileges استفاده کنید .

·         در صورتی که از SPSecurity.RunWithElevatedPrivileges استفاده می کنید همیشه تمام آبجکت های داخل بلاک را Dispose نمایید و آن ها را به خارج از بلاک منتقل نکنید .

·         در صورتی که در خارج از شیرپوینت نیاز به تغییر هویت دارید از Win32 API و یا WindowsIdentity.Impersonate(token) استفاده نمایید .

 

و اما در پایان لینک های مفید درباره Impersonation در شیرپوینت :

How To: Use Impersonation and Delegation in ASP.NET

How to use Impersonation for specific user using C#

Even Better Impersonation

SQL access with integrated security from SharePoint 

موفق و پیروز باشید. 

تغییر هویت در شیرپوینت : RunWithElevatedPrivileges
 یکی از مسائلی که اکثرا توسعه دهندگان شیرپوینت با آن مواجه هستند بحث Impersonation در شیرپوینت می باشد ، اما گاهی این مسئله مشکلات بسیاری همراه خود دارد و در صورتی که به درستی استفاده نشود خواسته های شما را برآورده نخواهد کرد.

امروز میخوام این مسئله رو به صورت کامل برای شما باز کنم ، اما قبل از اینکه به سراغ موارد استفاده بریم شرح کوتاهی در مورد Impersonation خواهیم داد :

Impersonation به نحوه پردازش کد یا بخشی از کد با هویت یک شخص دیگر در Context گفته می شود.

در برخی موارد ممکن است شما بخواهید از هویت شخصی دیگر ، هویت Application Pool ، مدیر سایت یا مجموعه سایت ( System Account ) و یا حتی از هویت کاربران ویندوز به خاطر مجوزهایی که هر یکی از این افراد دارند استفاده کنید ، اما قبل از اینکه تصمیم بگیرید که از برای Impersonation  از چه هویتی استفاده کنید این نکته بسیار مهم است که تفاوت بین SharePoint Security Context و Windows Security Context را خوب درک کنید .

در محیط شیرپوینت و برنامه هایی که برای آن نوشته می شود (مثل یک وب پارت ) شما علاوه بر اینکه نیاز دارید به منابع داخلی دسترسی داشته باشید ( مانند لیست ها ، مخازن اسناد ، فایل ها و ... ) ممکن است نیاز به دسترسی به منابع خارجی پیدا کنید ( مانند جداولی در SQL Server  یا یک سیستم خارجی و یا حتی Shared Folders ) که دسترسی به این منابع خارج از کنترل شیرپوینت می باشد ، پس زمانی که میخواهید از Impersonation  استفاده کنید حتما باید این نکات را در نظر داشته باشید تا تمام نیازهای شما برطرف گردد .

خوب حالا اجازه بدید ببینیم چطور میتونیم از روش های مختلف برای Impersonation  استفاده کنیم :

 استفاده از SPSecurity.RunWithElevatedPrivileges

اجرای کدها توسط RunWithElevatedPrivileges یکی از محبوب ترین روش ها برای اجرای کد با هویتی که دارای مجوزهای لازم است می باشد :

 

SPSecurity.RunWithElevatedPrivileges(delegate()

{

   using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Id))

   {

      using (SPWeb elevatedWeb = elevatedSite.OpenWeb(SPContext.Current.Web.Id))

      {

          // codes …

      }

   }

});

 

اما با اجرای کدهایی که داخل این بلاک قرار میگیرند تغییراتی بدین صورت اعمال خواهد شد :

هر دوی Windows Security Context و SharePoint Security Context تغییر خواهند کرد .

elevatedWeb.CurrentUser.LoginName برابر SharePointSystem خواهد بود .

WindowsIdentity.getCurrent().Name برابر هویت Application Pool  خواهد بود.

با توجه به تغییراتی که صورت میگیرد کدهای داخل این بلاک بر مبنای هویت Application Pool اجرا می شوند ( Windows Account ) که در واقع این هویت اجرا کننده Web Application شماست و همچنین وظیفه پیکربندی تنظیمات دیتابیس را نیز بر عهده دارد ، بنابراین با اجرای این کد شما به تمام منابع خارجی شامل Local file System و جداول SQL Server  دسترسی دارید .

همچنین با توجه به اینکه در حوزه SharePoint Security Context این کد با هویت SHAREPOINTSYSTEM اجرا میشود ، هرگونه تغییری که بر روی آبجکت ها اعمال شوند ( SPFile ، SPListItem ، SPWeb و ... ) تغییرات با هویت SHAREPOINTSYSTEM ثبت می شوند ( Created By و Modified By ) .

اما نکات مهمی در مورد RunWithElevatedPrivileges هستند که باید در مورد آنها اطلاعات کافی داشته باشیم :

1 – RunWithElevatedPrivileges تنها زمانی اجرا می شود که آبجکت SPSite داخل این بلاک ایجاد شود

شما می بایست برای اجرای کدها حتما آبکجت های SPSite  و SPWeb را داخل بلاک ایجاد نمایید ( با استفاده از Url ، ID سایت  و یا حتی با استفاده از SPContext ) در غیر اینصورت با خطای Access Denied  مواجه خواهید شد ، به مثال زیر توجه کنید :

SPSecurity.RunWithElevatedPrivileges(delegate()

{

      SPSite elevatedSite = SPContext.Current.Site;

      using (SPWeb elevatedWeb = elevatedSite.OpenWeb())

      {

         // Performing administrative actions here will give Access Denied exception.

      }

   }

});

فراموش نکنید که پس از استفاده از این آبجکت ها حتما آن ها را Dispose کنید .

2- استفاده نادرست از آبجکت ها ممکن است ریسک های امنیتی دربر داشته باشد

آبجکت هایی که در داخل این بلاک استفاده می شوند ( مانند SPFile ، SPList و ... ) مجوزهای خود را حتی خارج از این بلاک نیز حفظ میکنند ! بنابراین شما نباید این آبجکت ها را به خارج از بلاک ارسال کنید وگرنه ممکن است با مشکلات امنیتی مواجه شوید . مثال زیر را در نظر بگیرید :

SPList taskList=null;

SPSecurity.RunWithElevatedPrivileges(delegate()

{

      SPSite elevatedSite = SPContext.Current.Site;

 

      using (SPWeb elevatedWeb = elevatedSite.OpenWeb())

      {

           taskList = elevatedWeb.Lists["Tasks"]

      }

   }

});

//This code will succeed even outside the block as it is accessed via elevated SPWeb. Hence Security Risk.

taskList.Delete();

در واقع زمانی که شما یک آبجکت SPSite ایجاد میکنید ، این آّبجکت با زیر ساخت SPRequest ادامه پیدا میکند و SPRequest کاربری که این آبجکت را ایجاد کرده به خاطر میسپارد ، بنابراین تمام اشیایی که از SPSite  مورد دسترسی قرار میگیرند SPRequest را مورد اشتراک قرار می دهند .

در مثال بالا وقتی SPSite در این بلاک ایجاد میشود SPRequest کاربری که این آبجکت را ایجاد کرده ثبت میکند که در مثال بالا SHAREPOINTSystem  می باشد . بنابراین زمانی که آبجکتی مثل SPList را از این SPSite فراخوانی کنید ( مثل Site.RootWeb.Lists[ “Tasks”] ) ، این آبجکت حتی در خارج از بلاک نیز از هویت SHAREPOINTSystem برای تغییرات بهره خواهد برد .

 

3 – RunWithElevatedPrivileges تغییرات Windows Security Context را نیز به خوبی تشخیص می دهد .

به طور مثال اگر هویت Application Pool  یک Web Application را از SPAdmin1 به SPAdmin2 تغییر دهید و سپس از این بلاک استفاده کنید :

·         در داخل شیرپوینت هویت همچنان SHAREPOINTSYSTEM خواهد بود ( SharePoint Security Context)

·         تغییرات خارج از شیرپوینت با هویت کاربر تغییر یافته  ( SPAdmin2) اعمال خواهد شد ( Windows Security Context )

بنابراین تمام درخواست هایی که به سیستم های خارجی صورت پذیرد ( مثل وب سرویس یا دیتابیس ) بر اساس هویت Windows Account  خواهد بود که با توجه به مجوزهای کاربر ممکن است با موفقیت انجام شده و یا با خطا به پایان برسد.

 

4- RunWithElevatedPrivileges زمانی که HTTPContext برابر Null باشد اجرا نخواهد شد !

شما نمیتوانید از این بلاک زمانی که HTTPContext یا درواقع SPContext برابر Null باشد استفاده کنید و کدهای داخل بلاک بدون توجه به RunWithElevatedPrivileges اجرا خواهند شد ، بنابراین شما نمیتوانید از این بلاک در پروژه های Console Application  ، Timer Job و حتی Event Handlers که HTTPContext برابر Null  می باشد ( به دلیل اینکه درخواستی از سمت مرورگر ارسال نمیشود ) استفاده کنید .

5 – RunWithElevatedPrivileges در پروژه های Sandbox solution  اجرا نمیشود .

شما نمیتوانید از این بلاک در پروژه های sandbox solution استفاده کنید و می بایست پروژه های شما حتما از نوع Farm Solution  باشند . ( برای اطلاعات بیشتر در مورد محدودیت های sandbox solution به این لینک مراجعه کنید )

6- اعمال تغییرات با هویت کاربر فعلی ( شخصی که عملیات را انجام میدهد )

همانطور که در بالا ذکر شد زمانی که شما از این بلاک استفاده میکنید تمام تغییرات مانند Created by و Modified by با هویت SHAREPOINTSYSTEM  ذخیره خواهند شد ، ولی مشکلی که اکثر توسعه دهندگان دارند در این است که میخواهند تغییرات با هویت شخص جاری که در حال اجرای عملیات است ذخیره شود ( به عنوان مثل user1 ) .

برای این کار کافیست کاربر جاری را قبل از انجام عملیات در بلاک در متغیری ذخیره کرده و سپس تغییرات را به اسم وی ثبت کنید ، به مثال زیر توجه کنید :

private void UpdateItem(SPList RestrictedList, bool IsAnonymous)

{

SPUser user =SPContext.CurrentWeb.CurrentUser;

Guid siteID = RestrictedList.ParentWeb.Site.ID;

Guid webID = RestrictedList.ParentWeb.ID;

Guid listID = RestrictedList.ID;

SPSecurity.RunWithElevatedPrivileges(() =>

{

using (SPSite site = new SPSite(siteID))

{

using (SPWeb web = site.OpenWeb(webID))

{

web.AllowUnsafeUpdates = true;

SPList elevatedList = web.Lists[listID];

SPListItem item = elevatedList.Items.Add();

SPUser systemUser = web.AllUsers[@"SHAREPOINT\system"];

SPFieldUserValue currentUser = new SPFieldUserValue( item.ParentList.ParentWeb, user.ID, user.Name);

if (!IsAnonymous)

{

item["Author"] = currentUser;

item["Editor"] = currentUser;

} else {

item["Author"] = systemUser;

item["Editor"] = systemUser;

}

item.Update();

}

}

}

);

}

}

 

در این مثال فیلدهای Author و Editor مشخص کننده ایجاد کننده و ویرایش کننده آیتم هستند .

امیدوارم که این مقاله مفید بوده باشه ، در قسمت بعد مقاله در مورد SPUserToken و Win32 API صحبت خواهیم کرد.

موفق و پیروز باشید 

پیاده سازی تقویم شمسی در شیرپوینت با استفاده از جاوا اسکریپت ( قسمت سوم )
 با سلام خدمت دوستان گرامی و عرض پوزش بابت تاخیر در ارسال ادامه این سری از مقالات ،

در قسمت قبلی یاد گرفتیم که چطور Date Picker پیشفرض شیرپوینت رو به شمسی تغییر بدیم اما مشکلی که داشتیم این بود که هنگام ذخیره کردن فرم پیغام خطایی دریافت میکردیم با این عنوان که شما میبایست تاریخی با فرمت میلادی وارد کنید.

اما در این قسمت از سری مقالات تقویم شمسی میخواهیم ببینم چطور میتونیم تاریخ هایی که به صورت شمسی انتخاب شده اند رو به میلادی تغییر دهیم .

اولین کاری که باید انجام بدیم اینه که بتونیم دکمه ذخیره رو در فرم پیدا کرده و اسکریپت مربوط به آن را تغییر دهیم که از طریق کد زیر میتوانید این کار را انجام دهید :

 

function findSaveButton()

{

          var tags = document.getElementsByTagName('INPUT');

          var SaveButton;

          for (var i = 0; i < tags.length; i++)

          {

                   if(tagsIdea.id.indexOf('diidIOSaveItem') != -1)

                   SaveButton=tagsIdea;

          }

          return SaveButton;

}

 

حالا می بایست قبل از اینکه فرم ارسال بشه به سرور تاریخ ها رو به میلادی تغییر دهیم :

 

function changeDatesBeforeSave()

                   {

                             changePersianDates();

                             sButton = findSaveButton();

                             if (!PreSaveItem()) {

                                      return false;

                             }

                            

                             WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(sButton.name, "", true, "", "", false, true));

                   }

 

                   function changePersianDates()

                   {

                            

                             $(function() {

                                      var tags = document.getElementsByTagName('IMG');

                                      for (var i = 0; i < tags.length; i++)

                                      {

                                                 var tempString = tagsIdea.id;

                                                 if (tempString.indexOf('DatePickerImage') != -1)

                                                 {

                                                          var dtcontrolId = tempString.replace('DatePickerImage','');

                                                          var DateValue = document.getElementById(dtcontrolId).value;

                                                           if(DateValue)

                                                           {                                                      

                                                                   var splitter = DateValue.split('/');

                                                                  

                                                                   Year = new Number(splitter[0]);

                                                                   Month = new Number(splitter[1]);

                                                                   Day = new Number(splitter[2]);

                                                                   if(Year<1400)

                                                                   {

                                                                             var j = persian_to_jd(Year,Month,Day);

                                                                             perscal = jd_to_gregorian(j);

                                                                             pyear = perscal[0];

                                                                             pmonth = perscal[1];

                                                                             pday = perscal[2];

                                                                             if(Number(pmonth) < 10)

                                                                             pmonth = "0" + pmonth;

 

                                                                             if(Number(pday) < 10)

                                                                             {

                                                                                      pday = "0" + pday;                                                           

                                                                             }

                                                                            

                                                                             var miladiDate = pmonth + "/" + pday + "/" + pyear;                                                                                                                                               

                                                                             document.getElementById(dtcontrolId).value = miladiDate;

                                                                   }

                                                                  

                                                           }

                                                }

                                      }

                             });               

                  

                   }

                            

 

این تمام کاری هست که شما میبایست انجام دهید ، من آخرین ورژن از اسکریپت رو براتون آماده کردم که میتونید از اینجا دریافت کنید و فقط کافیست کدهای درون این فایل رو همانند قسمت های قبلی در فایل masterpage وارد نمایید.

موفق و پیروز باشید

رامین احمدی 

پیاده سازی تقویم شمسی در شیرپوینت با استفاده از جاوا اسکریپت ( قسمت دوم )

در قسمت قبلی مقاله مشاهده کردید که چگونه میتوان تاریخ هایی که در یک صفحه قرار دارد را به شمسی تغییر داد ، در این مقاله قصد دارم به شما آموزش دهم چگونه با استفاده از

Jquery و جاوا اسکریپت Date Picker شیرپوینت را به شمسی تغییر دهید .

اگر ستونی از نوع تقویم در لیست های خود داشته باشید هنگام ایجاد یا ویرایش یک مورد جدید Date Picker شیرپوینت با توجه نوع تقویم انتخاب شده به شکل زیر نمایش داده میشود :

 اگر به سورس صفحه مراجعه کنیم ، میبینم برای هر Picker کدی به شکل زیر ایجاد شده است :
  
 
پس ما میتوانیم با تغییر دادن این قسمت و ایجاد کدهایی برای Picker شمسی به هدف خود برسیم !
اما قبل از این کار ما نیاز به یک Date Picker خوب شمسی داریم ، من اینجا از Date Picker که دوست خوبم مهدی هاشمی نژاد در بلاگشون معرفی کردند استفاده میکنم ، که میتوانید توضیحات و سورس کامل این Picker را از اینجادریافت نمایید.
من آخرین فایل ها را با کمی تغییر و ایجاد نسخه نهایی از آن برای استفاده در شیرپوینت آماده کردم که برای مرحله اول کار می بایست این فایل ها را از اینجا دریافت نمایید .
فایل ها را از حالت فشرده خارج و در مسیر زیر کپی نمایید :
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IMAGES
 
اگر یادتون باشه در قسمت قبلی مقاله ما تغییراتی را در فایل Master Page سایتی که میخواهیم از تقویم شمسی در آن استفاده کنیم ایجاد کردیم ، برای اضافه کردن کدهای جدید این فایل را باز کرده و کدهای زیر را قبل از بسته شدن تگ Head (کلمه </head> را جستجو کنید )به آن اضافه کنید :
 
 <link type="text/css" href="/_layouts/images/jquery-ui-1.8.14.css" rel="stylesheet" />
<script type="text/javascript" src="/_layouts/images/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="/_layouts/images/jquery.ui.datepicker-cc.all.min.js"></script>
 
حالا به انتهای فایل رفته و در قسمتی که کدهای مقاله پیش را وارد کرده بودید ، کدهای زیر را اضافه کنید : 

changeDatePickerToPersian();

                   // تغییر پیکر تاریخ

                   function changeDatePickerToPersian()

                   {

                             $(function() {

                                      var tags = document.getElementsByTagName('IMG');

                                      for (var i = 0; i < tags.length; i++)

                                      { var tempString = tagsIdea.id;

                                                 if (tempString.indexOf('DatePickerImage') != -1){

                                                 document.getElementById(tempString).style.display = 'none';

                                                 var dtcontrolId = tempString.replace('DatePickerImage','');                                   

                                                 $("#" + dtcontrolId).datepicker({showOn: 'button',buttonImage: '/_layouts/images/calendar.gif',buttonImageOnly: true});

                                                 }

                                      }

                             });

}

فایل را ذخیره کرده ، به یکی از لیست هایی که دارای ستون تقویم میباشد مثل لیست وظایف رفته و مورد جدیدی را ایجاد یا موردی را ویرایش کنید ، میتوانید Date Picker شمسی را مشاهده کنید و از انتخاب آن لذت ببرید ! 

اما تغییر کوچک دیگری نیز باید در کدها ایجاد کنیم ، اگر به تصویر بالا نگاه کنید زمانی که ستون دارای مقدار پیش فرض می باشد یا زمانی که در حالت ویرایش مورد این ستون از قبل مقدار گرفته باشد ، تاریخی که در این ستون نمایش داده می شود به صورت میلادی است که باید مقدار آنرا به شمسی تغییر دهید ، ما توابع تبدیل را در اختیار داریم و آن را در فایل Master Page وارد کردیم ، پس تنها کاری که باید انجام بدیم پیدا کردن این کنترل و تغییر مقدار آن می باشد که توسط کد زیر صورت می گیرد :

var DateValue = document.getElementById(dtcontrolId).value;

if(DateValue)

{                                                       

          Year = new Number(DateValue.substring(0, 4));                                        

          Month = new Number(DateValue.substring(5, 7));

          Day = new Number(DateValue.substring(8, 10));

          if(Year > 2000)

          {

                   // تبدیل تاریخ میلادی به شمسی

                   var j = gregorian_to_jd(Year,Month,Day);

                   perscal = jd_to_persian(j);

                   pyear = perscal[0];

                   pmonth = perscal[1];

                   pday = perscal[2];

                                                                  

                   if(Number(pmonth) < 10)

                             pmonth = "0" + pmonth;

 

                   if(Number(pday) < 10)

                             pday = "0" + pday;                                                           

                  

                   // ذخیره مقدار تاریخ شمسی

                   var shamsiDate = pyear + "/" + pmonth + "/" + pday;

                                                                  

                   // جایگذاری مقدار تاریخ میلادی با شمسی

                   document.getElementById(dtcontrolId).value = shamsiDate;

          }

}

که بعد از انجام این تغییرات در هنگام لود شدن کنترل تاریخ میلادی به شمسی تغییر خواهد یافت :

 

در نهایت ما تابعی خواهیم داشت که Date Picker میلادی را به شمسی تغییر خواهد داد !

در قسمت بعدی مقاله به نحوه ذخیره این تاریخ ها خواهم پرداخت ، منتظر نظرات شما هستم ! ضمناً دوستانی که مایل هستند در پروژه فارسی سازی شیرپوینت فاندیشن 2013 با من همکاری داشته باشند لطفا مشخصاتشون رو به من ایمیل کنند .

کدهای نهایی که در واقع کدهای این قسمت و کدهای قسمت قبل می باشد را میتوانید ازاینجا دریافت کنید .

موفق و پیروز باشید. 

پیاده سازی تقویم شمسی در شیرپوینت با استفاده از جاوا اسکریپت ( قسمت اول )
 خدمت تمامی دوستان عزیز سلام عرض میکنم ، سال نو رو به همه شما عزیزان تبریک عرض میکنم و امیدوارم که سالی خوب و خوش در کنار تازه رسیده خودمون یعنی شیرپوینت 2013 داشته باشید !

مدت زمان زیادی بود که در خدمت شما عزیزان نبودم ، گرفتاری های زیادی در پروژه ها و تدریس دوره های توسعه شیرپوینت داشتم و اخیرا هم آزمون های شیرپوینت 2010 رو پشت سر گذاشتم و موفق شدم مدارک 573-70 و 576-70 رو با موفقیت دریافت کنم .

در مجموعه مقالاتی که خدمت شما ارائه خواهم کرد در مورد پیاده سازی تقویم شمسی با استفاده از امکانات جاوا اسکریپت و Jquery صحبت خواهد شد و به شما آموزش خواهم داد چگونه بدون استفاده از کدهای سمت سرور بتوانید تقویم شمسی را در شیرپوینت مورد استفاده قرار دهید ، این روش ضعف هایی هم دارد ولی به هر حال میتواند کمک زیادی به شما در یادگیری و استفاده از تقویم شمسی داشته باشد .

تغییر تاریخ ها در نمای لیست

در این بخش از مقاله قصد داریم تاریخ هایی که در نمای یک لیست یا کتابخانه اسناد وجود دارد را به شمسی تبدیل نماییم ، در این مثال تقویم سایت را می بایست بر روی تقویم میلادی قرار دهید ، اگر در نمای لیست هایتان ستون هایی از نوع تاریخ داشته باشید ، صفحه ای همچون شکل زیر را مشاهده خواهید نمود :

 

 همانطور که مشاهده میکنید در این مثال که یک لیست از نوع وظایف را نمایش می دهد دو ستون به نامه های تاریخ شروع و تاریخ انجام وجود دارد که تاریخ های میلادی در این نما کاملا مشخص هستند.

اگر نگاهی به سورس صفحه داشته باشید خواهید دید که هر یک از سطرهای این نما که به صورت جدول ذخیره شده اند دارای TD هایی هستند که مقدار Class آن ها برابر ms-vb2 میباشد .

اگر بخواهیم مقادیر این تاریخ ها رو تغییر دهیم نیاز داریم یک Loop ساده بین تمام تگ های TD این صفحه ایجاد کرده و تاریخ ها رو تشخیص و تغییر دهیم .

برای اینکه این کد قابل دسترسی در تمام لیست ها باشد ، ابتدا شیرپوینت دیزاینر را باز کرده و Master Page پیش فرض سایت را در حالت ویرایش قرار دهید و درست قبل از بسته شدن تگ Body ( مقدار </body> را جستجو کنید ) کد های زیر را وارد نمایید.

<script type="text/javascript">

                   // متغیر های مورد نیاز

                   var Day;

                   var Month;

                   var Year;

                   var pday;

                   var pmonth;

                   var pyear;

                  

                   // الگوی تشخیص مقادیر تاریخ

var RegExPattern = "\\d{1}\\/\\d{2}\\/\\d{4}";

var RegExPattern2 = "\\d{2}\\/\\d{2}\\/\\d{4}";

// دریافت تمام تگ های تی دی در صفحه

var tags = document.getElementsByTagName('TD');

for (var i = 0; i < tags.length; i++) 

// دریافت مقدار کلاس تگ

var TdClassName = tagsIdea.className;


// چک کردن مقدار

if (TdClassName .indexOf('ms-vb2') != -1)

{

// ذخیره مقدار درون تگ

if(document.all){

dateValue = tagsIdea.innerText;

} else{

dateValue = tagsIdea.textContent;

}

var regx = new RegExp(RegExPattern, "g");

var regx2 = new RegExp(RegExPattern2, "g");

// چک کردن اینکه آیا مقدار درون تگ از نوع تاریخ می باشد یا خیر

if (regx.test(dateValue) || regx2.test(dateValue)) 

{

var splitter = dateValue.split('/');

Year = new Number(splitter[2]);

Month = new Number(splitter[0]);

Day = new Number(splitter[1]);

// تبدیل تاریخ میلادی به شمسی

var j = gregorian_to_jd(Year,Month,Day);

perscal = jd_to_persian(j);

pyear = perscal[0];

pmonth = perscal[1];

pday = perscal[2];

if(Number(pmonth) < 10)

pmonth = "0" + pmonth;


if(Number(pday) < 10)

{

pday = "0" + pday;

}

// ذخیره مقدار تاریخ شمسی

var shamsiDate = pyear + "/" + pmonth + "/" + pday;

// جایگذاری مقدار تاریخ میلادی با شمسی

if(document.all){

tagsIdea.innerText = shamsiDate;

} else{

tagsIdea.textContent = shamsiDate;

}

}

}

}

                   // توابع تبدیل تاریخ

                   var GREGORIAN_EPOCH = 1721425.5;

                   function leap_gregorian(year) {

                             return ((year % 4) == 0) &&

                                                (!(((year % 100) == 0) && ((year % 400) != 0)));

                   }

 

 

                   function gregorian_to_jd(year, month, day) {

                             return (GREGORIAN_EPOCH - 1) +

                                         (365 * (year - 1)) +

                                         Math.floor((year - 1) / 4) +

                                         (-Math.floor((year - 1) / 100)) +

                                         Math.floor((year - 1) / 400) +

                                         Math.floor((((367 * month) - 362) / 12) +

                                         ((month <= 2) ? 0 :

                                                                                         (leap_gregorian(year) ? -1 : -2)

                                         ) +

                                         day);

                   }

 

                   function jd_to_persian(jd)

                   {

                             var year, month, day, depoch, cycle, cyear, ycycle,

                                      aux1, aux2, yday;

 

 

                             jd = Math.floor(jd) + 0.5;

 

                             depoch = jd - persian_to_jd(475, 1, 1);

                             cycle = Math.floor(depoch / 1029983);

                             cyear = mod(depoch, 1029983);

                             if (cyear == 1029982) {

                                      ycycle = 2820;

                             } else {

                                      aux1 = Math.floor(cyear / 366);

                                      aux2 = mod(cyear, 366);

                                      ycycle = Math.floor(((2134 * aux1) + (2816 * aux2) + 2815) / 1028522) +

                                                                   aux1 + 1;

                             }

                             year = ycycle + (2820 * cycle) + 474;

                             if (year <= 0) {

                                      year--;

                             }

                             yday = (jd - persian_to_jd(year, 1, 1)) + 1;

                             month = (yday <= 186) ? Math.ceil(yday / 31) : Math.ceil((yday - 6) / 30);

                             day = (jd - persian_to_jd(year, month, 1)) + 1;

                             return new Array(year, month, day);

                   }

</script>

 

 همانطور که میدانید در جاوا اسکریپت قابلیت استفاده از regular expression وجود دارد ، ما الگویی را برای تشخیص تاریخ تعریف نمودیم و سپس با استفاده از متد getElementsByTagName مجموعه ای از المنت های TD را در متغیری ذخیره نمودیم . سپس با یک Loop تک به تک تگ ها را چک نمودیم ، برای اینکه کارایی بالاتر رود و تگ های نا مربوط حذف گردند ما یک شرط در اینجا قرار دادیم تا فقط تگ هایی که نام کلاس آن ها ms-vb2 می باشد را مورد بررسی قرار دهد .

سپس مقدار داخلی تگ را در متغیری ذخیره و با متد regx.test چک خواهیم کرد که آیا مقدار تگ از نوع تاریخ است یا خیر ، اگر مقدار از نوع تاریخ باشد با استفاده از توابع تبدیل تاریخ ها ، تاریخ میلادی را به تاریخ شمسی تبدیل و مقدار جدید را جایگزین مقدار قبلی می نماییم .

اگر فایل را ذخیره نمایید و صفحه را مجدد بارگذاری کنید ، تاریخ ها به شکل زیر تغییر خواهند نمود :
 
 
به این شکل در اولین گام تاریخ های میلادی در تمام لیست ها و مخازن اسناد شما به تاریخ شمسی تبدیل شدند !

فکر میکنم هیجان زده شده اید برای تغییر قسمت های دیگر ، مثل لیست های از نوع تقویم و یا Date Picker شیرپوینت . برای شروع همین تمرین را انجام دهید ، در قسمت بعدی به  تغییر Date Picker و نحوه ذخیره تاریخ های شمسی خواهیم پرداخت .

امیدوارم که این مقاله برای شما مورد استفاده قرار گرفته باشد .

اگر کدها ناخوانا هستند میتوانید فایل اسکریپت مربوطه را از اینجا دریافت نمایید. 

موفق و پیروز باشید. 

اشتباهات رایج برنامه نویسی در شیرپوینت – قسمت دوم

در مقاله قبلی 5 مورد از اشتباهات رایج برنامه نویسی در شیرپوینت مطرح شد و در این مقاله قصد دارم به چند مورد دیگر از اشتباهات رایج برنامه نویسی در شیرپوینت بپردازم .

Null بودن مقادیر

حتما برای شما زیاد پیش آمده که بخواهید مقادیر یک آیتم از لیست را بخوانید و مورد استفاده قرار دهید ، اما موردی که همیشه باید به آن توجه کنید این است که زمانی که کاربر در هنگام وارد کردن اطلاعات ستونی را خالی بگذارد مقدار Null  در آن ستون ذخیره میشود و اگر شما تلاش کنید تا به مقدار آن ستون دسترسی پیدا کنید با خطا مواجه خواهید شد . در هنگام کار با آیتم ها برای دریافت مقادیر ذخیره شده بهتر یا از Try ، Catch به صورت زیر استفاده کنید :

String FullName = String.Empty;

SPList ContactList = web.Lists["Contacts"];

SPListItem item = ContactList.GetItemById(1);

try

{

    FullName = item["FullName"];

}

catch(Exception error)

{

    SPUtility.TransferToErrorPage(error.Message);

}

و یا قبل از مقدار دهی Null بود را چک کنید :

if(item["FullName"]!=null)

{

    FullName=Convert.ToString(item["FullName"]);

}

همچنین زمانی که قصد مقدار دهی یک ستون از آیتمی را دارید نیز همیشه از try ، Catch استفاده کنید ، زیرا ممکن است نوع ستون با مقداری که وارد میکنید متفاوت باشد و باعث بروز خطا شود و یا نام ستون را اشتباه وارد کرده باشید و یا ستونی که قصد مقدار دهی دارید اصلا وجود نداشته باشد.

SPList ContactList = web.Lists["Contacts"];

SPListItem item = ContactList.Items.Add();

try

{

    item["Title"] = "Ahmadi";

}

catch { }

try

{

    item["Name"] = "Ramin";

}

catch { }

try

{

    item["FullName"] = "Ramin Ahmadi";

}

catch { }

Null بودن لیست ها

اگر در شیرپوینت 2007 بخواهید به لیستی دسترسی پیدا کنید که وجود نداشته باشد با پیغام خطا مواجه میشوید و در ضمن نمیتوانید Null بودن ( وجود لیست ) را نیز بررسی کنید مگر اینکه ازtry ، catch استفاده کنید ، در شیرپوینت 2010 متدی به آبجکت SPList   با عنوان TryGetList  اضافه گردیده که با استفاده از آن میتوانید از وجود یک لیست با خبر شوید :

SPList ContactList = web.Lists.TryGetList("Contacts");

if (ContactList != null)

{

    // do something

}

 همانطور که مشاهده میکنید این متد شامل یک پارامتر رشته ای بوده که نام لیست را از شما دریافت میکند و سپس شما به راحتی میتوانید وجود یک لیست را بررسی و عملیات لازم را انجام دهید .

استفاده از نام های فارسی برای ستون ها

هنگام برنامه نویسی لیست ها همیشه سعی کنید برای عنوان ستون ها  از نام های لاتین استفاده کنید تا مشکلی در دسترسی به ستون ها نداشته باشید زیرا زمانی که از نام های فارسی استفاده کنید در دیتابیس با فرمت خاصی ذخیره میشود که دسترسی را برای شما سخت خواهد کرد ، هنگامی که ستونی ایجاد میشود Static Name آن با عنوانی که وارد کردید ذخیره میشود و پس از آن با هر بار تغییر عنوان ، Display Name  تغییر کرده و Static Name به همان شکل باقی خواهد ماند که میتوانید از آن در کدنویسی و دسترسی به ستون استفاده کنید .

list.Fields.Add("ProductName", SPFieldType.Text, true);

SPField field = list.Fields["ProductName"];

field.Title = "نام محصول";

field.Update();

string productName = list.GetItemById(1)["ProductName"].ToString();

                           

استفاده نادرست از Disposal Object

یکی دیگر از اشتباهات رایج در بین برنامه نویسان استفاده از آبجکت های Disposal به عنوان خروجی توابع میباشد و یا Dispose کردن این آبجکت ها قبل از استفاده ! به مثال زیر توجه کنید :

public static SPWeb GetSPWeb(string url)

{

using (var site = new SPSite(url))

{

    using (SPWeb web = site.OpenWeb())

    {

        return web;

    }

}

}

در این تابع آبجکت SPWeb قبل از بازگشت به کد اصلی برنامه Dispose شده است و برنامه را با خطا مواجه خواهد کرد .

استفاده از ViewFields در کوئری

همانطور که قبلا هم طی مقالاتی خدمت شما دوستان عزیز مطالبی رو در مورد بهبود سرعت عملیات در شیرپوینت اشاره کردم بودم بهتر است برای دریافت داده ها از لیست های شیرپوینتی از ViewFields و RowLimit استفاده کنید ، اما مشکلی که ممکن در استفاده از ViewFields برای شما به وجود آید دسترسی به داده هایی است که در کالکشن داده های کوئری وجود ندارند ! به طور مثال به کد زیر توجه کنید :

SPList UsersList = web.Lists["لیست کاربران"];

SPQuery search = new SPQuery();

search.Query = @"<Where><Eq><FieldRef Name='Account' LookupId='TRUE'/><Value Type='Integer'>2</Value></Eq></Where>";

search.RowLimit = 2;

search.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='ID'/>";

SPListItemCollection result = UsersList.GetItems(search);

if (result.Count > 0)

{

string FullName = result[0]["FullName"].ToString();

}

با اجرای این کد با خطا مواجه خواهید شد زیرا ستون FullName  را در ViewFields قرار نداده اید ! اما نحوه صحیح استفاده از این کد :

SPList UsersList = web.Lists["لیست کاربران"];

SPQuery search = new SPQuery();

search.Query = @"<Where><Eq><FieldRef Name='Account' LookupId='TRUE'/><Value Type='Integer'>2</Value></Eq></Where>";

search.RowLimit = 2;

search.ViewFields = "<FieldRef Name='FullName'/><FieldRef Name='ID'/>";

SPListItemCollection result = UsersList.GetItems(search);

if (result.Count > 0)

{

string FullName = result[0]["FullName"].ToString();

}

در ضمن به خاطر داشته باشید که ستونهایی که قصد دارید آنها را در قسمت شرط جستجو استفاده کنید لازم نیست در ViewFields آورده شوند ، در مثال بالا ما Account  را در قسمت ViewFields وارد نکردیم و این مشکلی برای جستجو ایجاد نخواهد کرد .

موفق و پیروز باشید .

تولید نرم افزار تحت شیرپوینت

یکی از مباحثی که این روز ها در تمام شرکت های مرتبط با شیرپوینت بسیار جدی دنبال میشود تولید نرم افزار تحت شیرپوینت است ، از تولید نرم افزارهای کوچک مثل ستون های سفارشی ، وب پارت ها و Add-on ها گرفته تا نرم افزارهای بزرگ مثل مدیریت پروژه ، اتوماسیون اداری ، مدیریت ایده ها ، کنترل مستندات و ....

اما یکی از مهمترین مواردی که قبل از شروع به تولید نرم افزارهای تحت شیرپوینت داشته باشید معماری و زیرساخت آن است ، شیرپوینت بستری است که شما میخواهید تحت آن نرم افزاری را تولید کنید پس شما همه چیز رو از صفر تولید نخواهید کرد و باید ابتدا معماری و ساختار شیرپوینت را به خوبی بشناسید و بدانید کی و کجا از امکانات شیرپوینت استفاده کنید و چه مواقعی از آنها استفاده نکنید ! متاسفانه در برخی مواقع توسعه دهندگان شیرپوینت با این تصور که نرم افزاری که مینویسند باید از تمام امکانات شیرپوینت استفاده کند نرم افزاری را تولید میکنند که در نهایت شکست میخورد . در این مقاله قصد دارم به برخی از تجربیاتی که در این ضمینه کسب کردم و اطلاعاتی که از منابع مختلف جمع آوری کردم بپردازم .

سوالات و مشکلات زیادی هستند که برنامه نویسان شیرپوینت باید قبل از هر کاری آنها را بررسی کنند مثل :

  • استفاده از لیست های شیرپوینت یا دیتابیس ؟
  • یک مجموعه سایت یا مجموعه ای از سایت ها ؟
  • بدون کد ، sandboxed solution یا full-trust solution ؟
  • SharePoint Foundation یا SharePoint Server ؟

همچنین شما به عنوان یک توسعه دهنده باید از تمام امکاناتی که شیرپوینت در اختیار شما قرار میدهد باخبر باشید ، به تصویر زیر توجه کنید :

شیرپوینت امکانات توسعه کاملی در اختیار شما قرار داده است ، در قسمت Content  یا محتوا شما امکاناتی نظیر مجموعه سایت ، سایت ها ، لیست ها ، پوشه ها و آیتم در اختیار دارید که میتوانید با استفاده از آنها داده ها و تراکنش های نرم افزار را مدیریت کنید ، در یک سطح بالاتر و در قسمتAdministration  آبجکت هایی برای توسعه مدیریت و فارم در اختیار دارید و همچنین آبجکتی مثل SPPersistedObject که با استفاده آن میتوانید تنظیمات دلخواه و جدیدی را توسعه داده و به شیرپوینت بیافزایید ، همچنین با امکاناتی نظیر SPJobDefinition میتوانید اکشن های خاصی را تولید کنید که به صورت اتوماتیک و در زمان های مشخص عملیاتی را انجام دهند .

در قسمت ماشین و در صورتی که نیاز داشته باشید به سطوح پایین تری از نرم افزار دسترسی داشته باشید میتوانید از امکانات ASP.Net  مثل HTTP Modules و یا Web.Config و وب سرویس استفاده کنید .

همچنین امکانات جدید و قابل توجه ای که در سرویس ها بوجود آمده که به شما این امکان را میدهد تا بهره وری بهتری از منابع سیستم داشته باشید و تا حد امکان از کند شدن سیستم جلوگیری کنید .

البته امکاناتی که در نسخه 2010 اضافه گردیده بسیار گسترده است که در این بحث نمیگنجد و پیشنهاد میکنم حتما آنها را بررسی کنید ، امکاناتی مثل روابط بین لیست ها ، امکان Join کردن آنها ، LINQ ، استفاده از Silverlight و امکانات Client Object Model ، توجه به امکانات جدید اضافه شده در Event Receiver ها و Workflow ها و ....

خوب ، کمی در مورد امکانات صحبت کردیم حالا میخواهیم بررسی کنیم که چه زمانی باید از این امکانات استفاده کنیم ، آیا باید از تمام این امکانات در نرم افزار استفاده کرد ؟

پکیج یا طراحی

نرم افزارهای تحت شیرپوینت به دو صورت تولید میشوند ، یا توسط اشخاص و با طراحی مستقیم از طریق امکانات و sharepoint Designer و یا توسط برنامه نویس و به صورت پکیج.

نرم افزارهایی که توسط اشخاص تولید میشوند در دیتابیس ذخیره میشوند و با Backup گرفتن مدیریت میشوند اما نرم افزارهایی که توسط برنامه نویس ایجاد میشوند از طریق سورس مدیریت میشود و تحت پکیج نصب میشوند ، شیرپوینت در اکثر مواقع ما را ملزم به ایجاد از طریق اشخاص میکند که با مدلهای توسعه کمی متفاوت است و معمولا مشکلاتی را به وجود می آورد اما یکی از مزیت های آن تولید ساده تر و سریع تر نسبت به تولید به صورت پکیج است ، همچنین به روز رسانی آن ساده تر است و مشکلی در محتوا و ساختار ایجاد نمیکند . قبل از تولید میبایست تصمیم بگیرید که میخواهید نرم افزار را از طریق مرورگر و امکانات خود شیرپوینت تولید کنید و یا میخواهید به صورت کامل از امکانات برنامه نویسی و پکیج استفاده کنید ، بهترین راهکار میتواند استفاده از هر دوی این امکانات باشد تا هم روند تولید تسریع شود و هم مشکلات کمتری در ارتقاء و کارایی به وجود آید .

محتوا

همیشه یکی از سوالاتی که در کار با شیرپوینت برای شما پیش می آید این است که از چه نوع سایتی استفاده کنیم ؟ آیا یک سایت از نوع Blank  باشد یاTeam Site ؟ آیا نیاز به Document Center  و یا Record Center دارید ؟ آیا یک سایت نیاز است یا میبایست یک مجموعه سایت همراه چندین زیر سایت ساخته شود ؟ آیا نیاز به ایجاد مجموعه سایت های جداگانه با قابلیت ارتباط وجود دارد ؟

اینها سوالات مهمی است که میبایست در ابتدا پروژه مطرح شود زیرا زیر ساخت آن را تشکیل میدهند .

سوالات دیگری که در این قسمت باید مطرح شود این است که :

  • به یک Administrator  نیاز است یا نیاز به مدیران بیشتری میباشد ؟
  • سطح دسترسی کاربران به سایت و لیست ها چگونه خواهد بود ؟
  • آیا در تولید کد نیاز به قسمت هایی هست که به دسترسی بالاتر نیاز داشته باشد ؟
  • آیا نیاز به تولید یک Template  جدید میباشد یا Template های موجود کفایت میکند ؟
  • آیا میبایست امکاناتی به سایت مورد استفاده افزوده شود ؟
  • ارتباط این سایت با دیگر سایت ها و قسمت های شیرپوینت چگونه است ؟
  • آیا نیاز به کنترل رویدادهای سایت ، لیست و آیتم ها میباشد ؟
  • فرایندهای مرتبط با نرم افزار چیست و مراحل انجام کار مشخص میباشد ؟

وقتی در نرم افزار خود از سایت ها و Template های مختلفی استفاده میکنید باید توجه داشته باشید که هر سایت دارای زبان ، مجوزها ، لیست ها و امکانات مختص به خود است و در توسعه میبایست به این موضوع بسیار اهمیت داد .

البته با توجه به نرم افزار و امکاناتی که قصد تولید آن را دارید سوالات میتواند متفاوت باشد اما مهم این است که قبل از تولید تمام جوانب را در نظر بگیرید تا نرم افزار بهترین کارایی را داشته باشد .

سرویس ها

اجازه بدید از سرویس ها شروع کنیم ، چه زمانی باید از سرویس ها استفاده کرد ؟

  • زمانی که بخواهیم به اطلاعات مشترکی خارج از محدوده برنامه یا سایت دسترسی داشته باشیم.
  • استفاده از ابزارهایی مثل آفیس و ارتباط با مجموعه نرم افزارهای آن.
  • جستجوی اطلاعات
  • انجام عملیاتی که بالای 5 دقیقه زمان نیاز داشته باشد.

همچنین پیشنهاد میشه از امکاناتی مثل WCF  بیشتر استفاده نمایید که علاوه بر اینکه بسیار کار با آن ساده میباشد بلکه کارایی صفحات را هم بالا میبرد ، فرض کنید وب پارتی دارید که حجم عظیمی از اطلاعات را با هر بار Refresh کاربر فراخوانی میکند ، به طور معمول استفاده از امکانات آبجکت مدل در اولویت قرار دارد در صورتی که استفاده از WCF میتواند بسیار به بهبود کارایی وب پارت کمک کند .

نرم افزارهایی با حجم اطلاعات زیاد

ممکن است در مواقعی نیاز به تولید نرم افزارهایی باشد که اطلاعات بسیار زیادی در آن رد و بدل میشود مثل اتوماسیون اداری ، BPMS ، کنترل کیفیت و کنترل مستندات ، انبار ، منابع انسانی و ....

در این مواقع توجه به برخی نکات بسیار حائز اهمیت است مثل :

  • استفاده از صفحات مدیریتی ( _layouts Pages ) و یا وب پارت ها برای نمایش داده ها
  • استفاده از Web Application های جداگانه برای استقرار سیستم و بهبود کارایی
  • ارائه راهکارهایی بر روی دیتابیس های موجود در SQL Server برای عدم افت کارایی سیستم زمانی که حجم اطلاعات رو به افزایش است
  • کاهش افراد با دسترسی Designer و Admin و استفاده بیشتر از دسترسی Contribute

مهمترین مسئله در ضمینه اینگونه نرم افزارهای کارایی و سرعت دسترسی به داده هاست که باید بسیار مورد توجه قرار گیرد به خصوص در ضمینه فیلتر کردن داده ها و همچنین فراخوانی آنها ( میتوانید سری مقالات در مورد افزایش کارایی در برنامه نویسی در شیرپوینت در پست های قبلی را مطالعه کنید )

امنیت

امنیت یا Security  در شیرپوینت یکی از مشکلات دائمی برنامه نویسان شیرپوینتی است ! به همین خاطر میبایست همیشه در مورد آن به دقت برنامه ریزی کنید ، مواردی که میبایست در این ضمینه در نظر بگیرید عبارتند از :

  • استفاده از امکاناتی مثل Break Inheritance  و Item Level Permisions در درجه بسیار خطرناک بوده زیرا باید مطمئن باشید که حتما این کار به درستی انجام شود وگرنه نرم افزار از کار خواهد افتاد و همچنین هزینه بسیار برای شما خواهد داشت و باعث کاهش کارایی خواهد شد .
  • همیشه زمانی که نیاز به ایجاد ، بروز رسانی و یا فراخوانی داده ها دارید بحث امنیت را خواهید داشت ، همیشه باید چک کنید که کاربر مجوز این عملیات را دارد یا خیر ؟ چه کاربرانی باید به این داده ها دسترسی داشته باشند و اگر دسترسی ندارند چه پیغامی میبایست دریافت کنند ؟
  • استفاده از آبجکت هایی مثل SPSecurity و یا Impersonation بسیاری از مشکلات امنیتی شما را برطرف خواهد کرد اما باید به خاطر داشته باشید استفاده مکرر از آنها خطراتی را نیز به همراه خواهد داشت !
  • منابع و داده هایی که به صورت عمومی در دسترس همه قرار میگیرند را از داده هایی که فقط گروهی میبایست به آنها دسترسی داشته باشند جدا کنید تا کنترل بهتری بر روی امنیت داده ها داشته باشید.
  • جستجو ( Search ) شیرپوینت از نا امن ترین جستجوهاست ! ممکن هر اطلاعاتی را به کاربر نمایش دهد ، همیشه زیرساخت جستجو را بررسی کرده و مطمئن شوید اطلاعات حساس در جستجوها به کاربر نمایش داده نمیشود !

Feature ها

در تمام نرم افزارهای کوچک و بزرگی که تولید میکنید ردپایی از Feature ها به چشم میخورد ، Feature ها به شما کمک میکنند تا نرم افزار را به قطعات کوچک تری تبدیل کرده و کنترل نرم افزار را بهتر در دست داشته باشید ، میتوانید Field ها ،  Content Type ها ، لیست ها ، مخازن اسناد ، فرایندها و هر چیز دیگری را در قالب Feature به شیرپوینت معرفی کنید ، این کار مزایای بسیار برای شما دارد و مهمترین آن استفاده از امکانات جدیدی است که در شیرپوینت 2010 برای Upgrade  کردن و نسخه گذاری Feature  ها اضافه گردیده .

همچنین باید این نکته را هم در نظر داشته باشید که هنگام فعال و غیرفعال کردن Feature ها میبایست پیش نیازها را چک کنید تا مشکلی در استفاده از آنها ایجاد نشود ، به طور مثال قبل از اینکه لیستی را فعال کنید که دارای ستون ها و Content Type هایی است که در Feature  های دیگری معرفی شده اند میبایست از فعال بودن Feature  های پیش نیاز اطمینان حاصل نمایید .

لیست یا دیتابیس

برای ذخیره داده ها از لیست استفاده کنیم یا دیتابیس ؟ هرکدام چه مزایا و معایبی دارند ؟ جواب این سوالات را در این قسمت میخواهیم بررسی کنیم ، ابتدا نگاهی به مزایا و معایب هر یک خواهیم انداخت .

لیست های شیرپوینت

  • پشتیبانی از اسناد ( Document Libraries )
  • یادآوری ها (Alerts )
  • فرایندها
  • امنیت
  • RSS
  • تعریف و پیاده سازی سریعتر

دیتابیس

  • تجمع
  • Transaction
  • کارایی و سرعت بیشتر
  • تناسب بیشتر
  • انعطاف پذیری بیشتر با کد

اما چه زمانی از لیست ها استفاده کنیم و چه زمانی از دیتابیس ؟

زمانی که نیاز است تا داده ها در دیتابیس ذخیره شوند میتوانید از راهکارهایی مثل لیست های خارجی ( External lists ) استفاده کنید .

زمانی از دیتابیس استفاده کنید که میخواهید داده هایی را بین سایت ها به اشتراک بگذارید و یا از کوئری های پیچیده استفاده کنید .

اگر میخواهید منابعی را در یک مجموعه سایت به اشتراک بگذارید میتوانید از یک لیست مخفی در سایت ریشه استفاده کنید .

چند نکته مهم هم در ضمینه ایجاد لیست ها وجود دارد ، چه زمانی لیستی را در ریشه استفاده کنید و چه زمانی لیست هایی در سایت های مختلف ایجاد کنید .

زمانی که نیاز به اطلاعاتی در تمام سایت ها باشد ( بیشتر شبیه تنظیمات نرم افزار یا تنظیمات عمومی ) و یا استفاده از قابلیت های ثابت مثل نماها برای نمایش داده های در سایت های مختلف لیستی را در سایت ریشه قرار دهید .

اگر نیاز به امنیت منحصر به فرد برای لیست دارید و یا ممکن است لیست در هر سایت سفارشی سازی شود ( فیلد ها و یا نماهایی به آن اضافه شود ) در هر سایت لیستی بسازید .

نکته دیگر این است که با حذف هر سایت لیست های آن نیز حذف میشود ! این مسئله را دست کم نگیرید زیرا ممکن است تاثیر به سزایی بر کل نرم افزار شما بگذارد .

برای Sync  کردن داده های لیست با سایر لیست ها میتوانید از امکاناتی مثل ChangeLog یا آبجکت GetListItemsChanges استفاده کنید .

جریان های کاری در مقابل رویدادها

امکانات رویدادها :

  • پشتیبانی از Validation
  • کاهش سربار
  • سرعت اجرای بیشتر
  • محدودیت اجرای یک رویداد در یک زمان
  • پشتیبانی از لیست و عملیات سایت و تغییرات

امکانات جریان های کاری

  • پشتیبانی بهتر برای عملیات طولانی
  • انعطاف پذیری بیشتر در تغییرات
  • ارتباط و هماهنگی بیشتر با کارمندان ( ارسال ایمیل ، ایجاد وظیفه و ... )
  • قابل ایجاد و استفاده در سایت های متفاوت

بدون کد یا کدنویسی

همانطور که اشاره کوتاهی شد میبایست تصمیم بگیرید کدام قسمت از نرم افزار میبایست با استفاده از کد نویسی تکمیل شود و کدام قسمت بدون کد.

بدون کد نویسی امکانات زیر در اختیار شما قرار دارد :

  • XML Definitions
  • استفاده از Ajax ، جاوا اسکریپت و Jquery
  • Silverlight
  • Re-Usable WorkflowS

امکانات Sandbox Solutions

  • Webparts
  • Workflow Actions
  • Infopath
  • Features
  • Events

امکانات Full Trust

  • Timer Jobs
  • Custom Field Types
  • Document Convertors
  • Central Administration Development
  • Service Applications

استفاده از امکانات No Code Solution یا بدون کد انعطاف در اجرا دارد ولی وابسته به امکانات پایه است که با استفاده از امکانات مثل Client Object Model  و Silverlight میتوانید ضعف های آن را بپوشانید. همچنین میتوانید از اسکریپت ها و Custom Master Page ها برای سفارشی کردن استفاده کنید . همچنین با استفاده از امکاناتی مثل XSLTListView و ContentEditorWebpart میتوانید صفحات و لیست ها را نیز سفارشی کنید .

استفاده از Sandbox Solution بسیار توسط مایکروسافت و برنامه نویسان حرفه ای پیشنهاد میشود زیرا میتواند بیشتر نیازهای شما را برآورده کند و همچنین نصب و پیاده سازی آن ساده تر بود و سربار زیادی برای سیستم ندارد ( در مورد Sandbox Solution در پست های بعدی مطالب بیشتر ارائه خواهم کرد )

اما تمام کدها و نیازهایی که یک برنامه نویس داشته باشد در پروژه های Full Trust قابل دسترس است و شما میبایست تصمیم بگیرید که چه زمانی از این 3 نوع راهکار استفاده کنید .

مواردی که در اینجا مطرح شد فقط خلاصه ای از مواردی است که باید در هنگام تولید نرم افزار مد نظر داشته باشید ، مباحث بسیار گسترده تر از این موارد است که سعی خواهم کرد در پست هایی بعدی حتما به آنها اشاره کنم .

در آخر پیشنهاد میکنم پست های زیر را با دقت مطالعه کنید :

Developing Applications for SharePoint 2010

patterns & practices SharePoint Guidance

Application Lifecycle Management in SharePoint 2010

موفق و پیروز

اشتباهات رایج برنامه نویسی در شیرپوینت – قسمت اول
در این مقاله قصد دارم اشاره ای به برخی از  اشتباهات رایجی که در بین برنامه نویسان شیرپوینت وجود دارد ، داشته باشم . در این مقاله به صورت کوتاه به برخی از این موارد خواهم پرداخت و در مقالات بعدی به طور کامل در مورد آنها مطالبی را خدمت شما عزیزان ارائه خواهم کرد .
خطاهای Disposing
زمانی که شما با .Net  برنامه نویسی میکنی نگرانی در مورد آزاد کردن آبجکت ها از حافظه ندارید چون میدانید که Grabage Collector  بخوبی این وظیفه را برای شما انجام میدهد اما در مورد شیرپوینت کمی قضیه متفاوت است و شما میبایست حواستان به برخی از آبجکت ها در شیرپوینت باشد وگرنه باعث خطاهای بسیاری خواهند شد.
دو نوع از پرکاربردترین این آبجکت ها SPSite  و SPWeb  میباشد که تقریبا در تمام کدهایی که مینویسید از آن استفاده میکنید ، پیشنهادی که در مورد این آبجکت ها شده به کار بردن Using  در هنگام استفاده از این آبجکت هاست ولی در برخی از موارد همDispose  کردن این آبجکت ها مشکلاتی را برای بقیه قسمت های برنامه به وجود می آورد و شما باید متوجه باشید که چه هنگام میبایست این آبجکت ها را Dispose  کنید ، برای اطلاعات بیشتر در این ضمینه میتوانید به این لینک های زیر مراجعه کنید :
خطاهای دسترسی
یکی از بزرگترین چالش هایی که برنامه نویسان شیرپوینت با آن روبرو هستند خطاهای دسترسی است ، زمانی که شما وب پارتی مینویسید و یا کدی که میبایست به یک سری از لیست ها و یا مخازن اسناد دسترسی پیدا کند ، اگر کاربر دسترسی لازم برای این کار را نداشته باشد با خطاهای دسترسی مواجه میشود ، برای جلوگیری از این خطاها راه های متفاوتی وجود دارد ، به طور مثال استفاده از کلاس هایی مثل SPSecurity  یا WindowsIdentity و یا استفاده از SPUserToken  به شما کمک میکند تا از خطاهای احتمالی در این ضمینه جلوگیری کنید ،البته متدهای بسیاری در این ضمینه وجود دارد ولی معمول ترین آنها این سه روش است . برای اطلاعات بیشتر میتوانید به لینک های زیر مراجعه کنید :
عدم فراخوانی متد Update
همانطور که میدانید آبجکت مدل شیرپوینت امکاناتی را برای شما فراهم کرده که بتوانید به راحتی به تمام قسمت های شیرپوینت دسترسی داشته باشید ، این کلاس ها به شما کمک میکنند بتوانید اقدام به ایجاد ، بروز رسانی و یا حذف آبجکت هایی مثل وب ، لیست ، آیتم و ... کنید .
اما وقتی شما از این کلاس ها استفاده میکنید باید به خاطر داشته باشید که در اکثر مواقع پس از انجام تغییرات میبایست از متد Update استفاده کنید تا تغییرات مورد نظر شما اعمال شود ، برخی مواقع فراموش کردن این موضوع باعث سردرگمی خود شما خواهد شد زیرا به نظر شما همه چیز درست است ولی نکته اینجاست که بدون فراخوانی این متد هیچ اتفاقی نخواهد افتاد !
عدم استفاده از AllowUnsafeUpdates
تغییرات در شیرپوینت گاهی اوقات به صورت مستقیم بر روی دیتابیس اعمال میشود ، برخی مواقع این دسترسی به دیتابیس به صورت امن انجام نمیشود و اگر نیازمند این باشید که حتما این تغییر صورت گیرد باید از AllowUnsafeUpdates از کلاسSPWeb  استفاده کنید تا بتوانید تغییرات لازم را اعمال کنید . برای اطلاعات بیشتر میتوانید به این لینک مراجعه کنید .
جلوگیری از خطاهای زمان اجرا
یکی از مواردی که همیشه در هنگام برنامه نویسی در شیرپوینت باید به خاطر داشته باشید این است که خطاهایی که در زمان اجرا رخ میدهد بسیار زیاد است ! علت آن هم این است که شیرپوینت محصولی است که شما آنرا ننوشته اید و حتی اگر 100 درصد هم به کدی که نوشتید اطمینان داشته باشید همیشه عامل هایی وجود دارد که باعث خطا خواهد شد ، پس پیشنهاد میکنم حتما از امکاناتی مثل Try ،  Catch استفاده کنید تا درصد خطاهایی که در برنامه های شما به وجود می آید جلوگیری کنید .
موفق و پیروز باشید.
10 اشتباه رایج راهبران شیرپوینت
با سلام
در این پست قصد دارم به برخی از اشتباهات رایج بین راهبران شیرپوینت ( SharePoint Administrators  ) بپردازم که میتواند مشکلات بسیاری را برای سازمان به وجود آورد .
در سالهای اخیر شیرپوینت در کشور ما بسیار رایج شده ولی متاسفانه به دلیل اینکه به درستی نصب و پیاده سازی نمیشود همیشه مشکلات بسیار زیادی را به وجود می آورد که باعث شکست شیرپوینت در سازمان ها میشود .
اما یکی از مهمترین دلایلی که باعث بروز این مشکلات میشود این است که افراد غیرمتخصصی شروع به پیاده سازی آن میکنند که پس از گذشت مدتی با بزرگ شدن آن دچار مشکلات فراوانی میشوند ، نقش راهبران شیرپوینت در سازمان ها بسیار مهم است و این افراد هستند که با مدیریت صحیح باعث رشد شیرپوینت و افزایش بهره وری آن برای سازمان ها میشوند .
در این قسمت میخوام 10 مورد از اشتباهات رایج بین راهبران شیرپوینت را ذکر کنم تا از بروز آنها در سازمان ها کاسته شود .
 
1 -  نداشتن شیرپوینت در عنوان شغلی

 

یکی از مهمترین و رایج ترین اشتباهات در سازمان ارجاع دادن وظایف شیرپوینت به کسانی است که تخصص شیرپوینت ندارند .
واضح است که این یک قانون نیست که حتما باید دوره های لازم برای راهبری شیرپوینت را گذرانده باشید تا بتوانید آن را تحت تسلط خود بگیرید ، اما موضوع اینجاست که مدیران شبکه یک سازمان نمیتوانند یک شبه تمام مفاهیم شیرپوینت را آموزش ببینند . البته اشتباه برداشت نکنید ، مسلما مدیران سیستم و شبکه اطلاعات بسیاری در مورد شیرپوینت میتوانند داشته باشند با این وجود اگر در سازمان شما نقشی به عنوان راهبر یا توسعه دهنده شیرپوینت داده شد به شما پیشنهاد میکنم حتما از مدیر خود درخواستی برای گذراندن دوره های لازم را بدهید .
این یک محصول بزرگ و در عین حال ترسناک میباشد ، نباید اینگونه تصور کنید که یک وب سایت دیگر به مجموعه سایت های IIS  شما اضافه شده و میتوانید آن را به راحتی مدیریت کنید ، به خاطر داشته باشید که اگر شما مسئولیت این محصول بزرگ را در کنار سایر مسئولیت های که به عنوان مدیر شبکه و یا سیستم برعهده دارید قبول کنید در آینده خیلی نزدیک میبایست زمان های بسیاری را بر روی آن کار کنید و طولی نمیکشد که نیاز به کمک افراد دیگر پیدا میکنید .
 
2 – ایجاد بیش از حد Web Applications
 
حتما برای شما هم بارها پیش آمده که وقتی به مرکز مدیریت شیرپوینت مراجعه میکنید لیستی بلندی از Web Application  ها رو میتونید ببینید ، اما ایجاد بیش از حد Web Application  ها مشکلات بسیاری برای شما از لحاظ کنترل کردن و همچنین کارایی به وجود می آورد ، به شما پیشنهاد میکنم قبل از اینکه بخواهید تصمیم بگیرید برای هر واحد ، هر پروژه و یا قسمت های دیگر سازمان خود Web Application جدیدی ایجاد کنید خوب راجع به اینکار فکر کنید و تمام جوانب آن از جمله اینکه آیا واقعا نیاز است که Web application  جدیدی برای آن ایجاد شود را در نظر بگیرید . سعی کنید محدودیت هایی که در این ضمینه وجود دارد را در نظر بگیرید ( برای اطلاعات بیشتر در مورد محدودیت های شیرپوینت به این لینک مراجعه کنید )
 
3 – ایجاد تغییرات دستی در IIS
 
اگر امکانی برای شما در مرکز مدیریت شیرپوینت وجود دارد هیچوقت به صورت دستی تغییراتی در IIS  ایجاد نکنید !
شیرپوینت محصولی است که سعی میکند تمام اطلاعات تنظیمات مورد نیاز را در دیتابیس ذخیره کند به طور مثال تمام سایت ها و Web Application  ها ،  Alternate Access Mappings و Authentication Providers ، این کار از بروز بسیاری از مشکلات جلوگیری میکند .
اما گاهی اوقات مسائلی هست که حتما باید از طریق IIS  تنظیم شود مثل SSL Certification  و یا تنظیمات Logging  .
فقط به خاطر داشته باشید قبل از اینکه به ایجاد تغییرات در IIS  فکر کنید چک کنید که آیا امکاناتی برای این کار در مرکز مدیریت فراهم شده یا خیر .
 
4 – ناکامی در استفاده از پکیج های شیرپوینت
این مورد در واقع همپوشانی فضای بین راهبر سیستم و توسعه دهنده آن است .  وقتی که برنامه نویس شیرپوینت مجموعه ای از فایل هایی که تحت WSP پکیج نشده اند را به شما میدهد هیچوقت آن را در سرور نصب نکنید !
وقتی که شما تغییراتی را به صورت دستی در پوشه های شیرپوینت میدهید ممکن است با دنیایی از مشکلات روبرو شوید ، خطاهایی از جمله خطای دسترسی و یا عدم وجود فایل و یا تاثیر در کارایی و استفاده بی رویه از منابع سیستم از جمله این مشکلات میباشند .
سعی کنید هیچوقت DLL ، Feature  ، Solution  و یا هر فایل و پکیج دیگری را به صورت دستی در سرور نصب نکنید تا از بروز مشکلات بعدی جلوگیری کنید .


5 – نصب شیرپوینت در یک سرور به صورت مستقل

بیشتر راهبران شیرپوینت این اشتباه را مرتکب میشوند که شیرپوینت را بر روی یک سرور به صورت مستقل نصب میکنند تنها به این دلیل که نیازهای سازمان بسیار کم است و نیاز به سرورهای جداگانه و پیاده سازی به صورت فارم را ندارد !
نصب شیرپوینت در حالت مستقل ( Standalone  ) محدودیت های بسیار زیادی برای شما ایجاد خواهد کرد زیرا SQL Server Express محدودیت های بسیار برای شما به وجود خواهد آورد (برای اطلاعات بیشتر این پست را بخوانید )
هیچگاه تنظیمات پیشفرض را انتخاب نکنید ، قبلا از اینکه بر روی Next  کلیک کنید بیشتر در مورد آن فکر کنید تا در آینده مشکلات شما کمتر شود .

 

6 – استفاده از تنظیمات پیشفرض Content Database
 

 

راهبران شیرپوینت به صورت پیشفرض از محیط Central Administration  اقدام به ایجاد Content Database  میکنند ، با این کار زمانی که شیرپوینت شروع به استفاده از این Content Database  میکند SQL Server  با توجه به فضاهای پیشفرض از تاریخ گذشته و تنظیمات رشد ( Growth Settings ) محدود خواهد شد !
در واقع این حقیقت را در نظر بگیرید که با هر بار استفاده ،به ازای هر مگابایت Content Database  شما رشد خواهد کرد . به طور مثال  با آپلود یک فایل 10 مگابایتی Content Database  شما 10 برابر بزرگتر خواهد شد !!
به یاد داشته باشید که شیرپوینت برای دریافت ( Download  ) بهینه سازی شده است نه آپلود ! با بهینه سازی این تنظیمات میتوانید به افزایش کارایی و بهره وری در شیرپوینت برسید .( در پست های بعدی مطلب جامعی در مورد تنظیمات دیتابیس برای بهبود کارایی در شیرپوینت 2010 خواهم نوشت )

 

7 – عدم مستند سازی تنظیمات farm
 
شما یک برنامه زمان بندی مناسب برای ایجاد نسخه پشتیبان از شیرپوینت در SQL Server  ایجاد میکنید . این بدین معنی است که تمامfarm  شما امن است و به خوبی پشتیبانی میشود ؟ خیر !
یکی از اشتباهات متداول این است که شما تصور میکنید به راحتی میتوانید اقدام به Restore  کردن دیتابیس کنید ، این افسانه ایست که به طور کامل در این پست شرح داده شده است .
به طور خلاصه ، گرفتن یک نسخه پشتیبان کاربرپسند ، راحت و کامل از farm  بدون استفاده از ابزارهای جانبی امکان پذیرنیست و اگر شما این ابزارها رو ندارید حتما تنظیمات و امکانات نصب شده بر روی فارم خود مستند کنید تا از بروز مشکلات جلوگیری شود .

 

8 – تغییرات دستی در دیتابیس شیرپوینت برای حل مشکلات
 
تغییرات  دستی در دیتابیس شیرپوینت پشتیبانی نمیشود !
این قانون ساده ایست که اکثرا یا نادیده گرفته میشود یا به درستی درک نمیشود ! به خاطر داشته باشید که همیشه از ابزارهای مناسب و یا از طریق برنامه نویسی ( آبجکت مدل شیرپوینت ) در دیتابیس تغییر ایجاد کنید . برای اطلاعات بیشتر میتوانید به این پست مراجعه کنید .

 

9 – PowerShell  تنها مختص برنامه نویسان نیست !

 

PowerShell  یکی از ابزارهای جدید در نسخه 2010 میباشد ، ممکن است در ابتدا این ابزار بسیار ترسناک جلوه کند ولی پس از کمی استفاده از آن متوجه میشوید که ابزاری فوق العاده کاربردی برای شما  میباشد .
با استفاده از این ابزار میتوانید به سرعت عملیات خود را انجام دهید ، سعی کنید زمانی را برای یادگیری این ابزار صرف کنید و مطمئنم که در زمان کوتاهی عاشق اون خواهید شد  . برای اطلاعات بیشتر در مورد مزایای powershell  به این پست نگاهی بیندازید .

 

10 – بی توجهی به توصیه های برنامه ریزی ظریفیت شیرپوینت
 
قبل از اینکه اقدام به ایجاد web application  ، مجموعه سایت ، لیست ، مخازن اسناد و یا هر ویژگی دیگری در شیرپوینت کنید محدودیت های آن را بررسی کنید تا با افزایش حجم مشکلی به وجود نیاورد ، بار دیگر به شما توصیه میکنم این مطلب را بخوانید قبل از اینکه تصمیمی در مورد ایجاد یک امکان در شیرپوینت بگیرید .
امیدوارم که این اطلاعات برای شما مفید بوده باشد ، در مقالات بعدی در مورد افزایش کارایی در شیرپوینت مطالبی را خدمت شما ارائه خواهم کرد .
موفق و پیروز باشید
 
منبع
وب پارت رایگان اوقات شرعی

با سلام و آرزوی قبولی طاعات و عبادات
به مناسبت فرا رسیدن ماه مبارک رمضان وب پارتی با نام اوقات شرعی تهیه کردم که میتوانید به صورت رایگان آنرا دریافت و نصب نمایید .
owghat.jpg

مراحل نصب :
1 – ابتدا فایل نصب را از سایت codeplex دریافت کنید .
2 – فایل setup.exe  را اجرا نمایید تا وب پارت نصب شود .
3 – پس از نصب به صفحه مورد نظر رفته و وب پارت را انتخاب کرده و به صفحه خود اضافه کنید .
موفق و پیروز باشید.
Posted: Saturday, August 6, 2011 7:04 PM توسط ramin | پيام 7
در زمینه:
راه اندازی Reporting Services در شیرپوینت 2010
با سلام خدمت دوستان عزیز
در این مقاله قصد دارم نحوه راه اندازی سرویس گزارش گیری یا همان Reporting Service  را خدمت شما ارائه دهم .
در ابتدا ما تنظیمات لازم در سرور دیتابیس را انجام خواهیم داد و سپس تنظیمات نهایی را در مرکز مدیریت شیرپوینت برای ارتباط با این سرویس انجام خواهیم داد .
تنظیمات سرور دیتابیس
 
اگر در هنگام نصب SQL Server  ویژگی Reporting Service  را فعال کرده اید میتوانید به مرحله بعد بروید در غیر اینصورت اولین مرحله نصب این سرویس میباشد ، فایل اجرایی نصب SQL Server 2008  را اجرا کرده و پس از گذراندن مراحل اولیه در صفحه Feature Selection  گزینهReporting Services  را فعال کنید و ادامه مراحل را طی کنید تا این سرویس نصب شود :

 

پس از نصب این سرویس ، Reporting Services Configuration Manager  را باز کنید :

به قسمت Web Services Url  بروید و بر روی URLs  کلیک کنید تا از صحت عملکرد وب سرویس مطمئن شوید :

 

پس از انجام مراحل بالا شما میتوانید به سرور شیرپوینت رفته و این سرویس را برای استفاده پیکربندی کنید .

 

تنظیمات سرور شیرپوینت

وارد سرور شیرپوینت شده و به مرکز مدیریت بروید ، به قسمت General Application Settings  رفته و بر روی Reporting Service Integration کلیک کنید :

نکته : اگر این گزینه در تنظیمات شما وجود ندارد Add-in  زیر را دریافت و بر روی سرور شیرپوینت خود نصب کنید :

SQL Server® 2008 R2 Reporting Services Add-in for Microsoft SharePoint® Technologies 2010

در صفحه بعد آدرس سرور دیتابیس و مشخصات ارتباط با آن را وارد نمایید تا مراحل یکپارچه سازی این سرویس با سرور شیرپوینت انجام شود :

 

 

 

اگر همه چیز با موفقیت انجام شود شما صفحه همانند صفحه زیر را مشاهده خواهید کرد :

نکته : اگر قسمت فعال سازی این ویژگی در سایت ها و مجموعه سایت ها با خطا مواجه شد شما میتوانید این کار را به صورت دستی انجام دهید .

 

نمایش گزارشات در صفحات شیرپوینت

پس از تنظیمات بالا شما میتوانید گزارشات خود را در شیرپوینت نمایش دهید ، برای این کار ابتدا فایل گزارش خود را در یکی از مخازن اسناد شیرپوینت بارگزاری نمایید ، سپس یک صفحه جدید ساخته و یا به یکی از صفحات موجود رفته و بر روی ویرایش صفحه کلیک کنید ، سپس از قسمت Insert  گزینه WebPart  رو انتخاب کنید :

 

 

به گروه SQL Server Reporting  رفته و SQL Server Reporting Services Report Viewer  را انتخاب کنید :

 

سپس به قسمت Edit Webpart  بروید :

در قسمت Report  گزارشی را که بارگزاری کرده بودید را انتخاب کرده تا بتوانید گزارش را مشاهده کنید :

 

در ادامه این مقاله نحوه پیاده سازی یک گزارش را با استفاده از این سرویس و با کمک ویژوال استدیو بررسی خواهیم کرد.

 

موفق و پیروز باشید .
 
سرویس پک 1 شیرپوینت منتشر شد !
با سلام
بالاخره انتظارها به پایان رسید و سرویس پک 1 شیرپوینت منتشر شد .
یک نکته مهم که باید توجه داشته باشید نصب  June 2011 Cumulative Update  بعد از نصب سرویس پک 1 میباشد ، این آپدیت چند باگ مهم امنیتی رو برطرف خواهد کرد . ( این آپدیت در پکیج سرویس پک 1 موجود نمیباشد )
 
برای نصب سرویس پک حتما این مطلب را بخوانید تا از مشکلاتی که در نصب و یا بعد از نصب ممکن است به وجود آید  مطلع شوید :
 
 http://support.microsoft.com/kb/2532126
 
برای اطلاعات بیشتر به این لینک مراجعه کنید :
http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?pID=984
 
دریافت سرویس پک :
 

1. Service Pack 1 for SharePoint Foundation 2010

2. Service Pack 1 for SharePoint Foundation 2010 Language Pack (if applicable)

3. Service Pack 1 for SharePoint Server 2010

4. Service Pack 1 for SharePoint Server 2010 Language Pack (if applicable)

 

استراتژی های برای تبدیل شدن به یک برنامه نویس موفق !
 برنامه نویسی یکی از سخت ترین شغل های دنیاست ، آدم های زیادی قدم به کدنویسی میگذارند ولی بعد از مدتی سر از شغل دیگه ای در میاورند ،چون برنامه نویسی انگیزه ای بسیار بالا میخواهد . اگر شما تازه برنامه نویسی رو شروع کردید و یا فکر میکنید هنوز خیلی چیزها هست که باید یاد بگیرید تا آخر این مقاله رو بخونید ، سعی میکنم بیشتر تجاربی که در این چند سال در پروژه های مختلف و تدریس های خودم بدست آوردم در اختیار شما قرار بدم تا بتونید برنامه نویس بهتری باشید  .

داشتن پشتکار

یکی از خصلت های ویژه هر برنامه نویس موفقی داشتن عشق و علاقه به کدنویسی است که باعث میشه از پس هر کد و برنامه ای بربیاد ، برنامه نویس هیچ وقت از شکست ناامید نمیشه ، برنامه نویسان جزو معدود افرادی هستند که همیشه تو زندگی ریسک های زیادی میکنند چون همیشه از هر شکستی تجربه های گرانبهایی برای از نو بنا کردن بدست میارند ، در واقع اگر میخواهید برنامه نویس خوبی بشوید اول از همه باید بدونید که تو این راه هیچ وقت کدی که مینویسید کد نهایی شما نیست و باید بارها اون رو اصلاح کنید و یا حتی همه اون کدها رو پاک کنید و دوباره از نو شروع کنید ! گاهی وقتها پس از ماه ها کدنویسی متوجه میشید که راهی که رفتید اشتباه بوده و باید برگردید به نقطه شروع ، اگر چنین روحیه ای ندارید ممکنه در آینده به مشکلات زیادی برخورد کنید .

برای پیشرفت و پیروزی 3 چیز لازم است : اول پشتکار ، دوم پشتکار و سوم پشتکار ! لرد بایرون

همیشه با آخرین تکنولوژی پیش بروید

شاید تو کمتر شغلی این همه تغییر رو ببینید ، هر سال نسخه جدید ، تکنولوژی جدید ، ابزارهای جدید و راه های جدیدی معرفی میشوند و شما باید اطلاعات و دانش خودتون رو هر ساله ارتقاء بدید ، اگر اول راه باشید همیشه این مورد یکی از دغدغه های اصلی شما خواهد بود و فکر میکنید این راه پایانی ندارد و هر ساله باید چیزهایی که یاد گرفته بودید رو کنار بگذارید و اطلاعات جدیدی جایگزین کنید ، ولی این را به خاطر داشته باشید که بعد از چندین سال اگر به درستی و به موقع خود را بروز کنید دیگر لازم نیست همه اطلاعات خود را از نو بسازید ! جایی میرسید که با استفاده از همه تجربیاتی که بدست آوردید با سرعت بیشتری اطلاعات خود را ارتقاء میدهید پس نگران این موضوع نباشید و به خاطر داشته باشید که هرگز در یک نقطه توقف نکنید ، همیشه از ابزارهای جدید استقبال کنید و آنها را کمکی برای بهبود کار خود ببینید .

پس زمان رو از دست ندهید ، Silverlight  ، Jquery  ، AJAX  ، MVC  ، LINQ و .... برای بهبود کار شما ساخته شده اند ، اگر کمی از وقت خود را صرف یادگیری آنها کنید میتوانید برنامه نویس بهتری شوید .

 

محیط Code به جای Design

شاید شما هم جزو برنامه نویسانی باشید که بیشتر از محیط Design  استفاده میکنید و کمتر سراغ کدنویسی میروید ، این کار فقط مهارت کدنویسی شما رو کاهش میدهد و از شما برنامه نویسی خواهد ساخت که بدون ابزاری مثل ویژوال استودیو هیچ کاری نمیتوانید انجام دهد ، سعی کنید از محیط کد استفاده کنید و هرچند که برای شما سخت باشد تمام کنترل ها رو به خاطر بسپارید ، خصوصیات و متدهای آن ها را بشناسید تا حتی اگر یک Notepad  در اختیار شما قرار دادند بتوانید یک سایت تولید کنید !


Copy  ، Paste  ممنوع !

 ارسال ایمیل یا کوئری زدن به دیتابیس برای شما کدهای نامفهومی داره که به خاطر سپردنش سخته ؟

پس شما این کدها رو در جایی نگهداری میکنید و هر وقت به اونها احتیاج پیدا کردید در جای مربوطه قرار میدهید ؟

این یکی از بدترین متدهایی است که یک برنامه نویس میتواند برای خود داشته باشد ، هر چقدر هم نوشتن کد برای شما سخت بود سعی کنید آن را بدون اینکه از جایی کپی کنید خودتان بنویسید ، میتوانید این کار را با به خاطر سپردن یک یا دو خط اول کد مربوطه شروع کنید تا کل کد را به خاطر بسپارید ، با این کار کدهای بیشتری به خاطر میسپارید و هیچ وقت نگران نیستید که اگر کدهایتان گم شود و یا دسترسی به آنها نداشته باشید چگونه کار خود را به پایان ببرید .

تکرار مادر یادگیریست ، آنتونی رابینز

 

گوگل بهترین دوست شماست !

خیلی وقت ها کسانی رو میبینم که برنامه نویسی میکنند ولی وقتی به مشکلی بر میخورند دست به دامان سایر برنامه نویسان و سایت های مختلفی میشوند که در نهایت هم هیچ جوابی نمیگیرند و وقتی از آنها میپرسی آیا در مورد مشکلت جستجو کرده ای ؟ میگویند جستجو .... !

شما دوستانی که در ابتدای راه هستید این را به خاطر داشته باشید که گوگل بهترین دوست شماست ، بهترین استادی که میتوانید ازش یاد بگیرید و مشکلاتتان را حل کنید . ( البته چون گوگل تو کشور و حتی جهان طرفدار بیشتری داره من اینجا از گوگل نام بردم ولی شما میتوانید از موتورهای جستجوی دیگری استفاده کنید ).

همیشه به خاطر داشته باشید آدم های زیادی هستند که دقیقا همین مشکلی که شما دارید رو داشته اند و همیشه کسانی هستند که راه کاری برای مشکل شما ارائه کرده باشند .

اگر به خطایی برخورد کردید کافیست همان خطا را در گوگل جستجو کنید تا نتایج را ببینید ، اگر احتیاج به کدی دارید فقط کافیست چند کلیدواژه رو در گوگل وارد کرده و زبان کد مورد نظر مثل VB  ، C#  ، جاوا اسکریپت و ... رو در انتهای آن وارد کنید تا به کدی که میخواهید برسید .

پس خود را دست کم نگیرید و به جای اینکه ساعت ها منتظر پاسخ دوستان خود بنشینید و یا مدتها صبر کنید تا در تالارهای گفتمان جواب شما را بدهند خودتان شروع به جستجو کنید .

تحصیل کرده ها معمولا آن قدر سرگرم آموختن تفکرات دیگران هستند که خود وقت فکر کردن ندارند . ادوارد دبونو

برنامه های کدباز  ، بهترین منابع آموزشی

اگر میخواهید تو برنامه نویسی پیشرفت کنید برنامه های کدباز بهترین منابع آموزشی برای شما هستند ، این برنامه ها که در سایت های زیادی میتونید پیدا کنید مثل Codeplex  و یا Code Gallery  مایکروسافت میتواند ایده های خیلی خوبی برای کدنویسی به شما بدهند ، کافیست سورس برنامه ها رو به دقت مرور کنید و از کدهایی که برنامه نویسان حرفه ای تولید کرده اند بهره ببرید .

همیشه قبل از اینکه شروع به نوشتن برنامه ای کنید به دنبال نمونه های مرتبط بگردید و با استفاده از برنامه های کدباز ، کدهای بهتری بنویسید و به تجربیات خود اضافه کنید .

کار خود را تحلیل کنید

قبل از اینکه آستین های خود را برای کدنویسی بالا بزنید و بدون وقفه و نگاه کردن به زمان ساعت های زیادی مشغول کد نویسی شوید سعی کنید در مورد برنامه ای که میخواهید بنویسید تحقیق کنید ، از کارفرمای خود بپرسید از برنامه چه توقعاتی دارد  ، خروجی هایی که نیاز دارد چیست ؟

چند وقت پیش عکسی دیدم که کامل این موضوع رو نشون میده :

2.jpg
مش​اهده تصویر در سایز بزرگتر

عکس بسیار جالب ولی با معناییست . سعی کنید حداقل به چیزی که مشتری میخواهد نزدیک شوید و سپس شروع به کد نویسی کنید ، در ضمن همیشه این را به خاطر بسپارید که همیشه در انتهای کار مشتری از شما تقاضایی برای تغییر دارد و بعد از نصب و پیاده سازی هم همیشه نیازهای جدیدی برایش به وجود می آید ولی شما باید قبل از اینکه بخواهید تا بی نهایت کد بنویسید در یک نقطه برنامه را تحویل دهید و سپس برای نیازهای جدید ، پروژه جدید تعریف کنید .

 

 

 

 

اگر 10 ساعت زمان برای بریدن یک درخت داشته باشم ، 9 ساعت آن را صرف تیز کردن اره خواهم کرد ، ناشناس

مستندسازی

بعد از یک مدت طولانی به سراغ کدی میروید که قبلا آنرا نوشته اید ، هر چقدر کد را بالا و پایین میکنید قسمتی که میخواهید تغییر دهید را پیدا نمیکنید ! این اتفاق برای خیلی از برنامه نویس ها پیش می آید ، اما مشکل کجاست ؟

سعی کنید با مستند سازی کدهای خود ، هم خوانایی آن ها را بالا ببرید و هم پیدا کردن کدهای مورد نظر را راحت تر کنید ، شاید در ابتدای شروع یک پروژه به این فکر کنید که من برنامه را نوشتم و از آن سردر میاورم و احتیاجی به مستندسازی نیست ولی هر چقدر جلوتر میروید ، گوگلینگ شما بیشتر شده ، از کدهایی استفاده میکنید که بعضا فقط برای پیش بردن پروژه از آنها استفاده میکنید بدون اینکه آنها را بررسی کرده باشید و در آینده مشکلات بسیاری برای شما به وجود می آورد . مقالات زیر میتواند کمک بیشتری به شما برای مستندسازی کدهایتان کنند :

10 Minutes to document your code

C# Documenting and Commenting

Documenting VB.NET source code with XML Comments

یادتان باشد مستندسازی زمان زیادی از شما نمیگرد ، اما زمان های آینده شما را خریداری میکند !

مشتری شما یک برنامه نویس نیست !

میدونم که شما برنامه نویس هستید نه یک طراح ! اما حتی خیلی از برنامه نویسان خارجی هم طراحی برنامه و صفحات وب خود را به تنهایی انجام میدهند ، مشتری تنها ظاهر را مشاهده میکند و خبر ندارد پشت این طراحی چه کدهایی نوشته شده و چقدر زمان صرف شده ، اگر طراحی شما ضعیف باشد تمام زحمات شما را خراب خواهد کرد . به نظر شما کاربر با دیدن چنین فرمی چه عکس العملی نشون میده :

3.png

سعی کنید اندازه کنترل ها رو بر اساس نیاز آنها طراحی کنید ، اگر قراره در یک کادر یک عدد 4 رقمی نوشته بشه یک Textbox  با طول 100 کاراکتر قرار ندهید ! یا اگر فرم شما کنترهای بسیاری را شامل میشود سعی کنید آن را در 2 صفحه و با ظاهر بهتری پیاده سازی کنید .

یادتان باشد ظاهر از کدی که مینویسید مهتر است !

Don’t design like a programmer

اعتبارسنجی کنید

یکی از مواردی که بیشتر برنامه نویسان رعایت نمیکنند اعتبار سنجی کنترلهای درون فرم هاست ، کاربر بجای وارد کردن عدد یک متن را وارد میکند ، دکمه تایید را کلیک میکند و .....

فکر کنم خودتان میدانید چه اتفاقی می افتد ، با خطایی مواجه میشود که حس بدبینی او را نسبت به برنامه بر می انگیزد !

4.gif

در صفحات یا فرم هایی که نیاز است داده ها اعتبار سنجی بشوند حتما از کنترل های اعتبار سنجی استفاده کنید تا جلوی خطاها گرفته شود و کاربر نسبت به برنامه شما بدبین نشود .

همچنین سعی کنید به جای نمایش صفحات عجیب و غریب خطا که به کاربر نمایش داده میشود صفحات و یا فرم هایی را طراحی کنید که کاربر به آن منتقل شود و با یک پیغام مناسب روبرو شود تا اطلاعاتی در مورد خطایی که فقط خود شما میفهمید !

5.jpg
در لینک های زیر میتوانید انواعی از صفحات جالب طراحی شده برای این منظور را مشاهده کنید :

404 Error Pages, One More Time

49 Nice And Creative Error Pages

همچنین سعی کنید از بلاک های Try  ، Catch  ،  Finally  در کدهای خود استفاده کنید تا بتوانید در هنگام رخ دادن خطا عکس العمل مناسبی انجام دهید و پیام درستی به کاربر نشان دهید .

try-catch-finally

try-catch

از استانداردها استفاده کنید

 

آیا با معماری چند لایه آشنا هستید ؟

 آیا چیزی در مورد Design Pattern  ها شنیده اید ؟

آیا میدانید به جای نوشتن Store Procedure  ها طولانی میتوانید از LINQ  استفاده کنید ؟

و ..........

سعی کنید همیشه در کدنویسی های خود از استانداردها پیروی کنید تا کدهایی تمیزتر ، خواناتر و استانداردتر داشته باشید ، اگر در محیط وب برنامه نویسی میکنید همیشه سعی کنید پس از انتشار سایت آنرا از لحاظ استاندارد بودن تست کنید ، سایت W3C ابزارهای بسیار مناسبی برای تست کردن سایت شما از هر لحاظ دارد . همچنین سعی کنید تکنیک هایی را برای بالابردن کارایی و سرعت اجرا شدن کدهایتان یاد بگیرید .

توانایی های خود را محک بزنید

حتما تصور میکنید برنامه نویس بسیار مسلط و حرفه ای هستید ؟ یا فکر میکنید تو شهر خود جزو 10 نفر اول هستید و یا حتی از همه بهترید ؟

خوب این خیلی خوبه که اعتماد به نفس به این بالایی دارید ، در اولین فرصت کمی از کدنویسی کردن خود را خارج کنید ، کمی ریلکس شوید ، فکر خود را از هرگونه کدهای زاءد رها کنید ، خوب حالا زمان آن رسیده که به فکر گرفتن یک مدرک تخصصی و یا بین المللی باشید ، به یکی از موسسات برگزار کننده آزمون بروید و سطح مهارت خود را بسنجید ، با آزمون هایی که میدهید میتوانید از سطح مهارت خود مطلع شوید و ببینید در کجاها ضعف دارید . همچنین سایت های بسیار زیادی هستند که گنجینه ای از سوالات هستند که میتوانید از آنها استفاده کنید برای محک زدن خود .

سعی کنید با افراد متخصص بیشتر در ارتباط باشید و یا در محیطی کار کنید که افراد متخصصی در آن مشغول به کار هستند ، اینکار به شما کمک میکند سطح توانایی های خود را بالا ببرید و از تجربیات انها برای پیشرفت خود استفاده کنید . طبق آمارهای جهانی هر شخص هر 3 یا 4 سال محل کار خود را تغییر میدهد که این رقم در حال کاهشه ! سعی کنید در یک شرکت سال ها وقت خود را هدر ندهید و تبدیل به فسیل سازمانی نشوید ! یک برنامه نویس باید همیشه خود را به روز نگه دارد ، اگر شرکت شما مایل به ارتقا نیست و از همان روش های سنتی استفاده میکند بهتره به فکر شرکت جدید برای خود باشید !

 البته همه نکاتی خدمت شما عرض کردم جزئی از تجربیات من در طول این چند سال برنامه نویسی بود ، نکات بسیار بیشتری هست که در حال حاضر به خاطر نمی آوردم ولی در آینده ممکنه پست های دیگری در این باره به خصوص در مورد برنامه نویسی در شیرپوینت خدمت شما ارائه کنم .

در آخر میخواهم جمله ای خدمت شما عرض کنم که 2 سال پیش در کتابی خوندم و واقعا تو پیشرفت به من کمک بسیار زیادی کرد :

اگر کاری هست که سخت تلاش میکنید تا به آن برسید ولی موفق نمیشوید بدین معنی است که هنوز نکته ای هست نمیدانی !

تحلیل این جمله رو هم میزارم به عهده خودتون ،امیدوارم که مورد استفاده قرار گرفته باشد.

موفق و پیروز باشید.


پست هاي بيشتر صفحه بعدي »