# برنامه نویسی با محصولات مایکروسافت > Sharepoint > برنامه نویسی شیرپوینت (Sharepoint Development) >  تاریخ شمسی در شیرپوینت 2013 با استفاده JQuery

## حسین نیک پور

با سلام 
میخواهم  آمزش استفاده از Jquery  برای فارسی  کردن تاریخ شیرپوینت را توضیح بدم

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


<script type="text/javascript" src="../_layouts/15/folderName/jquery-1.10.2.js"></script>
<script type="text/javascript" src="../_layouts/15/folderName/FileName.js"></script>

folderName و FileName را با نام های مناسب جای گزین کنید.

خب کد را به چند دسته تقسیم می کنیم
1. تاریخ شمسی در View ها
2. تاریخ شمسی در فرم Display
3. تاریخ شمسی در فرم new
4.تاریخ شمسی در فرم Edit
5.تاریخ شمسی در فرم های Infopath
6. .......


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

----------


## حسین نیک پور

در اولین مرحله باید در مستر پیج فایل js خود را صدا بزنیم

<script>         $(document).ready(function () {
             changeDate();
         });
</script>

در فایل js نیز کد های زیر را وارد کنید تا در view ها تاریخ شمسی شود

function changeDate() {

   
    $('.ms-noWrap').each(function () {
        if ($(this).text().match('\\d{1,2}\\/\\d{1,2}\\/\\d{4}')) {
            $(this).text(convert($(this).text()));
        }
    });
function convert(txt) {
        ENtxt = txt.match('\\d{1,2}\\/\\d{1,2}\\/\\d{4}')[0];


        splitter = ENtxt.split('/');
        Year = new Number(splitter[2]);
        Month = new Number(splitter[0]);
        Day = new Number(splitter[1]);
        shamsiDate = SHDate(Year, Month, Day);
        return txt.replace(ENtxt, shamsiDate)
    }

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

 function plus(year) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) ? 1 : 0; }    function SHyear(year, month, day) { if (month <= 3 && day < 21 - plus(year)) return year - 622; else return year - 621; }
    function SHmonth(year, month, day) {
        condition = new Array(21, 20, 21, 21, 22, 22, 23, 23, 23, 23, 22, 22);
        month_first = new Array(10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9);
        month_second = new Array(11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        if (day < condition[month - 1] - plus(year))
            return month_first[month - 1];
        else return month_second[month - 1];
    }
    function SHday(year, month, day) { condition = new Array(21, 20, 21, 21, 22, 22, 23, 23, 23, 23, 22, 22); plus_first = new Array(10, 11, 9, 11, 10, 10, 9, 9, 9, 8, 9, 9); plus_second = new Array(20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21); if (day < condition[month - 1] - plus(year)) return day + plus_first[month - 1] + plus(year); else return day - plus_second[month - 1] + plus(year); }
    function SHDate(year, month, day) { return SHyear(year, month, day) + "/" + SHmonth(year, month, day) + "/" + SHday(year, month, day); }

----------


## حسین نیک پور

در ایم مرحله در ِdisplay فرم ها تاریخ را به شمسی تبدیل می کنیم

  $('[id *= SPFieldDateTime]').each(function () {
        if ($(this).text().match('\\d{1,2}\\/\\d{1,2}\\/\\d{4}')) {
            $(this).text(convert($(this).text()));
        }
    });

کد زیر نیز برای تغییر Created , modify Date  می باشد

 $("span[id*='toolBarTbl']").each(function () {
        if ($(this).text().match('\\d{1,2}\\/\\d{1,2}\\/\\d{4}')) {
            $(this).text(convert($(this).text()));
        }
    });

----------


## حسین نیک پور

برای حالت new و edit هم می توانید از این کد استفاده کنید

   //for hide old picker 
   $('.ms-dtinput a[onclick^="clickDatePicker"]').hide()
    //for add new picker
    $('.ms-dtinput input[type=text]').each(function () {
        $(this).addClass('hndp');
        $(this).val(convert($(this).val()));
        $(this).datepicker({
            changeMonth: true,
            changeYear: true,
            isRTL: true,
            dateFormat: "yy/mm/dd"
        });
    });




برای Date Picker  من از bootstrap فارسی استفاده کردم شما می توانید آن را جایگزین کنید

----------


## حسین نیک پور

در اخرین مرحله شما باید قبل از save شدن فرم تاریخ را به میلادی برگردانده و ذخیره کنید


$('input[type=button]').filter('input[id$="SaveItem"]').each(function () {
        $(this).removeAttr('onclick');
        var btn = $(this).attr('name');
        $(this).on('click', function () {


            changePersianDates();


            if (!PreSaveItem()) {
                console.log('ev : ' + PreSaveItem());
                return false;
            }


            WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(btn, "", true, "", "", false, true));
            
        });


    });

  function changePersianDates() {


        $('.hndp').each(function () {


            if ($(this).val()) {
                splitter = $(this).val().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;


                    fName = $(this).attr('id').split('_')[0];
                    $('input[id $="' + fName + '"]').val(miladiDate);
                }


            }
        });
    }

