MT5で選択できるカテゴリを一つだけにする方法
id:tenmillionさん
次の質問に関してですが、MT5で選択できるカテゴリを一つにする方法です。
http://q.hatena.ne.jp/1284654044
なお、チェック自体は複数つける事ができますので、選択中のカテゴリが分かりやすいように、チェックされたカテゴリは、カテゴリ選択リストの下にすべてリスト表示されるようになっています。*1
ただし、一番最後にチェックを付けたカテゴリが有効になるようにしたので、複数選択したまま「公開」または「更新」を実行しても、最後にチェックを付けたカテゴリだけが指定されます。
他の部分の動作になるべく影響を与えないような仕様にしたつもりです。
それでは以下に実装手順を記載します。
まず、チェックボックスからラジオボタンに変更します。
・「tmpl/cms/include/category_selector.tmpl」の12行目に次の記述があります。
<input type="<mt:if name="object_type" eq="page">radio<mt:else>checkbox</mt:if>" name="<mt:if name="object_type" eq="entry">add_</mt:if>category_id<mt:if name="object_type" eq="entry">_[#= item.id #]</mt:if>" class="add-category-checkbox" <mt:if name="category_is_selected">checked="checked"</mt:if> /> [#|h item.label #]
上記を次のように変更します。(※回答とは若干違います。)
<input type="<mt:if name="object_type" like="(page|entry)">radio<mt:else>checkbox</mt:if>" name="<mt:if name="object_type" eq="entry">add_</mt:if>category_id<mt:if name="object_type" eq="entry">_[#= item.id #]</mt:if>" class="add-category-checkbox" <mt:if name="category_is_selected">checked="checked"</mt:if> /> [#|h item.label #]
次に「tmpl/cms/edit_entry.tmpl」のコードを次のように変更します。
※変更点は複数個所ありますので纏めて示します。
※「edit_entry.tmpl(MT5.01デフォルト)」の226行目(※「MT.App.objectType = '
MT.App.objectType = '<mt:var name="object_type" escape="js">'; // ここが227行目になります。次からコピーしてください。 function catChange( cnum ){ var cnum; var catId = document.getElementById("category-ids"); var slct = cnum; catId.value = slct; } Template.templates.categoryList = '<mt:section encode_js="1"> [# var cnum; #] [# if ( !items.length ) { #] <span class="disabled">[#|h trans("None selected") #]</span> [#* return #] [# } #] [# if ( items.length == 1) { #] [# var cnum = items[ 0 ]; #] [# catChange( cnum ); #] [# } #] [# if ( items.length > 1 ) { #] <span class="disabled">[#|h trans("Two or more were selected") #]</span> [# var len = items.length - 1; #] [# var cnum = items[ len ]; #] [# catChange( cnum ); #] [# } #] <ul class="<$mt:var name="container_type" lower_case="1"$>-list"> [# var map = {}; #] [# for ( var i = 0; i < items.length; i++ ) { #] [# if ( items[ i ] == 0 && i == 0 ) { #] [#-- special case, no primary selected, but has secondaries --#] [# continue #] [# } #] [# var cat = cache.getItem( "cat:"+items[ i ] ); #] [# if ( !cat ) continue; #] [# var label; #] [# if ( cat.path.length ) { label = []; for ( var j = 0; j < cat.path.length; j++ ) { var c = cache.getItem( "cat:"+cat.path[ j ] ); if ( c ) label.push( <mt:if name="object_type" ne="page">c.label<mt:else>c.basename</mt:if> ); } label.push( <mt:if name="object_type" ne="page">cat.label<mt:else>cat.basename</mt:if> ); for ( var j = 0; j < label.length; j++ ) label[ j ] = context.f.h( label[ j ] ); label = label.join( <mt:if name="object_type" ne="page">' » '<mt:else>''</mt:if> ); } else { label = context.f.h( <mt:if name="object_type" ne="page">cat.label<mt:else>cat.basename</mt:if> ); } #] <mt:if name="object_type" ne="page"> [# if ( i == items.length - 1 ) { #] // 上記の行までコピーします。(※以下は箇所が判別し易いように記述しています。) <li class="primary" mt:focus-hover="1" mt:id="[#= cat.id #]"><strong>[#= label #]</strong><a href="javascript:void(0);" mt:command="remove" class="delete" title="[#|h trans("Remove") #]"> <span>[#|h trans("Remove") #]</span></a></li> [# } else { #]
最後に言語ファイル(「mt-static/mt_ja.js」)を変更します。
※記述は回答したものと同じですので、回答を参照してください。
上記のような感じで実装できましたのでお試しください。
*1:リスト表示はデフォルトと同じ動作ですが、有効な(※最後に選択した)カテゴリが太字で表示されるように変更しています。