SPNote

SharePoint Notes

SharePoint 2010 Debugging

SharePoint 2010 Debugging  은 SP 2007 과 거의 같습니다. (지금 SP 2007 web.config 가 없어서 확신이 없음...) 이전 글에서 AllowInefficientQueries 에러를 만나고 나서 이전 방식으로 Web.config 파일을 수정했는데, Visual Studio 에서 Script Debugging 이 잘 동작했습니다. 주석으로 Line 번호를 추가하였으니 문자열 검색 혹은 VS 에서 Ctrl + G 하시고 Line 번호 넣고 찾아가셔도 됩니다.

SharePoint 2010 Debugging is almost same with MOSS 2007. Find a web.config file for your Web Application and change values.
  - Path might be: "C:\Inetpub\wwwroot\wss\VirtualDirectoties\<YourWebApplicationName>”
    ex) C:\inetpub\wwwroot\wss\VirtualDirectories\intranet.spnote.dev80

수정할 부분은 아래와 같습니다.
What items should you change are below.

  1. CallStack : true
  2. customErrors : Off (case sensitive)
  3. debug: true

[code:xml;ln=off]

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <SharePoint>
    <SafeMode CallStack="true"> <!-- Line: 51 -->
  </SharePoint>
  <system.web>
    <customErrors mode="Off" /> <!-- Line: 341 -->
    <debug="true">              <!-- Line: 350 -->
  </system.web>
</configuration>

[/code]

위 설정을 완료했음에도 아래의 메시지가 나타날 수 있습니다.
Even though you have configured the values on web.config, you may encounter an error screen below.

image

