반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함

Kurogo Tutorial 20 - Module Interaction -

2012. 6. 12. 18:08 | Posted by 솔웅


Module Interaction


많은 경우 데이터를 share 하고 모듈간에 링크를 걸고 하는 것은 아주 유용하게 사용됩니다. 인터페이스의 일관성을 유지하기 위해 convention 들이 만들어 졌습니다. 이 convention들은 아래와 같은 일들을 합니다.

  • 다른 모듈의 데이터 값을 근거로 특정 모듈로 링크를 걸거나 값을 formatting 함 (예. people 디렉토리의 값에서 맵 모듈로 링크 걸기 등)
  • 모듈의 모델 객체에 근거한 링크 생성과 value 포맷팅 (예. calendar event의 포매팅과 retrieval)
  • criteria에 근거한 다른 모듈의 data retrieval (used in the federated search feature)


만약 새 모듈을 만들거나 다양한 data source로부터 데이터를 포맷하기를 원한다면 오늘 다룰 내용을 자세히 읽어 보셔야 합니다.




Formatting Data from Existing Modules

다른 데이터(map locations, people)를 참조하는 하나의 데이터 소스(LDAP directory, calendaring system)에 있는 데이터를 가지고 있는 예는 아주 많습니다. 불행히도 이 두개의 시스템사이를 연결하는 strong link 는 없을 겁니다. 그 둘을 link 하려면 bridge를 사용해야 합니다.

다른 모듈의 데이터로 링크를 걸고 다른 모듈의 데이터를 보여주는 쿠로고의 built in 모듈은 2가지가 있습니다.(People, Calendar module) detail configuration의 module=xxx 파라미터는 다른 모듈로의 링크를 생성합니다. default로는 간단하게 디렉토리의 같은 value를 사용합니다. 그리고 filter 파라미터의 value를 사용해서 target 모듈의 search 페이지로 링크를 겁니다. 그러니까 맵 모듈로 링크를 건다면 아래와 같을 겁니다.

  • map/search?filter=value

이것은 많은 경우에 사용됩니다. 하지만 때때로 좀 더 특정 링크를 제공해야 할 때도 있습니다. 이를 구현하기 위한 과정은 아래와 같습니다.

  • target 모듈의 subclass를 생성한다. (i.e. map)

    • Create a file named SiteMapWebModule.php in SITE_DIR/app/modules/map안에 SiteMapWebModule.php파일을 생성한다. enclosing folder들을 사용해야 할 겁니다. 
    • 이 파일은 MapWebModule의 subclass이어야 함. 이것이 그냥 맵 모듈의 extension 이라면 다른 추가적인 프로퍼티를 포함할 필요는 없음
  • Implement a linkForValue($value, Module $callingModule, KurogoObject $otherValue=null) method in your subclass. This method will receive:

    • a value from the other system
    • a reference to the calling module (이것으로 여러분은 어떤 모듈이 call을 할 것인지 정할 수 있습니다. )
    • 옵션으로 모듈에 의해 underlying object가 제공됩니다. 그렇기 때문에 여러분은 response를 generate 할 때의 모든 value들을 고려해야 합니다.

이 메소드는 list item에 대한 해당 배열을 return 해야 합니다. 여기서 최소한 title 값을 include 해야합니다. 일반적으로 link를 include 하고 싶지 않다면 url 값을 include 해야합니다.


<?php

class SiteMapWebModule extends MapWebModule
{
  public function linkForValue($value, Module $callingModule, KurogoObject $otherValue=null) {

      switch ($callingModule->getID())
      {
          case 'people':
            //look at the location field to see which office they are from.
            //This assumes the relevant location is in the "location" field.
            $person = $otherValue;

            switch ($person->getField('location'))
            {
                case 'New York':
                    // New York office is first entry
                    return array(
                        'title'=>'New York Office',
                        'url'=>buildURLForModule($this->id, 'detail', array(
                                'featureindex'=>0,
                                'category'=>'group:0'
                            ))
                    );
                    break;

                case 'Boston':
                    // Boston office is the 2nd entry
                    return array(
                        'title'=>'Boston Office',
                        'url'=>buildURLForModule($this->id, 'detail', array(
                                'featureindex'=>0,
                                'category'=>'group:1'
                            ))
                    );
                    break;
                default:
                    // don't include link
                    return array(
                        'title'=>$value
                    );
            }
            break;
          default:
            //return the default implementation for other modules
            return parent::linkForValue($value, $callingModule, $otherValue);
      }
  }
}

Enabling interaction from new modules

새 모듈을 만드려면 full interaction을 가능하도록 하기 위해 몇개의 메소드들이 필요합니다.

  • searchItems($searchTerms, $limit=null, $options=null) - 이 메소드는 필터로서 searchTerms를 사용해서 KurogoObject  인터페이스를 confirm 하는 객체의 배열을 return 해야 합니다. 여러분의 implementation은 criteria를 사용해서 간단하게 검색하기 위해 필요한 메소드들을 call 해야 합니다. 여러분은 좀 더 structured queries를 사용하기 위해 옵션 배열들을 활용할 수 있습니다. federated search method의 디폴트 impementation을 활용한다면 ederatedSearch=>true를 포함해야 할 겁니다.
  • linkForItem(KurogoObject $object, $options=null) - This method should return an array suitable for a list item based on the object included. This would typically be an object that is returned from the searchItems method. An options array is included to permit further customization of the link. For examples, see the People, News, Calendar and Video modules. 이 메소드는 include 된 객체를 근거로 list item에 대한 해당 배열을 return 해야 합니다. 이것은 특히 searchItems 으로부터 return 된 객체가 됩니다. options array는 링크를 좀 더 customize 할 수 있도록 하기 위해 include  됩니다. 그 예로는 People, News, Calendar 그리고  Video module 들이 있습니다..


반응형

Comment