Презентационни умения и водене на технически лекции

by Ради Атанасов 29. January 2011 19:19

През последните две години ми се случва много често да водя технически лекции или презентации пред аудитория. Дали ще е на срещи на потребителски групи, семинари, презентации пред студенти в университет, дори и Дни на Майкрософт или други конференции, евентуално сте ме срещали поне един път. Макар че тези презентации не са платена работа и са изцяло по мое желание, през последната година ми се случи да водя и официални обучения за клиенти и MS партньори, и то сравнително често. Това ме накара да потърся начини да подобря уменята си като лектор.

По принцип, колегите около мен, както и самият аз, сме технически хора. Създаваме решения, пишем код, инсталираме и конфигурираме софтуер. Това ни е работата и (поне за мен) ни е първи приоритет. Говоренето пред публика не е нещо, което често практикуваме, съответно е нормално да сте свидетели и на скучни лекции. Преди МНОГО години питах баща ми защо Стоичков не пее химна в началото на един мач, той каза "Работата му е да рита, а не да пее...".

Честно да си призная (вие сигурно го знаете това...), вобще не съм от най-добрите в презентационни умения, нямам кой знае какви способности да говоря пред хора. Притеснявам се, изчервявам се, обърквам се, понякога си губя мисълта или прескачам от една на друга. Факта, че влагам някакво желание и енергия евентуално компенсира някой от слабите ми точки, които не са малко, и да, може би се справям. Прочетох няколко книги по темата (1) (вижте в края на поста), както и ред други публикации, дори събрах съвети от MCT бандата сред учебните центрове (Стефан Георгиев от New Horizons ми обясни лично хватките... А останалите колеги ме критикуваха на MCT изпита :) ). Научих много неща, които може да се каже, че през последната година по един или друг начин са ми помогнали. (Знам, че две книги не са никак много, сега си търся и други...)

Исках да споделя някой заключения, които съм направил, относно воденето на презентации и обучения. Надявам се да са полезни за тези, които се интересуват от такива неща, особенно на колеги и приятели които планират да водят някаква презентация. Ще се фокусирам върху технически презентации, защото предимно с такива имам опит.

Преди да продължа по самите лекции, искам да обсъдя защо воденето на презентации е важно за самият лектор:

  • Опит в изнасяне на лекции. ОК това ясно, но нека да поясня. Не всеки е научен, и не всеки го прави добре от първия път. Във всичките книги (които съм прочел) по темата пише, че практиката води до перфектност. Във всекидневието, на всеки му се налага да се изкаже за нещо. Дали ще е пред шефа, пред екип, пред аудитория, или просто в семейството, комуникативноста не може да я избегнем. Воденето на презентации усъвършенства качествата, необходими при такива ситуации. Всички ние се опитваме да се развиваме, така че всеки има необходимост от опит. Потребителските групи са чудесни за тази цел.
  • Подреждане на мисъл, допълнителни проучвания и обобщаване на основните точки по темата. Всеки се подготвя (надявам се...). Това е процес, в който личният опит се систематизира и обобщава в презентация, а елементите от темата, които не са ясни или се проучват до край, или се отбелязват като такива. Аз лично подготвям материалите, така че да мога да имам всичко за дадена тема на едно място. Това ми дава възможност да преизползвам информацията във всекидневната ми работа, или обратното, да създавам слайдове от данни, събрани по време на проекти. Какъвто и да е случая, арсенала ми от знания, факти и добри практики се подобрява. Подготовката на презентация подпомага за натрупването на знания по темата.
  • Популярност. Света и работното място са доста конкурентни. Споделянето на знанияа пред аудитория показва амбиции и желание, които всеки работодател би трябвало да оцени (бягайте от него ако не ги оценява!). Няма начин да не ви забележат, ако застанете сам пред цялата аудитория, така че воденето на лекции със сигурност повишава популярноста ви. Отново потребителските групи са чудесни тука - идеален начин да се запознаете с хора с подобни интереси и да застанете пред тях да споделите опит. Вероятността, да си намерите работа от Networking е много по-голяма, отколкото да търсите в сайтовете с обяви за работа. На всичките места, където съм работил (официално по професията) са от директни контакти с колеги от потребителски групи. Съвсем сериозно.
  • Споделяне на успешни идеи и проекти - не винаги може да се споделят подробностите и детайлите по изработката на даден проект. Такива демонстрации са супер интересни, но са рядкост. Популярни са на семинари като MS Days и (отново) потребителските групи. Знаете, че официални case studies са пълни с маркетингови лукуми... (сори, ама е така!) Лекции, в които се разказва за изминали проекти са ми най-любими, но както казах те са доста рядки. Ползата на лектора е, че показва своите творения и експертиза.

