&pgid();
 
 #contents
 
 第9回は[[第8回>Movable Type/第8回MTプラグイン勉強会 - registryのリファレンスを精読する(1)]]に続いて[[Movable Type Registry Reference>http://www.movabletype.org/documentation/developer/movable-type-registry-reference.html]]の精読の続きを行います。元のドキュメントが未完状態が多いため、各機能の具体的な指定方法といったことより、だいたいにどういったことができるのかといったことを確認することに主眼をおきます。
 
 ** 動画(Ustream) [#h078a3d2]
 
 勉強会の模様をアップしました。
 今回は確信をもっていえる内容に乏しいです(汗
 勉強会の中でも言っていますが、使い方がよくわからないものは、ちょっとづつ実際につかって試してみていこうと思います(ドキュメントに書かれていないものを使っていいのかという疑問は常にありますが^^;)
 
 #htmlinsert(study/mtplugin-9.html)
 
 Ustreamのチャンネルはこちら。
 http://www.ustream.tv/channel/mt%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E5%8B%89%E5%BC%B7%E4%BC%9A
 
 *** ご感想・ご質問など [#y7a8027b]
 
 ご感想、ご質問などあればお気軽にどうぞ。頂けるととても励みになります。
 
 #comment
 
 // ** 勉強会で解説したプログラムコードのダウンロード [#s88262b7]
 
 //&ref(Quote.zip);
 
 ** ネタ [#bf9718df]
 
 - [[Movable Type Registry Reference>http://www.movabletype.org/documentation/developer/movable-type-registry-reference.html]]
 
 ** 日時 [#g86debd5]
 
 - 2008/07/18(金) 10:30〜11:00
 
 ** Registry Keys [#yeca7a5f]
 
 registryで指定できるkeyとその解説。
 
 *** permissions [#n4bb33c6]
 
 - プラグインやコンポーネントからカスタムパーミッションを設定することができる
 - カスタムパーミッションは管理画面でログインしたユーザ、およびそのロールにあわせて管理画面のUIに作用する
 
 - サポートするプロパティは次の通り。
 
 :label|ユーザに見せるラベル名(パーミッション名)
 :group|当該パーミッションが表示されるパーミッショングループ。指定できる値は、sys_admin、blog_admin、auth_pub、blog_design、blog_upload、blog_comment。
 |パーミッショングループ項目名|値|h
 |ユーザプロフィールのシステム権限|sys_admin|
 |ロール編集の「管理」|blog_admin|
 |ロール編集の「作成と公開」|auth_pub|
 |ロール編集の「デザインする」|blog_design|
 |ロール編集の「アイテム」|blog_upload|
 |ロール編集の「コメント投稿」|blog_comment|
 :order|表示順
 
 
 ※ 追加したカスタムパーミッションは自動的に管理画面のUIで指定できるようにはならない。当分の間、指定できるようにするためにはTransformerコールバックを用意する必要がある。
 
 
 - カスタムパーミッションはパーミッションが作用するスコープを指定できる。指定できるスコープはブログスコープ(=ロールに対して設定可能)とシステムスコープ(=ユーザのシステム権限に対して設定可能)。スコープはカスタムパーミッション名(ID)のプレフィックスで指定する。ブログスコープの場合はblog.〜、システムスコープの場合はsystem.〜という名(ID)にする。
 
 例)
  $registry = {
      permissions => {
          'system.create_blog' => {
              label => trans("Create Blogs"),
              group => 'sys_admin',
              order => 100,
          },
      },
  };
 
 
 *** text_filters [#s1dd732b]
 
 - テキストフィルターはパブリッシュされる前にブログのテキストを変える手段を提供する。フィルターはエントリーに関連付けられて、自動的にコンテンツの変換が走る。また、テンプレートタグのアトリビュートに直接指定して起動させることもできる。
 - テキストフィルターのkeyはユニークでないといけない
 
 例)
  text_filters => {
      'my_filter' => {   # key
          label => 'Transform this Text',
          handler => 'MT::Foo::text_transform',
      },
  }
 
 - サポートするプロパティ
 :label|フィルターの表示名
 :handler|ハンドラー(フィルター処理の実体が記述された関数のリファレンス)
 
 ** In Progress((まだドキュメントが未完、書いてる途中という意味だと思います)) [#zb81f247]
 
 *** applications [#p4385198]
 
 - 開発者にMTのプラットフォーム(カスタムパーミッションはデータベースマネジメント、etc...)を利用した高度なUIを持つ独自アプリケーションを作成することができる。
 
 - 高度にカスタマイズされたUIを簡単に実現するために、開発者はRegistryでapplicationを定義できる。Registryに登録されたアプリケーションは以下を定義できる。
 -- 独自のlist filters(its own private set of list filters)
 -- 独自メニュー(管理画面上)
 -- web interfaceに紐付けた独自ハンドラ
 
 ''Application Properties''
 
 :handler|web interfaceに紐付けられてコールされるパッケージ名?(The package name that will process calls dispatched via the web interface.)
 :cgi-base|.cgiの拡張子なしのCGIファイル名。現在は使われていない。URL構築のために利用される。
 :list_actions|一時に実行されるアクションのリスト。何らかのアクション(Do Something)を指定できるのはentry, page, asset, commenter, author, role, groupに対して。
 :page_actions|A page action is a simple link that is surfaced in association with a given object.
 :menus|アプリケーションに追加するメニューのリスト
 :methods|アプリケーションに追加するモード(またはコマンド((というものがあるらしい)))とこれらのリクエストを処理するハンドラのリスト
 
 例)
  applications => {
      'ack' => {
          handler => 'MyApp::Ack',
          cgi_base => 'ack',
          list_actions => {
              'entry' => {
                  'do_something' => {
                      label      => "Batch Do Something",
                      order      => 100,
                      code       => \&do_something,
                      permission => 'edit_all_posts,publish_post',
                  },
              },
              menus => {
                  'foo' => {
                  label => "Create",
                  order => 100,
              },
              'foo:bar' => {
                  label         => "Do Something",
                  order         => 100,
                  mode          => 'hdlr_bar',
                  args          => { _type => 'entry' },
                  permission    => 'create_post',
                  requires_blog => 1,
              },
          },
          methods => sub { MT->app->core_methods() },
      },
  };
 
 ''How to Add a Mode to the CMS Component''
 
 - 管理画面に独自モードを追加するには、以下のようにする。
 
  $registry = {
      applications => {
          'cms' => {
              methods => {
                  myapp_new-mode => sub { // my handler // },
              },
          },
      },
  };,
 
 ※ コアや他のプラグイン等と重複を避けるために独自モード名の頭には固有の接頭辞をつけるようにすべき。
 
 ''CMS Application Specific Stuff''
 
 - applications => cms には独自のregistry keyがある。List Actions(ドキュメントなし)、Page Actions(ドキュメントなし)、Import Formats(一部ドキュメントあり。以下)。
 
 - あるアプリケーションからコンテンツを直接MTに簡単にimportするためにImport Formatsがある。
 
 例)
  import_formats => {
      'import_mt_format' => { # key
              label => 'Another system (Movable Type format)',
              code => \&MT::ImportExport::import,
              options => [ 'title_start', 'title_end', 'default_status' ],
              options_template => 'import_others.tmpl',
          },
      },
  },
 
 :label|ユーザに表示するラベル
 :code|importする際に実行するコードのリファレンス
 :options|The input keys for import type specific configuration options.
 :options_template|The file that contains the HTML and template code for rendering the custom configuration options for the import type.
 
 *** callbacks [#z9dcb2f4]
 ドキュメントなし
 
 *** tasks [#zba8fba9]
 
 *** junk_filters [#fff874f9]
 ドキュメントなし
 
 *** list_filters [#g274d5a1]
 ドキュメントなし
 
 一覧の絞込み(フィルタ)の定義か可能ということだと思います。
 
 例)
  entry => {
      published => {
          label   => 'Published entries',
          order   => 100,
          handler => sub {
              my ( $terms, $args ) = @_;
              $terms->{status} = 2;
          },
      },
      received_comments_in_last_7_days => {
          label   => 'Entries with comments in the last 7 days',
          order   => 500,
          handler => sub {
              my ( $terms, $args ) = @_;
              my $ts = time - 10 * 24 * 60 * 60;
              $ts = MT::Util::epoch2ts( MT->app->blog, $ts );
              $args->{join} = MT::Comment->join_on(
                  'entry_id',
                  { created_on => [ $ts,       undef ], },
                  { range_incl => { created_on => 1 }, }
              );
              $args->{sort}      = \'comment_created_on';
              $args->{direction} = 'descend';
          },
      },
  },
 
 *** upgrade_functions [#m0a81041]
 ドキュメントなし
 
 独自のアップグレード処理を定義できる??
 
  upgrade_functions => {
      'core_create_placements' => {
          version_limit => 2.0,
          priority => 9.1,
          updater => {
              type => 'entry',
              label => 'Creating entry category placements...',
              condition => sub { $_[0]->category_id },
              code => sub {
                  require MT::Placement;
                  my $entry = shift;
                  my $existing = MT::Placement->load({ entry_id => $entry->id,
                      category_id => $entry->category_id });
                  if (!$existing) {
                      my $place = MT::Placement->new;
                      $place->entry_id($entry->id);
                      $place->blog_id($entry->blog_id);
                      $place->category_id($entry->category_id);
                      $place->is_primary(1);
                      $place->save;
                  }
                  $entry->category_id(0);
              },
          },
      },    
  }
 
 *** tags [#sa0f69da]
 ドキュメントなし
 
 独自テンプレートタグ、モディファイア(=global filter)の定義
 
  tags => {
      block => {
          TagNameFoo => &foo_handler,
      },
      function => {
          TagNameFoo => &foo_handler,
      },
      modifier => { # attribute only, not a tag name - this is for global filters
          TagNameFoo => &foo_handler,
      },  
  }
 
 *** archive_types [#i58a3791]
 
 - 独自のアーカイブタイプを定義できる。
 - 独自アーカイブタイプのkey(archive_type)の値はArchiveTypeオブジェクトのnameに一致させる
 
 ''Archive Type Properties''
 
 :name|アーカイブ名(key)
 :archive_label|アーカイブの表示名
 :archive_file|TODO
 :archive_title|TODO
 :date_range|TODO
 :archive_group_iter|TODO
 :archive_group_entries|TODO
 :dynamic_template|ダイナミックパブリッシング用のfile path/pattern
 :default_archive_templates|このアーカイブのdefault file/path structure
 :dynamic_support|ダイナミックパブリッシングをサポートするかどうか。1 or 0で指定。
 :date_based|アーカイブがエントリーのdateをつかってページわけ(paginated)されるかどうか。1 or 0で指定。
 
 例)
  archive_types => {
      'Weekly' =>
          ArchiveType( name => 'Weekly',
              archive_label => \&weekly_archive_label,
              archive_file => \&weekly_archive_file,
              archive_title => \&weekly_archive_title,
              date_range => \&weekly_date_range,
              archive_group_iter => \&weekly_group_iter,
              archive_group_entries => \&weekly_group_entries,
              dynamic_template => 'archives/week/<$MTArchiveDate format="%Y%m%d"$>',
              default_archive_templates => [
                  ArchiveFileTemplate( label => MT->translate('yyyy/mm/day-week/index.html'),
                      template => '%y/%m/%d-week/%i', default => 1 ),
                  ],
              dynamic_support => 1,
              date_based => 1,
          ),
  }
 
 *** commenter_authenticators [#e87b79a8]
 ドキュメントなし
 
 コメントの独自の認証を定義できる??
 
 例)
  commenter_authenticators => {
      'OpenID' => {
          class => 'MT::Auth::OpenID',
          label => 'OpenID',
          login_form => <<OpenID,
  <form method="post" action="<mt:var name="script_url">">
  <input type="hidden" name="__mode" value="login_external" />
  <input type="hidden" name="blog_id" value="<mt:var name="blog_id">" />
  <input type="hidden" name="entry_id" value="<mt:var name="entry_id">" />
  <input type="hidden" name="static" value="<mt:var name="static" escape="html">" />
  <fieldset>
  <mtapp:setting
      id="openid_display"
      label="<__trans phrase="OpenID URL">">
  <input type="hidden" name="key" value="OpenID" />
  <input name="openid_url" />
  </mtapp:setting>
  <input type="submit" name="submit" value="<__trans phrase="Sign In">" />
  </fieldset>
  </form>
  OpenID
          login_form_params => \&_commenter_auth_params,
      },
  }
 
 *** captcha_providers [#u58e7c8a]
 ドキュメントなし
 
 キャプチャを定義できる?
 
 例)
  captcha_providers => {
      'mt_default' => {
          label => 'Movable Type default',
          class => 'MT::Util::Captcha',
      }
  }
 
 *** default_templates [#r27de166]
 ドキュメントなし((予測すらできず^^;))
 
 ** 次回予定 [#p808950f]
 次回はMT::App、MT::App::CMSのリファレンスの精読を予定します。
 
 
 #blikifooter(進地);
 
 
 tag: [[Movable Type>tag/Movable Type]]、[[MT>tag/MT]]、[[MT>tag/MT::Bootstrap]]、[[MTPlugin>tag/MTPlugin]]、[[勉強会>tag/勉強会]]、[[A-Form>tag/A-Form]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら