23 September 2010

SharePoint Time Zone

לפני כשבוע ישראל עברה לשעון חורף. שלא כמו שאר העולם, החוק בישראל להזזת השעון בנויי גם מהלוח שנה העברי וגם מהלוח שנה הגרגוריאני -האזרחי. פירסמתי בפוסט בתחילת השנה את לוח השנה ובו הימים המדוקים להחלפת השעון לשנה זו.

שעון קיץ (ישנים שעה פחות) עוברים בין חמישי לשישי ב2 לפנות בוקר אחרי ה1.04. זה בעצם היום השישי הראשון שמגיע אחרי הראשון באפריל. אבל גם בזה יש חריגים, אם פסח יוצא באותו זמן- כמו שקרה ב2009, אז מקדימים את העברת השעון שבוע קודם (ליום השישי בשבוע האחרון בחודש מרץ).

שעון חורף (ישנים עוד שעה) עוברים בין מוצאי שבת לראשון גם ב2 לפנות בוקר. אבל הפעם זה קורה במוצאי השבת שבין ראש השנה ליום כיפור.

הבעיה מתחילה ש- SharePoint לא מכיר טוב את הלוח שנה העברי. כדי לפתור בעיה זאת צריך לגשת ל
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG
לחפש את הקובץ TIMEZONE.XML, לחפש את הזמן המקומי (הID של זמן ישראל-ירושלים הוא 27). לא לשכוח לגבות את הקוסץ לפני כל שינויי- ליתר ביטחון.

הקובץ XML פשוט להבנה כפי שמבטיחה מיקרוסופט.
בישראל אנו 120 דקות מינוס מקו גרינג'.
לכן אנחנו מגרים bias-120
month זה חודש שמתחלף השעון.
Hour זו השעה.
DayOfTheWeek - זה היום בו יתבצע בחלפת השעה.
והטריק הגדול של MOSS הוא השדה Day.
Day הוא השבוע של החודש בו מתבצע החילוף. כן, כן... תרגום של Day הוא שבוע.



הנה דוגמה לשנה זו (חורף 2010 וקיץ 2011):
 <Bias>-120</Bias>

<StandardTime>

<Bias>0</Bias>

<Date>

<Month>9</Month>

<Day>2</Day>

<Hour>2</Hour>

</Date>

</StandardTime>

<DaylightTime>

<Bias>-60</Bias>

<Date>

<Month>4</Month>

<Day>1</Day>

<Hour>2</Hour>

<DayOfWeek>6</DayOfWeek>

</Date>

</DaylightTime>

</TimeZone>

יש גם שדה היסטוריה History ששומר את ההגדרות של השנים הקודמות.

שתהיה שנה טובה,
רועי

09 September 2010

Add Css to a SharePoint WebPart

איך מוספים CSS לWebPart?
יש הרבה דרכים, אבל אני אדגים רק שתי דרכים נפוצות.
הראשונה הוספת הCSS בPreRender. יתרון משמעותי, בCSS נטען אחרון. זאת אומרת שאין קבצי core.css שעולים על הstyle'ים שלי (כי כמו שאתם יודעים בCSS האחרון הוא החזק והקובע).

       #region
-- Cntr --
///<summary>
   /// Cntr for MyWebPart
///</summary>

public MyWebPart()

{

this.PreRender += new EventHandler(WebPart_ClientCss_PreRender);

}

#endregion

///<summary>

/// Add css files to the page
/// </summary>
///<param name="sender"></param>

///<param name="e"></param>

private void WebPart_ClientCss_PreRender(object sender, System.EventArgs e)

{
const string cCSSControlID = "MyStyle";

// the resource path need absolute

if (Page.Header.FindControl(cCSSControlID) != null)

return;

String location = this.ClassResourcePath + "/styles.css";
// literal control css
LiteralControl literalControl = new LiteralControl(String.Format("<link
href='{0}' rel='stylesheet' type='text/css' />"
, location));


literalControl.ID = cCSSControlID;
Page.Header.Controls.Add(literalControl);
}

בעצם, מה שנעשה זה יצירת מתודה WebPart_ClientCss_PreRender שמתווסת לPreRender בזמן הContractor. בתוך המתודה מתבצע בדיקה שכבר לא קיים אותו CSS ואם לא קיים הוא יוסיף אותו.
הדרך השניה היא פשוטה יותר, קצרה יותר ומשתמשת בAPI של SharePoint – שזה יתרון חשוב. החיסרון שאנחנו לא שולטים מיקום הcss בheader (כדי לפתרון חסרון זה, כל מה שצריך לעשות זה להגדיר !important;).


protected
override void CreateChildControls()      
{

base.CreateChildControls();

// the resource path need relational

String location = this.ClassResourcePath.Replace(SPContext.Current.Site.Url,
string.Empty) + "/styles.css";

Microsoft.SharePoint.WebControls.CssRegistration.Register(location);
 
}
 
בדרך זו, אנו פונים למתודה שנקראת CssRegistration.Register ונותנים לה את הנתיב הרלציוני.
מקווה שלא סיבכתי יותר מדי את העינינים...
אה.. דרך אגב, אני מעדיף את הדרך השניה ...

רק דברים טובים,
רועי