Movable Typeのテンプレートでテンプレートの識別子の追加

らら
らら

はじめに

Movable Typeでテンプレート構築時・・毎回、インデックステンプレートのテンプレートに識別子を設定するのに・・

毎回・・テーマエクスポートして・・落とした、theme.yamlと、templates内のファイル名を変更していたが・・・・

最近・・・Movable Type Premiumには。。ついているじゃないですか・・・・

まぁ。この機能はじめの構築時だけなので・・・常時いるかといえば・・・お客さんに変更されても・・動作しないなんて・・・

コードはっく。

lib内をidentifierでgrep・・・

下記がそれぽい。。

lib\MT\CMS\Template.pm

MT::DefaultTemplates->templatesで読んでいて・・

引数用の変数 $param->{index_identifiers}に値をいれている。。

最終にわかったんだけど・・DefaultTemplatesはthemesを当てた時の古い状態・・

これだと。管理画面にテンプレートに識別子つけても・・再度。テーマエクスポートして・・・再割り当てみたいな・・・感じ

なので・・index_identifiersをMT::Template->loadでSQLから読みだして再設定みたいな感じで・・・いけそう?

同じく・・tmpl内をidentifierでgrep・・・

admin2023\cms\edit_template.tmpl

cms\edit_template.tmpl

これでフックできるところを何となく把握・・・

コード内にはフックポイントは、良さげなとこになさそうで。

既存のhtmlソースを正規表現するしかなさそう・・この辺は、CS-CARTとかでもやってるし・・

これだと、テンプレートが変更されたとき、動かないし

ある程度正規表現 .+?あたりで改行も含めて置換ぐらいしかできなさそう

ディレクトリ構造


└─TemplateIdentifier
    │  config.yaml
    │  
    └─lib
        └─TemplateIdentifier
                CMS.pm

config.yaml

フックポイントは分かったので・・

cms_post_saveあたりは、よく出てくるやつなので・・

CMS::templateは引数のフックと、テンプレート編集時のフックの記載で・・

utf8で保存


id: TemplateIdentifier
key: MT::Plugin::TemplateIdentifier
name: TemplateIdentifier
version: 0.1
author_name: 電脳職人村
doc_link: http://www.omakase.net
author_link: http://www.omakase.net
description: <__TRANS phrase="TemplateIdentifier.">
l10n_lexicon:
    ja:
        IdentifierTemplateName: テンプレートの識別子
        TemplateIdentifier.: テンプレート編集画面でテンプレートに識別子を設定できるようにします。
callbacks:
    cms_post_save.template: $TemplateIdentifier::TemplateIdentifier::CMS::cms_post_save_template
    MT::App::CMS::template_param.edit_template: $TemplateIdentifier::TemplateIdentifier::CMS::template_param
    MT::App::CMS::template_source.edit_template: $TemplateIdentifier::TemplateIdentifier::CMS::template_source_add_identifier

lib\TemplateIdentifier\CMS.pm

ブログIDとテンプレートIDで特定の処理をしていく感じで

入力初期値は、ブログIDとテンプレートIDでテンプレートリストは、ブログIDを指定する感じで

インデックステンプレートだけ、テンプレートの種類と同期しないといけないので、それ以外のコンテンツタイプテンプレートとかは、テンプレートに識別子の入力だけで

デバックで下記とか


SELECT * FROM `mt_template` where template_blog_id =2;

使いそうな項目は下記・・


template_id
template_blog_id
template_name
template_identifier
template_type

perl正規表現の$&は一致した全部です。

$tagetgetは手動で正規表現の\とか危ない記号はエスケープです。

「ファイルへのリンク」のタグを探して・・テンプレートの識別子の入力用のタグを追加しています。

identifier_inputは、テンプレートの識別子の入力名です。

index_identifiersは、既存のシステムで使用している、テンプレートの種類のセレクトBOX用の引数です。

utf8で保存


package TemplateIdentifier::CMS;
use strict;
use warnings;
use Data::Dumper;
sub cms_post_save_template {
	my ($cb, $app, $obj, $orig) = @_;
	my $identifier = $app->param('identifier_input');
	$obj->identifier($identifier) if $identifier;
	$obj->save;
}
sub template_param {
	my ($cb, $app, $param, $tmpl) = @_;
	my $blog_id	= $param->{blog_id} || 0;
	my $id		= $app->param('id');
	#入力用のデフォルト値をmt_templateから探す
	$param->{'identifier_input'} = '';
	if($id) {
		my @tmpls = MT::Template->load({ blog_id => $blog_id });
		foreach my $tmpl (@tmpls) {
			if($tmpl->id == $id) {
				$param->{'identifier_input'} =	$tmpl->identifier;
			}
		}
	}
	#MTでは、themesフォルダーの内容でテンプレートの種類のリストをするので
	#SQL内のmt_templateをみて出力する
	my @tmpls = MT::Template->load({ blog_id => $blog_id });
	my @tmpl_ids;
	foreach my $tmpl (@tmpls) {
		if($tmpl->type eq 'index') {
			push @tmpl_ids,
			{
			label    => $tmpl->name,
			key      => $tmpl->identifier,
			selected => $tmpl->identifier eq ( ( $param->{'identifier_input'} ? $param->{'identifier_input'} : undef ) || '' ),
			};
		}
	}
	$param->{index_identifiers} = \@tmpl_ids;
	1;
}
sub template_source_add_identifier {
	my ($cb, $app, $template) = @_;
	my $plugin = MT->component('TemplateIdentifier');
	my $inputname = $plugin->translate('IdentifierTemplateName');
	#cms\edit_template.tmplに追加用の mt:varが無いので・・強制でテンプレートの部分一致で置換する・・
	#idは1つしか存在しない前提・・・テンプレートでmtapp:settingとidの間に追加されたら動作しないので注意・・
	#ファイルへのリンクに上につくように・・・
	my $tagetget = <<__HTML__;
      <mtapp:setting
         id=\"linked_file\"
         (.+?)
      <\/mtapp:setting>
__HTML__
	#ver 7のテンプレートクラスのタイプで・・・
    my $add_input = <<__HTML__;
      <mtapp:setting
         id="identifier_input"
         label="$inputname"
         label_for="linked_file"
         label_class="top-label">
        <input type="text" name="identifier_input" id="identifier_input" class="form-control text" value="<mt:var name="identifier_input" escape="html">" maxlength="255" mt:watch-change="1" />
      </mtapp:setting>
__HTML__
		# 正規表現で置換・・
		$$template =~ s/$tagetget/$add_input$&/s;
}
1;

さいごに

筆者はテンプレート構築で使って、あとはプラグインアンインストールかな・・

あいかわらずで。。サポートしていませんから。。。うごかんぞぉーとか、クレーム入れないで・・w

関連記事