이때 주소가 /_layouts/* 로 시작된 것이라면 이 Virtual Directory 내의 Web.config 파일도 수정을 해야합니다. 이때는 customErrors Mode 만 Off 로 설정하면 됩니다.
If the URL is like /_layouts/* then you need to change the web.config in _layouts(Virtual Directory) as well. You can simply change customErros Mode to Off.
  - Path: 14 HIVE\TEMPLATE\LAYOUTS\web.config

image

[참고]
- Download Web.config: web.config.zip (9.48 kb)

A first look at SharePoint 2010 Development

SharePoint Server Search Service 시작 이후, 부쩍 늘어난 메모리 사용량을 해결하고자 4GB RAM 의 추가 구매를 했습니다. ㅠㅠ VS 2010 실행하고 간단한 코드 작성과 팀사이트 하나 열고 작업관리자를 보니 약 3.0GB 를 차지합니다. 중앙관리까지 열면??? 다시 한번, 하드웨어 사양이 중요함을 느낍니다.  ㅡㅡ;

Anyhow, Toatal 8GB RAM 장착 기념으로 SharePoint 2010 Developer Walkthroughs 1 을 따라해봤습니다. Title 은 Walkthrough 1: Using LINQ to SharePoint from within a Visaul web part ( SharePoint Visual web part 에서 LINQ 사용하기) 입니다. 흠... 첫번째라 만만히 봤는데, 단지 기능적인 부분이 아닌 완벽한 소스 따라하기?를 하다보니 애로사항이 있었습니다. 그리고 Visual Studio 2010 에서 추가된 막강한? 기능들을 보니 확실히 수작업? 했던 예전에 비하면 완젼 편해졌지만... 어느정도 단점이 될만한 부분도 있더군요... 우선, 이번 작업을 하면서 발견한 사항들입니다.

Things to study...
( 앞으로 공부할 내용으로, 현재 알고 있는 지식 혹은 느낌으로만 요약함 )

  1. Sandboxed Solution VS Farm Solution
    - SP 2007 에서 Farm 배포만 되던 solution 이 Site Collection 레벨에서 배포 테스트 용도 혹은 작은 단위의 Solution ? 등으로 활요할 것으로 보임
  2. Microsoft.SharePoint.Linq 와 SPMetal 명령어 툴
    - Linq 는 써보지 않았지만, 예전 CAML Query 로 제한이 많았던 부분을 어느정도 해소할 것으로 기대함
    - SPMetal 은 List 로부터 content type 정의와 list schema 를 읽어서 Entity Class 를 생성해준다.
      ( 한번 써본 결과의 평가 : Good~~ )
  3. SharePoint 2010 Templates
    - 종류가 여러가지이나, 이번 예제에서 사용되는 Visual Web Part Template 은 SP2007 시절시 UserControl WebPart 를 연상하게 한다.
  4. Visual Studio 2010 Support
    - Template 만으로도 간단히 Solution 파일이 생성되고 솔루션 배포 그리고 필요한 Feature 까지 Activation 되는 놀라운 기본 기능
    - 프로젝트 파일을 열어보니 특별한 target 을 사용하는 부분을 발견했습니다. SP 2007 에서 주로 사용했던 Andrew Connel 방식과 유사할 것으로 예상합니다.

흠... 역시나 SharePoint 의 새 버전 출시는 많은 것을 들고 나오기에 따라가기가 쉽지 않네요... SP 2007 이 해외에서 너무 많이 팔려서 그런지 MS 에서 힘 좀 쓴 걸로 보입니다. 환율이 좋은 이 즈음, Amazon 에 가서 선 책주문을 걸어놔야겠습니다.

 

자~ 그럼 Walkthrough 1으로 돌아가겠습니다. 위 링크를 따라가서 다운받은 PDF 문서를 보면 SharePoint 개발자라면 충분히 따라할 내용이니 세부 설명은 생략하고 제가 진행하면서 막혔던 부분이나 의문을 가졌던 부분을 설명하겠습니다. 그 첫째는 SPMetal 의 실행입니다. 둘째는, Linq 를 사용하는 코드에서 다른 리스트의 내용을 참조하는 부분입니다.

  1. SPMetal 의 실행
    - Visual Studio Command Prompt(2010) 메뉴로 들어가서 spmetal 하고 치면, 안됩니다. ㅡㅡ;
    환경 변수에 들어가 있지 않으니, 당연히 안되는 것으로 생각하고 있습니다. 하지만, 이 명령어의 위치는 알고 있으므로 직접 가서 실행하면 됩니다.

    Path: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN
    ex) spmetal /web:http://wss40 /namespace:SPNote.Projects
          /code:E:\SharePoint\SPHOLs\SPLinqSolutionDemo\SPNote.Projects.cs
         (실행을 하기 위해 한줄로 붙이는 센스는 물어볼 필요없는 덕목?입니다.)

    실행하면 다음과 같은 경고 메시지가 나오는데, List Form Templates 는 빠진다는 내용으로 현재 예제 실행과는 관계 없으므로 과감히 무시해도 됩니다.

      # 예제 실행화면


  2. Sample Code 에서 Employee Entity 에서 Project Entity 를 Property 로 참조하는 부분
    우선 코드는 단편적인 코드는 아래와 같습니다.

      # 코드 요약


    위의 음영된 부분인 Project 는 어떻게 List 를 구성하면 나오는 걸까??? 하고 무지 궁금했습니다. 마침 약속까지 있는 상황에서 조급해지는 마음에 비체계적인 방법으로 새로 추가된 기능인가? 등 무지막지하게 시도를 해보았는데... 잘 안되더군요... 지금 생각해보면 마치 웹에서 지도 감상시 축소 한번만 하면 순식간에 해결될 듯한 문제였습니다. 흠... 혹시 위 문장이 이해가 안되는 분들을 위해서 설명을 드리자만... 특정 범위내에서 한정하기보다 좀 더 위로 올라가서 일반적인 시각으로 본다는 머 그런 내용입니다. 저는 Content Type 을 이용하여 도전해 보았는데 Item 을 상속하므로 Title 은 둘다 있게 되어 값을 저장하면 같이 저장되는??? 안타까운 현실에 어떻게 풀어볼까 시간 소모만 했었습니다. 정리하자면, 쉽게 생각하면 아주 쉬울수도 있고 괜히 다른 옵션들 안 누르는게 좋다는 것입니다. 
    (덕분에 AllowInefficientQueries TRUE 해달라는 에러까지 도달하였는데, Beta2 부터 안된답니다. ㅡㅡ; 여튼, 다시 한번 축소했기에 Go to bed 가 눈 앞에 있습니다. ) 덕분에 구글링 좀 해보니 JOIN 도 되고 완젼 좋아 보입니다. ^^ 보너스로 비효율적 LINQ 연산자 리스트 주소 남깁니다.

    여러분도 한번 해보시기 바랍니다. 빠르게 한방에 되는 것도 좋지만, 시행착오 속에 발전하는 실력과 SharePoint 의 폭넓은? 이해가 아닐까요? ^^ 저는 덕분에 SDK 좀 뒤져보고 Microsoft SharePoint Foundation 2010.chm 이 더 자주 사용하게 될 것으로 예상하고 있습니다. (WSS 3.0 의 계보를 잇는?)

 

마지막으로 Employees List 의 AllItems 와 테스트 결과 화면입니다.

  # Employees List 의 AllItems.aspx



  # 테스트 결과

 

결론은, 역시나 Sharepoint 2010 개발도 많은 경험과 깊은 연구? 생활을 다시한번 요구될 것으로 예상합니다. 다들 힘내시라는 말밖엔...

위 작업하다가 궁금한 부분이 있으면 질문 환영합니다. 현재 SP2010 Machine 이 집에만 있는 관계로 답변은 느립니다. 참조하시기 바랍니다.

 

SharePoint 2010 Columns

안녕하세요?

Will입니다. 이번에는 저번에 2007에서 개발한 소스를 가지고 SharePoint 2010 에서 다시 사용 할 수 있는지

체크를 해보도록 하겠습니다.

VS2010 의 Class Library를 사용해서 만들어 보았습니다 밑에 포스팅 되어 있는 내용을 참고로 하시면은 됩니다.

그리고 나서 배포를 해보았습니다. 배포후 아래와 같은 결과 하면을 볼 수 있습니다.

결과 1) 새글 추가

 결과2) 내용을 채우 겠습니다.

결과 3) 내용을 쓰면은 0의 값이 들어 가는걸 확인 할 수 있을 것입니다. 

 결과 4) 그리고 나서 DisplayMode에서 확인한 결과 버튼이 잘나오네요.

 결과 5)버튼을 클릭 해 보았습니다.

 

결과 6) 그리고 닫으니.... 허걱 값이 안변하네요! 아마 중간에 확인을 눌렀을시 이벤트가 동작 해야 되는데 닫기를 눌럿더니 값이 안변한것 같습니다.

결과 7) 하지만 F5을 눌러 Refresh를 하니 아래와 같이 값이 들어가 있는 걸 확인 할 수 있습니다.  

SharePoint 2010은 ClientScript로 Ajax처리가 되어 있어서 값의 변화가 있을 시 제로드를 하기 때문에 기존의 값이 변하지 않는 것을 확인 할 수 있습니다.

하지만 자체 DB에 저장되어 있는 값은 +1이 되어 있는 것을 확인 할 수 있습니다.  해당 문제에 대해서는 조금 더 SharePoint 2010을 분석한 후에 추후에

수정 하도록 하겠습니다.  밑에 SharePoint 2010 개발 소스를 올립니다. 참고 하시고 소스에는 주석으로 저희 사이트 이름을 소스에 꼭 넣어서 사용해 주시기 바랍니다.

 질문은 메일로 보내주시거나 코멘트를 다시면은 답변을 드리도록 하겠습니다.

 

SPNote.SharePoint.Fields.zip (38.15 kb)

SharePoint 2010 Study 1

안녕하세요? Karl 입니다.

Finally!!! 개발 PC를 손에 넣었습니다. 그동안 눈팅만 하다가 저만의 규칙?에 따라 그냥 구매했습니다.
(규칙: 소비만큼 열씨미 하게 된다? CPU 는 중간에 바꾸기 어려우므로 좋은걸로 산다. 등등...)
Will 과 함께 2010년 1월 9일(토요일) AM 10:00 에 용산에서 만나서 집으로 옮기고 밤새 조립을...
그리고 현재의 Fantastic PC 를 감상하고 있답니다.

웁스~ Windows 2008 부터 시작하여 SharePoint 2010 까지 설치하는데 거의 하루가 걸렸습니다... ㅡㅡ;
더욱 맘에 안드는 것은 Search 서비스 시작하고 나서 메모리를 확 잡아 먹는다는 것입니다.
(메모리가 4GB 인데, 거의 잡아먹습니다. => 식충으로 예상하고 있음...)
Stop 시키고 싶지만, SP 2007 처럼 버튼 한방에 안되는 관계로 PASS~~ 했습니다. ㅠㅠ
흠... List(목록)의 Item 출력이 궁금해서 AllItems.aspx 렌더링된 html 을 Visual Studio 2010 으로 열었더니...
기어갑니다. TAB 누르면 잠시 있다가 움직이는 그런 비쥬얼 효과... , 승질나서 VS 2008 로 이사갔습니다. ㅡㅡ;

여담이 길었습니다만...
SP2010 개발을 위해서는 고사양의 시스템이 받쳐주지 않으면 일 못한다고 배째야할 것 같습니다.

 

그럼 SharePoint 2010 Study 을 시작하겠습니다. 주제는 예상하셨다시피... AllItems.aspx 입니다.

[AllItems.aspx]

[code:html;ln=off]

<!-- Item1 Begin -->
<tr class="ms-itmhover" iid="2,1,0">
    <td class="ms-vb-itmcbx ms-vb-firstCell">
        <input type="checkbox" class="s4-itm-cbx" />
    </td>
    <td class="ms-vb2"></td>
    <td height="100%" onmouseover="OnChildItem(this)" class="ms-vb-title">
        <div class="ms-vb itx" CTXName="ctx2" id="1" Field="LinkTitle" Perm="0x7fffffffffffffff" EventType="">
            <a onfocus="OnLink(this)"
                href="http://wss40/_layouts/listform.aspx?
                    PageType=4&amp;
                    ListId={A5E99EC8-9246-41C2-8539-483BCEC57E0A}&amp;
                    ID=1&amp;
                    ContentTypeID=0x010097742119E6460B479093DF8B310706DF"
                onclick="EditLink2(this,2);return false;" target="_self">
                Item1
            </a>
            <img src="/_layouts/1033/images/new.gif" alt="New" title="New" class="ms-newgif" />
        </div>
        <div class="s4-ctx">
            <span> </span>
            <a onfocus="OnChildItem(this.parentNode.parentNode); return false;"
                onclick="PopMenuFromChevron(event); return false;" href="javascript:;" title="Open Menu"></a>
            <span> </span>
        </div>
    </td>
    <!-- Body Column1 -->
    <td class="ms-vb2">
        <div dir="" class="ms-rtestate-field">
            <div class="ExternalClass0463C750337B4A10B3DC94F5CC2F35FF"><p>Body​</p></div>
        </div>
    </td>
</tr>
<!-- Item1 End -->

[/code]

현재 SP2007 이 없어서 비교할 수는 없지만, 기억을 더듬어 간략히 정리하겠습니다.
첫째로, 렌더링을 담당했던 schema.xml 에서 이제는 XSL 로 대체되는 것으로 보입니다.
schema.xml 라인수는 87 밖에 되지 않고 main.xsl 을 참조합니다.

<XslLinkDefault="TRUE">main.xsl</XslLink>

그리고 main.xsl 은 아래와 같이 필드타입, 뷰스타일 xsl 파일을 참조합니다.
<xsl:importhref="/_layouts/xsl/fldtypes.xsl"/>
<
xsl:importhref="/_layouts/xsl/vwstyles.xsl"/>

뒤져보시면, 위 XSL 파일에서 Item Rendering 부분이 보입니다.
SP2010 에서는 XSLT 가 지원된다고 하지만, 기존의 CAML 방식에서 XSLT 로 변환이라고 한다면
schema.xml 부분이 그 대상이라고 생각합니다.
둘다 복잡해보이긴 하지만, 상대적으로 표준적인 XSLT 방식을 채택한 것은 좋은 변화라고 생각합니다.
(참조: Microsoft Professional Evaluation Guide Part - 30 Page)

 

호기심으로 시작한 이번 글은 여기서 마치도록 하겠습니다.
다음 주제는 아래 중 하나가 될 것으로 예상합니다.
  1. VS2010 에 추가된 SharePoint Templates
  2. VS2010 에 추가된 기능 (SandBoxed solution, Server Explorer 에서 탐색기 형태로 사이트를 볼 수 있는 기능 등)
  3. Microsoft Professional Evaluation Guide Part 2

그럼 이만 줄이겠습니다.

[참조]
SP2010_Study1.zip (57.88 kb)

Microsoft Professional Evaluation Guide Part 1

Microsoft Professional Evaluation Guide Part 1
Ver 1.0
Jan 1st, 2010 

이 문서는 SharePoint 2010 에 대해 개발자로서의 개인적인 해석의 간략한 정리입니다. 2년간의 MOSS 2007 개발 경험을 바탕으로 문서를 작성했으나 개인이 작성한 문서이므로 너무 믿으면 후회할 수도 있습니다 

얼마 전 있었던 SharePoint 2010 Ignite Training for Partners 프로그램에 참가하지는 못했지만 이 문서의 정리를 위해 Microsoft Professional Evaluation Guide Part 를 선택했습니다.
원본 문서에서 참고한 모든 내용의 권리는 Microsoft 에 있습니다. 

비 영어권 Korean 으로서 웹에서 자료만 뒤지는 게 아쉽지만, 온라인 그리고 곧 출시될 서적 등의 리소스를 활용하면 이전 버전인 2007 에서 했던 것처럼 같이 많은 부분을 커버할 수 있을 것 같습니다. (인도 방갈로에서 곧 열린다고 합니다. 자신의 파워?를 이용하여 기회를 살리시기 바랍니다.) 

문서의 구성은 크게 2 단계 혹은 3 단계로 나누어 진행하려고 합니다.SP 2010 에 대한 내용과 개발 예제가 그것이지만 아직 개발 PC 의 구매가 이루어지지 않은 관계로 우선은 내용에 대한 생각이 주가 될 것으로 예상합니다  

 

문서 요약
Microsoft SharePoint 2010 의 기능 집합과 확장 가능한 부분에 개요이며 개발자가 위를 이용하여 포괄적인 솔루션을 생성할 수 있도록 이해를 주기 위한 문서입니다. 

소개
빠르게 솔루션을 개발할 수 있도록 풍부한 기능의 제공과 Visual Studio 2010 SharePoint Designer 2010 를 이용하여 생산성 향상과 Visual Studio Team Foundation Server Application lifecyle 의 관리를 제공합니다. 

주목할 부분으로는 아래와 같습니다. (개인 중심의 해석)
1. 개발 플랫폼으로 많은 기능들이 VS 2010 Add In 되어 개발에 편리함과 생산성에 향상
2. BCS(Business Connectivity Services) 에서는 기본의 BDC(Business Data Catalog) 에서 제공하지 않았던  Write(쓰기) 의 지원
3. 기존의 솔루션(WSP)이 중앙 관리에 설치되어 전체가 적용이 되던 부분이 SandBoxed Solution 이라는 새로운 개념이 도입되어 사이트 단위로 솔루션 배포와 활용이 가능 

새로운 기능의 추가에 대한 요약 

개발자 생산성
Visual Studio 2010 SharePoint 프로젝트 타입과 항목?
Visual Studio 2010 SharePoint 툴 확장
Visual Studio Extensions For SharePoint 업그레이드
Windows 7 and Windows Vista 운영체제 지원
SharePoint Designer 2010
Developer Dashboard
Team Foundation Server 2010 통합
  
다양한 플랫폼 서비스
SharePoint 리본
SharePoint 다이얼로그(새창)
Silverlight 웹 파트
List 참조와 관계
Business Connectivity Services (BDC 의 새로운 버전)
LINQ to SharePoint


유연한 배포
Sandboxed Solutions
SharePoint Online
Upgrading Solutions

개발자에 의해 SharePoint 에 포함된 핵심 솔루션 종류 
우선은 Visual Studio 2010 SharePoint Designer 2010 을 이용하여 솔루션 개발을 보다 쉽게, 빠르게, 유연하게 만들 수 있습니다. SP Designer 를 이용하여 Web UI 를 구성하고 코드의 부분은 개발자가 구현하여 빠른 생산성을 기대한다고 합니다. 국내에서의 경험으로는 디자이너 분들이 Designer Tool core.CSS 의 경험 부재로 인해 쉽지는 않을 것 같지만, Workflow 같은 경우라면 wsp 파일로 내보내기가 지원된다고 하니, 개발 이외의 작업 분담과 개발자는 코딩에 집중하는 업무의 형태도 불가능하지는 않을 것 같습니다. 

문서와 목록 관리의 변화된 부분은 아래와 같습니다.
1. 규모가 큰 목록 지원
2. 향상된 검증 (Form?)
3. LOB(Line Of Business) 시스템 연결 

기타 나머지 부분은 아래와 같습니다.
  -  Workflow SharePoint Workspace 를 포함하는 Client 어플리케이션의 향상
  -  태깅과 평가에 대한 지원
  -BCS 에서 Write(쓰기) 가 가능하므로 기존의 데이터 관리에 유리

WF 를 이용하여 국내 기업에서 구매할 수 있을 정도의 전자결재 제품이 출시된다면 SharePoint 가 널리 퍼질 것 같기도 합니다.
(전자결재 전문가와 함께 오픈 소스를 시작하고 싶은 소망이 있습니다.)  

기존의 주 기능에 수정 및 확장 가능한 부분은 아래의 테이블과 같습니다.

주 기능 기본 기능 확장 가능 부분
Sites 목록과 문서 라이브러리의 자료에 저장과 가져오기시 쉽고 유연한 방법의 제공 웹 파트, 마스터 페이지, 페이지, 델리게이트 컨트롤, InfoPath 양식, Word 변환 서비스를 활용하는 솔루션, Access 서비스 이용
Communities 사용자에 관련된 기능태깅과 평가 기능 정의된 검색, 검색 웹 파트, 태깅 과 평가 및 사용자 커스텀 인터페이스
Content 웹 페이지, 문서, 레코드 등의 자료 관리 커스텀 페이지 타입, 필드 컨트롤, 컨텐트 타입, 문서 세트, 원격 블로그 저장 프로바이터, 워크플로와 Word 서비스. 레코드 관리의 확장과 공용 웹 사이트 확장
Search Database 를 포함한 SharePoint 의 안과 밖의 검색 기능 정의된 검색 결과 변환. 자료의 네비게이션과 위치 파악을 나타내는 그리고 다른 데이터 스토어의 연결을 하는 웹 파트. IFilter 와 프로토콜 핸들러
Insights 엑셀 서비스, 웹 페이지 표시, Dashboard, KPI 기본 기능의 기능 확장
Composites 해당 플랫폼을 이용한 솔루션 기능 웹 파트, 워크 플로, InfoPath 폼 서비스는 사용자가 활용 가능한 툴 사용 증가?


직접 사용해보지 않고 문서만 보고 글 작성을 하려고 하니 한계가 많습니다. 점차 기능을 활용해보고 문서를 수정하도록 하겠습니다 

 

SharePoint Custom Field(Button)

안녕하세요?
오늘은 저번에 공지한대로 커스텀 텍스트 필드에 버튼 컨트롤을 넣어서 작업을 해보겠습니다.

우선 이번에는 저번과 다르게 디폴트 템플릿도 만들 것이고 display할 때 기본 컨트롤 뿐만 아니라.

버튼이 함께 들어 가도록 하겠습니다.

1. class를 생성 하고 SPField를 상속을 받도록 하겠습니다.

2. 그냥 빌드를 하면은 저번과 같이 에러가 나게 됩니다. 생성자를 넣지 않아서 나는오류입니다.
   그럼 저번과 같이 생성자 또한 정의를 해보겠습니다.

3. 그런 다음 FiellRenderingControl을 상속을 받고 제가 지정한 class를 넣어 주도록 하겠습니다.

 4. 그리고 금방 생성한 class에 baseFieldControl을 상속 받도록 하겠습니다.

5. 그런 다음 아까 말했듯이 디폴트 템플릿을 사용자 지정으로 넣습니다.(아무 이름이나 상관 없음.)

6. ControlTemplate를 생성 합니다.(이름 상관 없음.)

7. ControlTemplate의 내용은 아래의 그림과 같이 정의를 해줍니다.(Source단 참조, Template안에 컨트롤 및 테그 아무렇게 넣어도됨.)
  * SharePoint:RenderingTemplate 의 ID는 디폴트 템플릿의 사용자 이름으로 해야됨.(아래 그림 참조)

8. 컨트롤을 정의 하겠습니다 Template에 있는 텍스트 박스 하나, Display에 뿌릴 테이블 하나, 버튼 등록을 위한 버튼 하나.

9. 텍스트박스를 넣기 쉽게 하기 위해서 캡슐화 하겠습니다.

10. 값을 저장 하고 빼오기 위해서 Value를 상속 받고 Text의 값의로 설정 하도록 하겠습니다.

 

11. 그리고 버튼을 클릭 이벤트를 생성 하도록 하겠습니다.


 
12. 이제 Display시 뿌려질 내용을 하나의 함수를 생성 해서 넣도록 하겠습니다. (Microsoft.SharePoint.WebControls.OWSForm이라는 것을 참조)

13. 해당 페이지에 뿌려줄때 동작 하는 CreateChildControls를 상속 받는다 (필드가 널인지 체크, base컨트롤 생성 및 display모드시 버튼 등록, New모드시 기본값설정)

14. SharePoint에서 Display이시 컨트롤을 랜더링을 관장하는 RenderFieldForDisplay를 상속 받는다.(아까 생성한 Table을 뿌림.)

 

15. 이벤트에 해당 컬럼의 값을 +1 시킨다.

 

16. 필드 타입 정의 XML (저번 XML그대루 같다가 씁니다;; 편집해서 쓰세요~)

17. 해당 dll은 객에 등록, Controltemplate랑 xml은 Controltemplates랑 xml폴에 각각 복사 후 iisreset

완료 화면 1)

완료 2)

 

완료 3)

 

완료 4)

 

 

완료 6)

소스 1)

[code:html;In=on] 

    public class CustomButton : Microsoft.SharePoint.SPField
    {
        public CustomButton(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName)
        {
        }//

        public CustomButton(SPFieldCollection fields, string typeName, string displayName)
            : base(fields, typeName, displayName)
        {
        }//

        public override BaseFieldControl FieldRenderingControl
        {
            get
            {
                BaseFieldControl bfc = new CustomButtonBaseControl();
                bfc.FieldName = InternalName;
                return bfc;
            }
        }//FieldRenderingControl

    }//class

[/code]

소스 2)

 [code:html;In=on]

    public class CustomButtonBaseControl : BaseFieldControl
    {

        protected TextBox Ctb_txt;
        public Button spnote_btn;
        private Table table;

        protected override string DefaultTemplateName
        {
            get
            {
                return "btn_SPNote_Template";
            }
        }//DefaultTemplateName

        protected override void CreateChildControls()
        {
            if (base.Field == null)
            {
                return;
            }

            base.CreateChildControls();
           
            if (base.ControlMode == SPControlMode.Display)
            {
                spnote_btn = new Button();
                spnote_btn.Click += new EventHandler(spnote_btn_Click);
                spnote_btn.ID = "spnote_btn";
                spnote_btn.Text = "버튼테스트";
                DisPalyFormAdd();
            }
            else
            {
                Ctb_txt = (TextBox)this.TemplateContainer.FindControl("SPNote_txt");
                Ctb_txt.Enabled = false;
                if (base.ControlMode == SPControlMode.New)
                {
                    Ctb_txt.Text = "0";
                }
            }

        }//CreateChildControls

        public void DisPalyFormAdd()
        {
            Microsoft.SharePoint.WebControls.OWSForm form =
                new Microsoft.SharePoint.WebControls.OWSForm();
            Controls.Add(form);
            table = new Table();
            form.Controls.Add(table);
            table.Width = Unit.Percentage(80);
            TableRow row = new TableRow();
            table.Rows.Add(row);
            row.BackColor = Color.White;
            TableCell cell = new TableCell();
            cell.Width = Unit.Pixel(150);
            cell.Attributes["class"] = "ms-vb2";
            cell.Controls.Add(spnote_btn);
            row.Cells.Add(cell);
               
        }//DisPlayFormAdd

        protected override void RenderFieldForDisplay(HtmlTextWriter output)
        {
            base.RenderFieldForDisplay(output);
            if (table == null)
            {
                DisPalyFormAdd();
            }

            table.RenderControl(output);

        }//RenderFieldForDisplay

        void spnote_btn_Click(object sender, EventArgs e)
        {
            Web.AllowUnsafeUpdates = true;
            String itemvalue =  this.ItemFieldValue.ToString();
            this.ItemFieldValue = (int.Parse(itemvalue) + 1).ToString();
            this.Item.Update();
            Web.AllowUnsafeUpdates = false;
            string responseurl= this.Page.Request.Url.ToString();
            this.Page.Response.Redirect(responseurl);
           
        }//spnote_btn_Click

        public virtual string Text
        {
            get
            {
                this.EnsureChildControls();
                if (this.Ctb_txt == null)
                {
                    return null;
                }
                return this.Ctb_txt.Text;
            }
            set
            {
                this.EnsureChildControls();
                if (this.Ctb_txt != null)
                {
                    this.Ctb_txt.Text = value;
                }
            }
        }//Text

        public override object Value
        {
            get
            {
                return this.Text;
            }
            set
            {
                if (base.Field != null)
                {
                    this.Text = base.Field.GetFieldValueForEdit(value);
                }
            }
        }//Value

    }//class

[/code] 소스 3)

[code:html;In=on]

<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
  <FieldType>
  <Field Name="TypeName">사용자정의버튼</Field>
  <Field Name="ParentType">Text</Field>
  <Field Name="TypeDisplayName">사용자정의버튼</Field>
  <Field Name="TypeShortDescription">사용자정의버튼</Field>
  <Field Name="UserCreatable">TRUE</Field>
  <Field Name="FieldTypeClass">SPnote.SharePoint.SPField.SPFeildText.CustomButton, SPnote.SharePoint.SPField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=be2c734ef24c0327</Field>
  <RenderPattern Name="DisplayPattern">
   <Column HTMLEncode="TRUE" AutoHyperLink="TRUE" AutoNewLine="TRUE"/>
  </RenderPattern>
 </FieldType>
</FieldTypes>

[/code]

Popup Description balloon for Calendar Items

Calendar List can be used to share information about events, appointments, meetings and etc.


While I was using this list, I found that it will be better to popup its Description value when a user mouse over to each item cause it basically doesn't. Here's what the common columns of Calendar List are.

Column Name Description
Title (required) Single line of text
Location Single line of text
Start Time (required) Date and time
End Time (required) Date and time
Description Multiple lines of text


Unfortunately, Description column type is "Multiple lines of text" which means this column contains HTML tags that this have to be processed to remove HTML tags before showing its value. Here is a Display Item image and a raw value of Description column. 


  # Display Item

ex) Raw? Description Value
[code:html;ln=off]

<div>OCS R2 Verification Call for VSP</div>
<div>I support OC engineers to get it done successfully!</div>
<div>&nbsp;</div>
<div>Bold:<strong>&nbsp;Bold</strong> </div>
<div><font color="#ff9900"><font color="#000000">Font Color:</font> Orange</font></div>

[/code]


So, I need to remove HTML tags and I used Regular Expression.
ex) System.Text.RegularExpressions.Regex.Replace(Description Column Value, "<[^>]*>", string.Empty)


But where should I edit for this??? The answer is DefaultTemplates.ascx under
12 Hive\TEMPLATE\CONTROLTEMPLATES\... You can change this directly or override into new one. Calendar List has 3 ways "Day", "Week", "Month" to show Items and you need to change three Templates and they are.

  1. 2477: CalendarViewMonthItemTemplate
  2. 2539: CalendarViewDayItemTemplate
  3. 2617: CalendarViewWeekItemTemplate

    [Line Number: Template Name]


It is time to edit this template. Find A tag and put the title attribute with this codes and execute IISRESET.

[code:html;ln=off]

title="<%# System.Text.RegularExpressions.Regex.Replace(DataBinder.Eval(Container,"DataItem.Description",""), "<[^>]*>", string.Empty)%>"

[/code]


Now you can see the poping up Description value if you mouse over to any item that has Description value.



  # Demo poping up Description value

Custom Resource Provider for SharePoint Localization

 At first, I simply implemented 1. Custom Resource Provider which reads browser preference only but tricky customers wanted 2. Toggle Languages function. I used Cookie and Database for each user's localization data store and I described here how it's implemented.

* Click images below to see larger ones. 
 

1. Custom Resource Provder


2. SharePoint Localization to support a toggle function for two languages

Localization and Theme

1. SharePoint Localization and Limitation
What I have been exprienced on SharePoint Localizations are not practical for non-English users such as Variations and Team Sites. In my case, Korean customers want languages to be changed for their applications when they click buttons or by user's browser preference not like SharePoint Team Sites. As you might have noticed, replacing the asp menu to a custom one make them lose its original functions. Anyways they know this and liked it. I think adding a new layer that supports localization for asp menu is a better idea.

2. Custom Resource Provider
I have developed a custom resource provider and this supports browsers preference and toggling languages. To implement the function "Toggle Languages", I use Cookie and Database to save and retrieve user's language value.

3. SharePoint Theme
SharePoint Theme can be changed at  Home > Site Settings > Site Theme (_layouts/themeweb.aspx) but it affects all users.

4. Custom Control for user Theme enabled
Unfortunately, tricky Korean customers want individual themes such as clicking color buttons changes from current to new one and this doesn't affect other users. I created a Control to render custom css link for each user.


Here are sample images and click each image to see larger ones.
(Only menus are shown. Refer to the last image to see Page localzation)

 

SharePoint Page Localization
  # Localization Example ( can be toggled between English and Korean ) 

 


  # Individual Theme Demo

 

 

 

SharePoint Solutions

SharePoint Solutions

The Windows SharePoint Services solution framework provides a way to bundle all the components for extending Windows SharePoint Services in a new file that is called a solution file. A solution file has a .CAB-based format but a .WSP extension. A solution is a deployable, reusable package that can contain a set of Features, site definitions, and assemblies that apply to sites, and that you can enable or disable individually. You can use the solution file to deploy the contents of a Web Part package, including assemblies, class resources, .dwp files, and other package components. # This from msdn.

You can find out what the SharePoint solution is... and here are some resources.
  1. Solutions Overview
  2. Creating a Solution
  3. Deploying a Solution
  4. Upgrading a Solution
  5. Retracting a Solution
  6. Localizing a Solution
  7. Solution Schema

 

Many things to study are waiting if you want to use it but I'm going to demonstrate a simple way of installing, deploying, retracting and removing it using sample images. At first, you need to install it. I have the solution, "SPNote.SharePoint.ImprovedRTE.wsp" and the batch file which contains commands to install it and sample commands are below. This will install the solution and be appear at
"http://YourCentralAdmin/_admin/Solutions.aspx" and you can see its status as well. 
(Menu Breadcrumb: Central Administration > Operations > Solution Management)

 

Command of installing the solution (Download batch file)

@SET STSADM="C:\program files\common files\microsoft shared\web server extensions\12\bin\stsadm"

Echo Installing solution
%STSADM% -o addsolution -filename SPNote.SharePoint.ImprovedRTE.wsp
%STSADM% -o execadmsvcjobs

cscript C:\windows\system32\iisapp.vbs /a "SharePoint - 80" /r
REM IISRESET


If you deploy it, please execute IISRESET to refresh CONTROLTEMPLATES and the assemebly properly.

Images List
  1. Solution Management Page
  2. After installed
  3. Click Deploy Button
  4. Deployed to
  5. Deployed
  6. Demo using this solution



 

  # 1. Solution Management Page: currently no solutions here.




  # 2. After installed.




  # 3. Click Deploy Button




  # 4. Deployed to: Select which web application you want to deploy to
 



  # 5. Deployed finally: You can see its status


  # 6. Demo using this solution