はじめに
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