----------


## gprsm0

سلام دمت گرم
منتها یک سوال توی سیستم های integrate شده با crm یا exchange مسئله calendar خیلی مهمه بویژه بر سر appointment هایی که هر کاربر برا خودش میگذاره
می خواستم بپرسم آیا با این روش هم میشه این قضیه رو یک جورایی حلش کرد؟
ولی واقعا دمت گرم
خیلی نیازم بود

----------


## mona11

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

----------


## حسین نیک پور

بله حق با شماست

شما راه حلی براش دارین؟

----------


## حسین نیک پور

> سلام دمت گرم
> منتها یک سوال توی سیستم های integrate شده با crm یا exchange مسئله calendar خیلی مهمه بویژه بر سر appointment هایی که هر کاربر برا خودش میگذاره
> می خواستم بپرسم آیا با این روش هم میشه این قضیه رو یک جورایی حلش کرد؟
> ولی واقعا دمت گرم
> خیلی نیازم بود


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

من خودم انجام ندادم ولی calendar شیر پوینت رو می شه فارسی کرد منتها تمام جاهایی رو هم که داره از اون استفاده میکنه باید تغییر داد

----------


## maleki74

جناب نیک پور با سلام و خسته نباشید
راستش من تازه کارم اما با سرچ تونستم مراحل بالا رو انجام بدم اما نه تقویم شمسی شد و نه DatePicker شمسی شد 
فایل jquery-1.10.2.js  رو از سایت مرجعش دانلود کردم و توی یه پوشه بنام shamsi توی درایو c روی سرور قراردادم
یه فایل js بنام مثلا shamsi.js  درست کردم و تمامی کدهای ذکر شما رو توی اون وارد کردم بجز دو خط :
<script type="text/javascript" src="../_layouts/15/shamsi/jquery-1.10.2.js"></script>
<script type="text/javascript" src="../_layouts/15/shamsi/shamsi.js"></script>

 که اونها رو توی مسترپیج سایتم که اسمش seattle.master  بود قبل از تگ body قرار دادم

بعدش توی iis روی سرور یه پوشه مجازی توی اون مسیری که فرمودید درست کردم و 
اشاره دادم به  پوشه shamsi که روی درایو c  سرور داشتم و  دو تا فایل js یعنی  shamsi.js وjquery-1.10.2.js توش بودن
ولی هیچ اتفاقی نیفتاد حتی از فرمان iisreset هم استفاده کردم 
لطفا اگه راهنمایی بفرمایید سپاسگزار خواهم بود،ضمنا شیرپوینت من 2013 هستش

----------


## حسین نیک پور

دوست عزیز احتمالا با روشی که شما توضیح دادید فایل های js در صفحه لود نشده اند!

پیشنهاد میکنم 
1.فایل های جاوای اسکریپت رو در داخل پوشه ای در فولدر Layout کپی کنید و از انجا ادرس دهید.
2. روش لود کردن اسکریپت ها را در شیرپوینت 2013 متفاوت است.

----------