Защо техническите презентации са важни за публиката?

  • Често са безплатни и може да научите нещо - само трябва да се появите. Пряката цел на семинари и презентации е да се споделят знания и опит, както и да се популяризират технологиите под въпрос. Виждал съм и някой работодатели и управители да поставят служителите си под въпрос ако не се интересуват от презентации по специалността им. Вярно е, че е извън работно време, но ако това е проблем, поискайте си да се появите по обедно време на следващия ден - аз не бих отказал такъв request. Мисълта ми тука е, че принципно трябва да имате полза от такива неща.
  • Поглед към нови неща. Не винаги имаме време да разглеждаме динамичната екосистема на нашата индустрия. IT е една от най-динамичните и променящи се индустрии. Това е особенно специфично за софтуерната разработка. Като че ли с всеки изминал ден има нещо ново, което засяга всекидневието ни. Техническите лекции за чудесен ресурс, който може да ни придържа към развитието на технологиите около нас. Те ни развиват и държат в крак с технологиите.
  • Популярност и networking - тези точки от по-горе важът и тука. Ще добавя и социализирането между членовете на групите - никога не ми идва в повече.
  • Награди - Макар и не толкова популярно тука в България, на няколко пъти съм печелил разни награди заради иницатива по време на срещи на потребителските групи в Австралия. Office 2007 Ultimate, разни мишки и фанелки. MS Days и други конференции са добри в такива неща, но в никакъв случай не бива да забравяме събитието в Катарино, което Майкрософт България подготви за нас!!! (е да, някой спомени са по-добре забравени, други ще си останат мътни...)
  • Търсене на помощ от колеги - Често се случва да си задаваме въпроси един на друг. Някой от тях са по време на лекциите, други са след лекцията. Аз никога не съм се стискал да давам съвети, нито пък да задавам въпроси (:

Сега по същество: Какви са "добрите практики" (2), при воденето на лекции?

  • Количество информация за предназначеното време - може би една от най-често срещаните "не толкова добри" практики в технологичните лекции е количеството материал за даденото време. Мисля, че няма презентация, на която да ми е стигало времето, и да, понякога мога да си говоря, говоря, говоря... Сега тайминга ми е един от първите приоритети. Ако лекцията е един час, тя трябва да се побере в толкова. Не искате да звънне звънеца за междучасие, а все още да не сте стигнали заключенията...
  • Точен и подробен абстракт - Макар и не толкова ясно на зрителите, подготвянето на добър абстракт не е никак лесно. Той трябва да бъде подготвен от рано и точно да обяснява какво ще съдържа лекцията, за кого е точно (особенно ако е ДЕВ), и на какво ниво е. Трудно е, защото обикновенно е необходим много преди презентацията, а самата презентация се подготвя седмици или дни преди изнасянето и. По време на подготовката съдържанието и посоките може да се променят, което може да накара абстракта (леко) да заблуди публиката. Аудиторията трябва да е подходяща за темата - тогава всички са по-доволни.
  • Много точно и ясно комуникиране на принципите и основните точки на темата. Може би ще кажете, че това е ясно, но гледах една лекция на Влади Чалков (www.crossroad.bg) (за IIS7), където неговото владеене на това "правило" ми направи много силно и добро впечатление. Беше изключително ясно какви правила и знания се опитваше да представи. Лекцията му се разбираше много добре, основните неща които комуникираше бяха много ясно показани и опростени, тонът беше спокоен, а скоростта на говорене не му беше прибързан (както моя). Запомних и някой примери от речника и словореда му. Повече за Чалков намерих тука: http://review.sagabg.net/vladimir-chalkov-upravitel-na-firma-crossroad.html
  • Агенда (съдържание, програма, план). Не мисля, че "агенда" е дума от речника ни, може и да е неологизъм, но я използвам в мойте презентации. Когато основния план на лекцията се пресдстави в началото, всеки има представа как ще се развият нещата и какво да очакват. Добра практика е лектора да подсеща зрителите до къде е спрямо този план. Така се постига добра последователност на лекцията, и аудиторията не се дискоординира (и такава дума май няма).
  • Заключение и обобщение - Чувал съм на много пъти, че е важно да обобщите основните точки на края на лекцията, така че те да бъдат нещата, които се запомнят. Сложете на един слайд нещата, които искате публиката да вземе със себе си.
  • Дискусии и въпроси към публиката - Винаги е хубаво да се постигне интерактивност между лектора и публиката. Ако планирате въпроси, може да ги сложите на слайдовете. Целта е да осъществите контакт с аудиторията. Аз лично се опитвам да правя това дори преди да започне презентацията. Поздравявам хората като влизат, и ако може, обменям приказки преди да се започне.
  • Диаграми, Screenshots, илюстрации - Понякога е скучно да се гледат булети на слайдове. На всеки му омръзва от много текст. Пробвайте да разнообразите лекцията с таблици, диаграми, поговорки, цитати, графики, картинки, звук, анимации, рисунки, снимки и т.н.
  • Свикнете с ZoomIT, или Windows 7 Zoom. Windows +/- ще направи zoom. Добре е да се възползвате от такива чудеса за да е лесно за публиката. Аз лично не съм кой знае колко сръчен с Windows 7 екстрите, но все забравям да сложа ZoomIT.
  • Хумор - Според мен всеки може да намери нещо хумористично, което да може да вмъкне. Освен че ще държите публиката будна, контактът с тях ще се подобри, което го прави по-лесно за самият вас.

Нека да погледнем неща, които е добре да се избягват (лошите практики):

  • Не обръщайте гръб към публиката, както и не говорете докато гледате назад към слайдовете. Особено от значение е това правило, когато рисувате нещо на дъската. Ако се налага кажете, че ще надраскате нещо за минутка.
  • Пробвайте всичко! Code Snippets, демонстрации, виртуални машини, интернет връзка, кликери, флашки. Хубаво е да пробвате и демонстрациите си в резолюцията на прожектора.
  • Не слагайте страшно много текст по слайдовете. На никой не му се чете, хората са там за да ви слушат. Много текст е тежко. Използвайте кратки булети, по възможност само с ключови думи.
  • Избягвайте да говорите бързо и неспокойно. Това е може би моят най-голям проблем. Като че ли бързам за някъде когато говоря и понякога не си довършвам изреченията и мисълта. Добрите лектори говорят спокойно и с разбираемо темпо. На мене ми е трудно, защото изреченията си ги обмислям на английски и си ги превеждам докато ги изказвам. Не знам дали може да си го представите, но мисленето ми е на английски. Често, изреченията ми са на английски, но просто заменени с български думи. Това води до липса на правилен и ясен словоред - неща, които са изключително важни за лектори. :(

Сега искам да обсъдя различни "видове" лекции. Не знам дали "видове" е точната дума, може би "стилове", "формати" или "модели" на презентации. Исках да ги включа в този пост за да ви накарам да се замислите за "формата" на вашите презентации:

  • Бързи слайдове, с много малко съдържание, понякога само с една дума или снимка. Примери за такива са TEDxBG - Steve Keil - A Play Manifestoи Пари, енергия и растеж като нает, наемащ или самонает на Васил Василев от Штрак!. Тези презентации са много добри и обикновенно постигат добър ефект, но са и сравнително трудни и не всеки ги може.
  • Типичният формат на технически презентации по Майкрософт събития. Те обикновенно са в следния ред: инфо за лектора, агенда, слайдове, евентуално демо, и заключения. Това са най-срещаните.
  • Само демонстрации. Има и такива, никакви слайдове и просто демота. Често срещани са в нашата професия.

 

Относно Дни на Майкрософт....

При такива събития е много важно самият абстракт, нивото и заглавието на лекцията, защото публиката ви избира по тези параметри. Като лектор, това ви е единствената връзка с аудиторията, преди тя да влезе в залата. Тази година на MS Days ще водя три лекции, две по SharePoint и една по Web Platform (3), и ще се опитам да приложа всички точки по-горе. До тогава нямам планове да водя лекция ( с цел да не омръзна...)

Ето и списък с презентациите, които съм водил през последната година (поне тези, които си спомням):

22nd January 2010

SharePoint Development Days -

http://sharepoint.bg/post/Free-SharePoint-Training.aspx

25th February 2010

Workflow for Everyone - No-code solutions with SharePoint 2007

http://sharepoint.bg/post/SUGBG-Workflow-for-Everyone-No-code-solutions-with-Sharepoint-2007-Part-2.aspx

 

9th-11th March 2010

SharePoint Ignite for Developers

http://www.sharepoint.bg/post/SharePoint-2010-Ignite-Training-for-Developers.aspx

 

30th-31st March 2010

Microsoft Days 2010 Bulgaria - Architecture and Development of Business Applications with SharePoint 2010, Silverlight and Open XML

http://sharepoint.bg/post/SharePoint-sessions-at-Microsoft-Days-2010.aspx

16th September 2010

Microsoft Community Day  - Business Productivity with Office and SharePoint 2010

http://www.sharepoint.bg/post/Microsoft-Community-Day.aspx

16th September 2010

Microsoft Community Day - WebMatrix and ASP.NET Razor

http://www.sharepoint.bg/post/Microsoft-Community-Day.aspx

30th November 2010

SharePoint семинар в New Horizons - SharePoint 2010 Development Overview

http://www.sharepoint.bg/post/SharePoint-2010-seminars-at-New-Horizons.aspx

http://newhorizons.bg/blog/?p=7427

9th December 2010

SharePoint семинар в New Horizons - SharePoint 2010 ITPRO Overview

http://www.sharepoint.bg/post/SharePoint-2010-seminars-at-New-Horizons.aspx

http://newhorizons.bg/blog/?p=7427

25th - 26th September 2010

Web Platform User Group, представяне на групата на Катарино

20th December 2010

SQL & BI User Group Bulgaria - SharePoint 2010 from the SQL Server perspective with Margarita Naumova

13th January 2011

Web Platform User Group launch - Building web sites with modern technologies http://www.facebook.com/home.php?sk=group_137641342957047

27th January 2011

SUGBG - MCM - My Story

SUGBG - Information Architecture in SharePoint 2010

http://sharepoint.bg/post/SUGBG-MCM-SharePoint-Information-Architecture.aspx

Последното нещо, което исках да обсъдя е обратната връзка. Тя винаги е от голямо значение за мен и винаги я чета. Често публикувам резултатите ако те са на базата на някакви точки. Ако водите лекция, подгответе или хартиени форми или някакъв друг начин, по който публиката да се свърже с вас. Хората често дават добри коментари. Не игнорирайте лошите коментари - те обикновенно са с цел да се подобри нещо.

(1) (1) - Confessions of a Public Speaker, Scott Berkun - http://oreilly.com/catalog/9780596802004 (гледайте и видеото...)
(1) - Bulletproof Presentations, G. Michael Campbell - http://books.google.com.au/books?id=bHEGdMdicG0C&printsec=frontcover&dq=Bulletproof+Presentations,+G.+Michael+Campbell&source=bl&ots=9Pw7Ftbrmg&sig=UnRj8XI9m2LaHWU-YYqLOn2tpDA&hl=en&ei=dMA6Te2cKIySswaIqMHzBg&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBUQ6AEwAA
(2) Мненията тука са изцяло мой и не сте длъжни да сте съгласни с тях. Събрал съм ги от четене, гледане, приказване и от обратна връзка от аудиторията.
(3) Ще напиша друг пост с повече инфо и ще сложа линк тука.

Tags: , ,

Bulgarian

I am a Microsoft Certified Master: SharePoint 2010

by Ради Атанасов 17. January 2011 13:47

I have a big announcement to make. Since December 2010 I am officially a Microsoft Certified Master in SharePoint 2010. It took me more than a month of full-time pre-study, 3 weeks spent in Microsoft's Main Campus in Redmond doing training, 45 days post-rotation study, many hours of hard work, very little sleep, a few white hairs, plenty of SharePoint nightmares, countless coffees and a hell of a lot of energy and enthusiasm. I prepared myself for the challenge, I gave it my absolute best, got A LOT out of it and made it to the end.

image

There's lots to tell about the experience and the specifics of what a Master is, how one could help, and what responsibilities a Master has. I'll be speaking in the near future about it at the local SharePoint User Group (in Sofia, Bulgaria), but I'll also be sharing some experiences here in my blog.

A few links:

http://blogs.technet.com/b/themasterblog/

http://blogs.msdn.com/b/maximeb/archive/2009/07/02/bringing-sharepoint-certified-master-mcm-to-canada.aspx

http://www.sharepointchick.com/archive/2009/04/08/the-microsoft-certified-master-experience.aspx

http://www.harbar.net/archive/2010/07/08/thoughts-on-the-microsoft-certified-master-for-sharepoint-2010.aspx

See you out there on the field!

Tags: , ,

Bulgarian | English

Слайдове и код от SharePoint ITPRO семинара в New Horizons

by Ради Атанасов 12. December 2010 16:47

Много съм доволен, че се събрахме толкова много хроа за ITPRO сесията, залата беше добре препълнена и онлайн имаше 15-20 човека.

Ето и презентацията, както и разни скриптове, които обсъждах в материла:  SharePointITPRO.zip

В скоро време ще разгледам и възможностите да кача записите. Трябва да намеря начин да превърна LiveMeeting формат в AVI или WMV.

До скоро!

Tags: , ,

Bulgarian

Слайдове и код от SharePoint Dev семинара в New Horizons

by Ради Атанасов 6. December 2010 13:21

Благодаря на всички, които успяха да дойдат на семинара на 30ти. Залата беше пълна, но не успях да видя колко хора има онлайн.

Бях обещал да кача материалите от семинара, ето линкове към слайдовете и кода.

Обратната връзка е с висок резултат (мерси!) и получих интересни съвети и прелдложения, който ви обещавам, че ще взема в предвид за следващия семинар, както и в бъдеще.

Tags: , ,

Bulgarian

Microsoft Days 2010 – код и PowerPoint Slides

by Ради Атанасов 17. April 2010 16:58

За мен това беше първият MS Days на който съм присъствал - бях супер доволен. Добра атмосфера, много партньори, добри лекции… дори имаше и бира ?!?!?

Лекцията, която изнесох беше най-техническата на тема SharePoint – искаше ми се да има повече SharePoint (:

Ето и кода, който обещах: PerformanceManagement.zip

Това, за което може да ви е полезен е:

  1. Добавяне на бутон в Ribbon на SharePoint 2010
  2. Link към custom javascript file за този бутон
  3. отваряне на диалогов прозорец с т.н. Dialog Framework
  4. SP2010 webpart, който генерира Office документи с Open XML и Word Automation Services – супер интересно (:
  5. Има и един web service в SP 2010

Ето и презентацията: MS Days Radi Atanassov

Аз лично бях доволен от лекцията, въпреки че забравих да покажа генерираните PDF и XPS files…

Ето го и рейтинга ми:

Ради Атанасов

Архитектура и изграждане на бизнес приложения с SharePoint 2010, Silverlight и Open XML SDK (Ниво: 300)

79

Oбща оценка на презентацията

7.85 / 9

Ради Атанасов

Архитектура и изграждане на бизнес приложения с SharePoint 2010, Silverlight и Open XML SDK (Ниво: 300)

79

Компетентност на лектора

8.08 / 9

Ради Атанасов

Архитектура и изграждане на бизнес приложения с SharePoint 2010, Silverlight и Open XML SDK (Ниво: 300)

79

Предоставената информация е полезна за моята работа

7.46 / 9

Ради Атанасов

Архитектура и изграждане на бизнес приложения с SharePoint 2010, Silverlight и Open XML SDK (Ниво: 300)

79

Презентационни умения на лектора

7.54 / 9

Поздрави!

Tags: , , , , ,

Bulgarian

Използване на LINQ to XML върху резултатите от SharePoint Web Services

by Ради Атанасов 18. March 2010 12:02

Когато работиме със Silverlight имаме възможност да използваме LINQ to XML за извличане на данни от резултатите от SharePoint Web Services. Тези дни разгледах LINQ to XML и никога повече не бих работил с XmlDocument обектите (:

Ето няколко примера:

GetListItems() – това е метод от Lists.asmx, и ето му отговора:

<listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"
xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<rs:data ItemCount="13">
   <z:row ... ows_ContentType="Task" ows_Title="New Task 1" ... />
   ... more rows here
</rs:data>
</listitems>

За да извлечем заглавията на list items и да ги подредим в List<string> обект:

private List<string> ProcessListResults(SPListsWS.GetListItemsCompletedEventArgs e)
{
    string result = e.Result.ToString();
 
    XNamespace ns = "#RowsetSchema";
    XElement results = new XElement(e.Result);
 
    var listItems = from x in results.Descendants(ns + "row")
                    where x.Attribute("ows_Title") != null
                    select x;
 
    List<string> itemsList = new List<string>();
 
    foreach (var item in listItems)
    {
        string title = item.Attribute("ows_Title").Value;
        itemsList.Add(title);
    }
    return itemsList;
}

GetUserInfo() – Този метод е от usergroup.asmx и ни дава информация за user в текущия SPSite обект (взима го от скрития user list). Ето отговора:

<GetUserInfo xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/">
  <User ID="7" Sid="S-1-5-21-347908140-582334945-263120918-1111" Name="Radi"
    LoginName="DEV\radi" Email="" Notes="" IsSiteAdmin="False"
    IsDomainGroup="False" />
</GetUserInfo>

 

И как извлиам LoginName:

public static string GetLoginFromServiceResponse(XElement result)
{
    XNamespace ns = "http://schemas.microsoft.com/sharepoint/soap/directory/";
 
    XName xUser = XName.Get("User", ns.NamespaceName);
    XName xUserInfo = XName.Get("GetUserInfo", ns.NamespaceName);
 
    XElement user = result.Element(xUser);
 
    if (user != null) {  return user.Attribute("LoginName").Value; }
 
    return null;
}

Това което подавам на метода е “e.Result.ToString()” от отговора.

Очаквайте още!

Tags: , , , ,

Bulgarian

SharePoint meets LINQ to XML: CAML заявки за работа с Lists.asmx

by Ради Атанасов 18. March 2010 10:28

Напоследък ми се налага да работя с LINQ to XML за интеграционни сценарии включващи Silverlight и SharePoint. LINQ to XML е страхотно – сравнително по-добре от създаване на XML чрез обекти като XmlDocument.

Ето пример – повиквам GetListItems() метода на Lists.asmx. Със следният код извличам list items от Task списъка създадени от специфичен user. Този пример би трябвало да работи както за WSS v3, така и за MSF v4.

XElement query = new XElement("Query",
        new XElement("Where",
            new XElement("Eq",
                new XElement("FieldRef", new XAttribute("Name", "Author"), new XAttribute("LookupId", "True")),
                new XElement("Value", new XAttribute("Type", "User"), userID)
)));


XElement queryOptions = new XElement("QueryOptions");
XElement viewFields = new XElement("ViewFields");

_listService.GetListItemsAsync("Tasks", null,
    query, viewFields, "100", queryOptions, null, null);

userID e SharePoint ID-то на потребителя, за който искам да видя резултатите. Можете да получите тази информация от usergroup.asmx.

Успех!

Tags: , , , ,

Bulgarian

Автоматично показване на DIP когато се отваря Word документ

by Ради Атанасов 21. February 2010 07:45

Работя по един проект, в който имам дефинирани Content Types в Feature. Тези Content Types имат различни document templates, и ми се наложи да конфигурирам Document Information Panel (DIP) да се отваря автоматично. Това става лесно чрез интерфейса, но трябваше да е част от автоматизиран деплоймент.

В следващия код показвам как става това. Подаваме SPContentType обект, на който му се дефинира нов CustomXsn елемент в своята XmlDocuments колекция. Ако под-елемента openByDefault е “True”, DIP ще се покаже при отварянето на документа. Използвам FeatureReceiver за прекарам мойте Content Types през този статичен метод:

public static void ConfigureContentTypes(SPContentType ct)
{
    XmlDocument doc = GetCustomXsnDocument();
 
    ct.XmlDocuments.Add(doc);
    ct.Update(true);
}
 
private static XmlDocument GetCustomXsnDocument()
{
    XmlDocument doc = new XmlDocument();
    
    string xml = "<customXsn xmlns=\"http://schemas.microsoft.com/office/2006/metadata/customXsn\"><xsnLocation></xsnLocation><cached>True</cached><openByDefault>True</openByDefault><xsnScope></xsnScope></customXsn>";
 
    doc.LoadXml(xml);
    return doc;
}

Можете да намерите повече информация за CustomXsn елемента на този MSDN линк: Content Type Document Information Panel Schema

Дано това помогне на някой.

Tags: , , ,

Bulgarian

Формите на списъци в SharePoint 2007 - как работят те – Втора Част

by Ради Атанасов 20. February 2010 13:55

Този пост е продължение на предишния, в който разглеждам как можем да заменим “NewFormUrl”, “EditFormUrl” и “DisplayFormUrl” притежанията на Content Type обекти, с цел да се заменят формите, с които SharePoint показва данни за определен list item. Тука ще опиша как SharePoint използва Rendering Templates по време на зареждането на тези форми, и как можем да ги заменим с произволни, така че да добавиме функционалност.

Ето как работят Rendering Templates:

Всеки list item в SharePoint списък е под формата на определен Content Type. В повечето случай това е или “Item”, или “Document” Content Type, в зависимост от списъка, в който този list item се намира. Като разработчици, ние създаваме нови Content Types, които имат смисъл за съответния бизнес: Invoice, Quote, Proposal и т.н.

Всеки Content Type има свой “New”, “Edit” и “Display” форми за събиране и показване на своите данни. Всяка една от тези форми е дефинирана чрез “Form Rendering Template”, който съдържа HTML markup, или ASCX контролки.

Тези Rendering Templates са дефинирани в ASCX файлове в _CONTROLTEMPLATES папката (...12\TEMPLATE\CONTROLTEMPLATES). На повечето обекти в SharePoint са им дефинирани Rendering Templates в DefaultTemplates.ascx, там ще намерите HTML на много обекти като Toolbar, ListFieldIterator и т.н. Ето как е дефиниран DocumentLibraryForm:

<SharePoint:RenderingTemplate ID="DocumentLibraryForm" runat="server">
    <Template>
        <SharePoint:InformationBar runat="server"/>
        <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" 
        RightButtonSeparator="" runat="server">
            <Template_RightButtons>
                <SharePoint:SaveButton runat="server"/>
                <SharePoint:GoBackButton runat="server"/>
            </Template_RightButtons>
        </wssuc:ToolBar>
        <SharePoint:FormToolBar runat="server"/>
        <SharePoint:FormComponent TemplateName="DocumentLibraryFormCore" 
        runat="server"/>
    </Template>
</SharePoint:RenderingTemplate>

Забележете, че този Rendering Template вика други “FormCompontent” обекти чрез “TemplateName” атрибута. Това е много сходно с PHP…

Нашата цел, е да заменим тези Rendering Templates, за да променим това, което крайните потребители виждат като работят с нашите Content Types.

Имаме 2 варианта:

Вариант 1: посочване на наши Rendering Templates в самата дефиниция на наш Content Type.

Дефиниции на Content Types ни дават тази възможност чрез XmlDocument елементи:

<!-- Document Content Type -->
<ContentType ID="0x0101006BD6DAD38F7947799A6F2EE72F5C3C24"
    Name="TemporaryContentType"
    Group="Custom Content Types"
    Description="">
    <FieldRefs>
        <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" />
    </FieldRefs>
    <XmlDocuments>
        <XmlDocument 
        NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
            <FormTemplates 
            xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
                <Display>MyCustomForm</Display>
                <Edit>MyCustomForm</Edit>
                <New>MyCustomForm</New>
            </FormTemplates>
        </XmlDocument>
    </XmlDocuments>
</ContentType>

 

С горният FormTemplates елемент (в XmlDocument) съм посочил на този Content Type да използва MyCustomForm за Display, New и Edit формите си.

За да създадем MyCustomForm като Rendering Template, трябва да си направим свой ASCX файл и да го сложим в CONTROLTEMPLATES папката. Това е хубаво да стане чрез Feature.

Ето примерен Rendering Template в свой ASCX файл. SharePoint ще разгледа и запомни всички RenderingTemplate обекти по време на зареждане на своя Application Pool, стига те да се намират в CONTROLTEMPLATES папката.

<SharePoint:RenderingTemplate ID="MyCustomForm" runat="server">
    <Template>
        Hello
    </Template>
</SharePoint:RenderingTemplate>

Можете да добавите HTML и свой ASCX контролки и напълно да промените това, което крайните потребители виждат и използват.

Ето какво всъщност става „зад сцената“:

В първата част описах как ListFormWebPart се добавя от платформата на ASPX страници, които по принцип SharePoint би използвал за да покаже свойте “New”, “Edit” и “Display” форми. Този Web Part върши цялата работа в намирането на точния Rendering Template за текущия Content Type, върху който крайният потребител иска да работи.

Ето малко код от Reflector… Това е TemplateName, притежанието на този ListFormWebPart, който проверява текущия Content Type и връща името на конфигурирания Rendering Template.

image

Това ни води до следващата опция:

Вариант 2: Да посочим името на Rendering Template чрез код.

Кода е много прост (: SPContentType обекта открива 3 притежания:

cType.NewFormTemplateName = “MyCustomForm”;
cType.EditFormTemplateName = “MyCustomForm”;;
cType.DisplayFormTemplateName = “MyCustomForm”;
cType.Update(true);

С това ще се постигне същото нещо като Опция 1, но няма нужда от декларативен CAML. Чрез cType.Update(true); изпращаме промените към дъщерни Content Types.

Успех.

Tags: , ,

Bulgarian

Формите на списъци в SharePoint 2007 - как работят те

by Ради Атанасов 7. February 2010 09:05

В този пост разглеждам как работят формите на списъци и Content Types в SharePoint 2007 (в случая WSS v3) и какви са ни възможностите за разширяване и разработка. В тази първа част ще обясня как да използваме наши си ASPX форми, а във втора – как да заменим стандартните Rendering Templates с нови. С втория пост ще сложа и линк към решение с пример за двата варианта.

Когато създадем списък в SharePoint, ние всъщност създаваме копие на базата на съществуващ шаблон – List Template. Тези шаблони са дефирнирани в Features, и всеки Feature с шаблон за списък ще съдържа дефиниращ файл: schema.xml. Този schema.xml може се разгледа за всеки списък, който WSS v3 ни предлага: разгледайте 12\TEMPLATE\FEATURES папката, там има Features като CustomList, ContactList, DocumentLibrary. Всичките имат schema.xml, който дефинира особеностите им.

В края на този XML (CAML) файл може да видим „Form” елемент, който дефинира ASPX страниците, които ще бъдат използвани за списъка, на който схемата принадлежи.

clip_image002

Когато се създава списък, платформата прави копие на файл-а дефиниран в “SetupPath” атрибута на “Form” елемента, и го качва в базата данни с посоченото име в “Url” атрибута. След като страницата е създадена (това е обикновен Web Part Page), SharePoint слага ListFormWebPart в посочения WebPartZoneID. “pages\form.aspx”, и подобни други ASPX страници се намират в 12\TEMPLATE\Pages, и там можете да сложите своите. Горният screenshot е от CustomList, но можете да разгледате и всички останали.

Интересното става, когато Content Types са добавени в списъци. Всеки Content Type може да има свои DisplayForm, EditForm или NewForm зададени, а всеки списък може да има множество Content Types. Съответно за създаването на различен вид съдържание в един списък можете да имате различни форми за различните Content Types – това е много добра гъвкавост. От друга гледна точка, всеки Content Type може да има един и същ интерфейс (форма) навсякъде, когато е използван многократно.

Как работи всичкото това зад сцената?

В SharePoint SPContentType обектът ни позволява да му зададем EditFormUrl, DispFormUrl, и NewFormUrl (притежания):

cType.EditFormUrl = "_layouts/ourprojectfolder/customedit.aspx";

cType.NewFormUrl = "_layouts/ourprojectfolder/customnew.aspx";

cType.DisplayFormUrl = "_layouts/ourprojectfolder/customdisplay.aspx";

Ако тези са дефинирани от нас, SharePoint прави следното:

· С избирането на “New” бутона или съответните опции от менюто на всеки ред в списъка, SharePoint ни праща на EditForm.aspx, NewForm.aspx или DispForm.aspx според избора.

· Когато създава списъка, платформата конфигурира ListFormWebPart на всяка от тези ASPX страници (откопирани са от Pages\form.aspx). WebPartZoneID атрибута определя къде точно да се добави този Web Part. Тези страници не могат без този Web Part – SharePoint се оплаква ако се опитате да го насочите към страница без ListFormWebPart.

· Този ListFormWebPart проверява текущия SPControlMode (Edit, New, Display), и дали съответното притежание (EditFormUrl, DispFormUrl, или NewFormUrl) на текущия Content Type е зададен. Логиката може да бъде проследена ако разгледаме кода на този web part – в OnInit метода се прави проверка на притежанието this.FormPageUrl, което всъщност е obfuscated и не мога да ви го покажа.

clip_image003

Независимо дали е зададен от нас или не (EditFormUrl, DispFormUrl, или NewFormUrl), SharePoint ни праща към съответната страница - NewForm.aspx, EditForm.aspx или DispForm.aspx. На тези страници ListFormWebPart проверява текущия Content Type (всеки List Item в SharePoint има зададен Content Type) и ни препраща към съответната форма (ако тя е зададена от нас). this.FormPageUrl определя коя е тя на база на текущия SPControlMode (New, Edit, Display), но не мога да ви покажа кода на this.FormPageUrl защото е obfuscated. Така всъщност става конфигурирането на поризволни форми.

Проблемът на този дизайн, е че SharePoint първо ни праща към NewForm.aspx (или една от другите) и след малко код отново ни препраща чрез SPUtility.Redirect (което зад сцената е по-украсен Response.Redirect). Това са два post-back-a, и можете да ги проследите с Firebug или Fiddler, или който и да е друг HTTP listener. Освен, че препратките са две, NewForm.aspx е Web Part Page, а те не са хич леки.

Това, което все още не знам е как да конфигурираме EditFormUrl, NewFormUrl или DispFormUrl в схемата на ContentType елемента (чрез CAML). Примерът по-горе е чрез код и обектния модел, но той не е идеален за всички случаи. В WSS v3 “Form” елемента е “obsolete”, така че начина, по който го правихме в WSS v2 е вече невалиден. Втория ни вариант всъщност е да работим с XmlDocuments елемента в CAML – той ни позволява да сменим съответния Rendering Template на формата. Така става чрез CAML, но двата метода работят по коренно различен начин.

Във втората част на този пост ще разгледам как да заменим стандартните Rendering Templates с произволни, и съответно алтернативния вариант да разширяваме формите на списъци и Content Types.

Надявам се това ще помогне на някой.

Tags: , ,

Bulgarian

Microsoft Certified Master

SharePoint Server MVP

About the author

SharePoint architect, consultant and solution developer.

Аз съм консултант, архитект и разработчик на SharePoint решения.

Feeds

Get RSS Feed (Bulgarian)
Get RSS Feed (English)    
Get RSS Feed  (Both)        

I blog about technical concepts in English, as they benefit the whole community, but sometimes I blog about stuff specific to Bulgaria, and those I post in Bulgarian. The above feed URL's let you choose what to subscribe to.

My SharePoint Forum Activity