2024-01-25
PowerCMS から PowerCMS X への移行を検討する場合、PowerCMS 5 などで使われる「フィールドブロック」の入力データをどうするか?という問題が発生すると思います。本記事では、フィールドブロックの入力データを ComponentBlocks のデータに変換する PHP 製データ移行ツールの開発例をご紹介いたします。フィールドブロックは、FieldBlock-plugin.zip に含まれる sample-fieldblock.csv をインポートして使用したものと仮定します。
なお、本記事で紹介するフィールドブロックは PowerCMS 6 で追加されたフィールドブロックビルダーとは別の機能ですのでご注意ください。
現在開発段階ですが、以下のような処理を実装しました。
その結果、以下のようなデータを得ることができます。
array(6) {
["smpltitle:1"]=>
array(1) {
["title"]=>
string(27) "見出しテキストです"
}
["smplrt:1"]=>
array(1) {
["text"]=>
string(96) "<p>リッチテキストです。<strong>太字です。</strong></p>
<p>改行します。</p>"
}
["smpltext:1"]=>
array(1) {
["text"]=>
string(45) "テキストエリアのテキストです。"
}
["smpllink:1"]=>
array(2) {
["text"]=>
string(21) "アルファサード"
["url"]=>
string(20) "https://alfasado.net"
}
["smplmulti:1"]=>
array(4) {
["image"]=>
string(29) "__snippet_upload_asset__99088"
["select"]=>
string(3) "猫"
["text1"]=>
string(48) "複合型のテキストフィールドです。"
["text2"]=>
string(42) "複合型のテキストエリアです。"
}
["smplimg:1"]=>
array(2) {
["image1"]=>
string(29) "__snippet_upload_asset__99088"
["image2"]=>
string(0) ""
}
["フィールドブロックのベースネーム:順序"]=>
array(1) {
["入力フィールドのkeyの値"]=>
string(9) "入力値"
}
}
FieldBlock クラスで処理したデータを基に、フィールドブロックの「[サンプル] 見出し」「[サンプル] リッチテキスト」を ComponentBlocks のデータに変換してみます。データの構造はComponentBlocksプラグインのドキュメントページでも解説しています。
事前に ComponentBlocks でデータ入力を行って「保存されるデータ」の内容を確認してから PHP を書くとゴールが見えやすいと思います。テキストデータ以外のアセット等は ID が変化するため、移行元と移行先での ID 対照表のようなものを作成する必要があります。フィールドブロックも ComponentBlocks も自在にフィールドが定義できるので、各プロジェクトの状況に応じたデータ移行ツールを頑張って作る必要があります。
<?php
function generateId()
{
$str = 'abcdefghijklmnopqrstuvwxyz0123456789';
return $rand_str = substr(str_shuffle(str_repeat($str, 10)), 0, 8);
}
// PowerCMSパスの設定
$powerCMSConfigFile = '/var/www/powercms5/app/mt-config.cgi';
$powerCMSPHPPath = '/var/www/powercms5/app/php';
// 記事(ページ)IDとカスタムフィールドのベースネームを設定
$entryId = 1707;
$customFieldBaseName = 'e_fb_';
// データベースからフィールドブロックのデータを取得
require_once 'FieldBlock.php';
$fieldBlock = new PCMSXMigrator\FieldBlock($powerCMSConfigFile, $powerCMSPHPPath);
$fieldData = $fieldBlock->get($customFieldBaseName, $entryId);
// var_dump($fieldData); // NOTE: ここでフィールドブロックの保存データを確認できる
// 結果を格納する変数
$componentBlocksData = [];
// フィールドブロックをループして入力データを変換
// ここに変換ルールを書いていきます
foreach ($fieldData as $fieldTypeWithOrder => $fieldValues) {
$fieldType = preg_replace('/\:\d+$/', '', $fieldTypeWithOrder);
if (strpos($fieldType, 'smpltitle') === 0) {
// フィールドブロックの「[サンプル] 見出し」をComponentBlocksの「Headingコンポーネント」のデータに変換
$componentBlocksData[] = [
'id' => generateId(),
'type' => 'Heading',
'text' => $fieldValues['title'],
'level' => 2,
];
} elseif (strpos($fieldType, 'smplrt') === 0) {
// フィールドブロックの「[サンプル] リッチテキスト」をComponentBlocksの「Textコンポーネント」のデータに変換
$componentBlocksData[] = [
'id' => generateId(),
'type' => 'Text',
'text' => $fieldValues['text'],
];
}
}
// JSONの出力
echo json_encode($componentBlocksData, JSON_UNESCAPED_UNICODE);
上記コードをコマンドラインで実行することにより、下記のような ComponentBlocks 向けのデータを得ることができます。
[{"id":"mw8wgul9","type":"Heading","text":"見出しテキストです","level":2},{"id":"1fvrbwcp","type":"Text","text":"<p>リッチテキストです。<strong>太字です。<\/strong><\/p>\r\n<p>改行します。<\/p>"}]
これを管理画面で表示すると以下のようになりました。
カテゴリー:技術情報
投稿者:安倍
2024-01-24
このたびの令和6年能登半島地震によりお亡くなりになられた方々に謹んでお悔やみ申し上げます。被災された皆さまに心からお見舞い申し上げます。
また、被災者救済と被災地復興支援のために尽力されている皆さまに深く敬意を表します。
2024年1月1日に発生した能登半島地震、元々1995年の阪神淡路大震災(兵庫県南部地震)由来の「やさしい日本語」はどう活用されたのか。SNSやメディアの情報からまとめてみました。
やさしい日本語が活用された結果が、実際にどのくらい役に立ったのかについては、今後検証が必要です。この記事はあくまでも、どのような取り組みがあり、それがどのように行われたのかを外から見て把握できる範囲でまとめたものです。
『ここは大丈夫だ』と思うのは危険です。情報を待って逃げ遅れないで下さい!」
「可能な限り高いところへ逃げること!」
「今すぐ避難!今すぐ避難!東日本大震災を思い出して下さい!」
「一度逃げたら途中で引き返さないでください!異例とも言えるアナウンスやNHKアナの「絶叫」は、過去の震災報道の検証と反省が活かされたものだった。
「絶叫=やさしい日本語」ではありませんが、曖昧な言葉を避け「はっきり、最後まで、みじかく言う」という、やさしい日本語の考え方と共通すると言えましょう。
この情報によって、外国人のみではなく、日本人にも危機感が共有できたのではないでしょうか。
このアナウンスは、咄嗟に出たものではありません。過去の経験から学び、これからの報道を改善しようと考えた「平時の取り組み」があったからこそ生まれました。以下のNHK取材ノートの記事には「命を守る呼びかけ」というハンドブックと、訓練について書かれています。
命を守る呼びかけのポイント
- 確実に伝わること
- 行動を促すこと
- 予断を与えないこと
NHKからの呼びかけです。午後4時13分ですからわずか3分後です。速やかに発信されたことがわかります。
先ほどの地震で津波警報が出ました。
すぐに逃げて下さい
すぐに逃げて下さい
すぐに逃げてください
石川県内で最大震度7を観測した能登半島地震で、神戸市のテレビ局「サンテレビ」が、多言語で津波の避難を呼びかけるVTRを流した。
そこで考えついたのが、放送体制が整うまでの間に、事前に収録したVTRを流すことだった。そして、より多くの人に伝えるため、多言語に。
やさしい日本語は決して万能ではなく、多言語での情報伝達も必要とされます。機械翻訳では正確性が担保できず、災害発生時にすぐに対応するのも難しい。事前に準備しておくことで実現できたと言えます。NHKと同じく、「平時の取り組み」によって実現されました。
政府広報オンライン(政府広報室)アカウントは大津波警報をやさしい日本語で発信しました。
SNSサービスの多くは HTMLなどによってルビ(ふりがな)をつけることができません。そこで、漢字かな混じりのテキストにルビを振ったものを画像化して投稿に添付しています。SNSへの投稿にはルビは付与できないため、ひらがなのみ、または括弧付きふりがなをつけて投稿しているケースが見られますが、以下の点に考慮が必要です。
このようなことを考えると、機械翻訳機能などのある SNSサービスの場合、ふりがな付きのテキストは画像化して、本文には読み方の難しい漢字以外は漢字を使い、機械翻訳しやすい、読みやすい文章を投稿するのが良いように思います。
また、画像には ALT(代替テキスト)が指定できます。視覚障害者のためにも、画像の ALT指定をする必要があります。
津波が来ます。石川県などに強い地震。逃げてください。石川県、新潟県、富山県、福井県の海の近くにいる人は、海から遠いところ、高いところに逃げてください。
私たちが運用する、やさしい日本語のメディア「やさにちウォッチ」でもこの情報を発信しました。
その時、私は奈良県の実家に帰省していました。このポストはiPhoneでPowerCMS Xの管理画面を開いて入力し、首相官邸のXのポストのURLのリンクを添えて3分程度で投稿しました。
SNSへのふりがな付き文字画像付き投稿はPowerCMS Xに予め組み込まれており、自動でのポストです。再投稿をあわせリポスト数は50を超え、ポストへのインプレッションは1万近くになりました。
災害発生時は情報発信する側も、住民の命を守るための自治体の職員も被災者です。また、1月1日に発生したということで、メディアの人たちもすぐに情報発信ができる状態にないことも考えられます。これも、平時に準備していたこと、「スマホから投稿できること」「ふりがな付きの画像を自動生成して添付できること」「SNSと自動連携の設定がされていたこと」が役にたちました。
また、普段からやさしい日本語について学び、情報発信を続けてきたことによってできたことだと思っています。
ここで私が考えたことは以下です。
「来ます」と断言するのは社会的に責任のあるメディアの立場では難しいかもしれません。これも、平時から決めておかなければ咄嗟の判断ができません。
1月2日から7日にかけて、余震の速報にあわせてリンク先を変えながら発信。やさしい日本語に加えて、英訳(AI翻訳)したテキストを添えて投稿しました。
また、NHKの「災害時 障害者のためのサイト」(すべてのテキストにふりがな付きのサイト)を紹介したりしました。
この、余震を「大きな地震のあとから続く地震」と言い換えるのは、「減災のためのやさしい日本語」にそのような言い換えの例があるからです。
弘前大学人文社会科学部社会言語学研究室(佐藤先生)のリソースがネットでの公開を終了してしまったことはとても残念ですが、やさしい日本語がもともと減災の観点から考えられていることから避難所や災害に関する情報の言い換えの例などはすでに考えられています。
そのようなリソースに普段から当たっておくことが、このような事態の時の情報発信の手助けになることは間違いありません。
翌日以降、と書きましたが、このサイトは震災前から準備されていたもののようです。
大災害が発生した時、支援を要する 障害者や 高齢者への情報を掲載することを目的にしています。
防災や減災のためのヒントを障害等別にまとめています
すべてのテキストにふりがなが付いています。下層のページの最終更新日から、震災前に用意されていたことがわかります。すでに用意していたものへのリンクを貼って、情報が流れてしまうSNSなどのメディアで再度拡散させる、という方法も必要な情報を迅速に伝えることができます。
尚、前述の「政府広報オンライン」では、「住まいが被害を受けたとき 最初にすること」「被災地を応援したい方へ 災害ボランティア活動の始め方」といった、2020年に公開した記事をトップページの上部に配置しています(やさしい日本語に変換したり、ふりがなをつけることができます)。
トップに表示された過去の記事「住まいが被害を受けたとき 最初にすること」(やさしい日本語ボタンで変換後)
インバウンド(訪日旅行者)向けの情報提供Webメディアである「MATCHA(株式会社MATCHA)」がまとめている能登半島地震、災害情報のまとめ、リンク集、役立つアプリの紹介などをまとめたページ。数少ない民間のメディアの事例の一つです。
やさしい日本語で、ふりがなをつけるだけでなく、用語の英語訳などを掲載するなどの工夫もしています。
※MATCHAでは平時から「やさしい日本語」でインバウンドの情報を発信しています。
元毎日新聞の野澤和弘氏が理事長を務める 一般社団法人スローコミュニケーションが運営する「わかりやすいニュース」は、主に知的障害者に向けた情報の発信を継続的に行なっています。
被災者への直接の呼びかけではなく、被災地で障害者に伝わる情報伝達のしかたをわかりやすく伝えています。
<わかりやすくするポイントの例>
掲示するときは、情報を分野ごとに分ける
大きめの字で書く、漢字には ふりがなをつける
耳で聞いて わかりやすい言葉を使う
(たとえば、
「配布」→「配る」
「ご遠慮ください」→「しないでください」)
マークやイラストなども使う
水のいらないトイレの作り方、という、災害地に避難所などで役に立つ情報を取り上げています。
NHKの「NEWS WEB EASY」は記者OBと日本語教師が編集、1日5記事程度を配信しています。
被災時のテーマの選択の仕方はもちろんですが(他にも、エコノミークラス症候群について取り上げたり)、過去の調査では、外国人だけでなく、子供(中学生・小学生)への情報伝達に役に立つことが調査結果としてわかっています。
情報(じょうほう)がなくて困(こま)っている障害者(しょうがいしゃ)や日本語(にほんご)が母語(ぼご)でなはいみなさんへ、情報(じょうほう)がまとまっているウェブサイトを紹介(しょうかい)します。
日本に住む外国人だけではなく、障害者を視野に入れた情報発信にやさしい日本語を活用する動きが見られたことも今回の震災時の情報発信の特徴的な出来事かもしれません。
私たちも「やさにちウォッチ」で実践している「ふりがな付き文章を画像化したものの活用」も、少しづつ広がりを見せているようです。NHKや出入力管理庁などがこのような投稿を行っていました。
「報道も変わってるんだなと思った」Xで反響
1日に発生した「令和6年能登半島地震」の避難呼びかけでも、この「やさしい日本語」がさまざまな場所で使用されていました。X(ツイッター)では、実際に活用される「やさしい日本語」に注目が集まっています。
午後3時追記 : 日本経済新聞に以下の記事が出ていました。
グローバル化は海外だけではない。内なるグローバル化で、日本は今や多言語・多文化社会になっていることを忘れないでいたい。
災害発生時の「やさしい日本語」の活用は一定浸透してきたように思いますが、実際にそれがどの程度役に立ったかについては検証が必要です。ただ、まだ災害が収束したわけではなく、まだまだ被災後の情報伝達に課題があることに変わりはありません。
災害時におけるやさしい日本語の活用は、その誕生である阪神淡路大震災から30年近く経過して、ある程度は浸透したように見えます。ただ、このレポートからもわかる通り、多くは公的機関やNHKからの発信が目立ち、民間の Webメディアなどで活用している事例はまだまだなのが現状です。
また、ひとくちに「やさしい日本語」と言っても、普段からやさしい日本語を意識したコミュニケーションをとっていない人にとってはその「匙加減」がわからず、かえって「わかりにくい日本語」になってしまっている例も見受けられました。
わかち書きをすることで、多少改善されるものの、音声読み上げ(スクリーンリーダー)との相性が悪い、検索との相性が悪い、機械翻訳の精度が悪くなるなどの問題もあります。
漢字の後ろに括弧書きでひらがなを追加した場合も、ひらがなだけのテキストと同様の課題があるでしょう。今後は AI多言語翻訳との組み合わせなども活用して情報を伝えていくことが期待されます。
サンテレビの「多言語での映像配信」、NHKの「災害時 障害者のためのサイト」などの事例から学べるのは 「メディアとしての対応も、いざ、災害が発生してからでは、遅い」ということでしょう。平時にいかに準備をしていくか、がとても大切であることがわかります。
また、阪神淡路大震災の時代と異なり、災害時の情報発信に SNSの活用は欠かせません。ただでさえ、SNS上でのデマ、ノイズが問題になっている現状で、日本語が母語ではない人にとって、正しく、わかりやすく情報を伝えるためのさらなる工夫の検討が望まれます。
最後に、私たちの取り組みを紹介します。
アルファサード株式会社では、避難所などでの情報伝達や SNS、Webなどを通じたやさしい日本語、多言語での情報発信の手助けができればと考え、やさしい日本語エディタに多言語翻訳機能を追加したオンラインエディタ(伝えるウェブ翻訳支援エディタ)を無償で提供することにしました。
やさしい日本語、ふりがな、わかち書きだけでなく、70以上のAI多言語翻訳に対応しています。
作成した文章は「画像」「PDF」「Microsoft Word」「MP3(音声)」として書き出すことができます。
無料で使うことができ、提供期間は今は決めていません。より多くの人たちに情報が伝わるよう、ぜひご活用をお願いします。
カテゴリー:コラム・その他
投稿者:Junnama Noda
2024-01-05
記事などのデータを JSON形式で出力・取得したいというケースは多いと思います。PowerCMS Xには RESTful APIがあり、JSON形式でデータの取得、オブジェクトの作成、検索などができるのですが、静的ファイルにしたいというケースもあると思います。
ビュー(テンプレート)を作成することで実現できます。記事モデルを例にして紹介します。
記事のコンテキストで、各タグを使って組み立てる方法です。数字などではない文字列などの情報には escape="json"を追加します。
<mt:setvarblock name="json">
{
"id": <mt:entryid>,
"title" : "<mt:entrytitle escape="json">",
"text" : "<mt:entrybody escape="json">",
"permalink" : "<mt:entrypermalink escape="json">",
"date":"<mt:entrydate escape="json">"
}
</mt:setvarblock>
<mt:var name="json">
escape="json" の代わりに escape="json_unescaped_unicode" とすると、マルチバイト Unicode 文字をそのままの形式で扱います。
<mt:setvarblock name="json">
{
"id": <mt:entryid>,
"title" : "<mt:entrytitle escape="json_unescaped_unicode">",
"text" : "<mt:entrybody escape="json_unescaped_unicode">",
"permalink" : "<mt:entrypermalink escape="json">",
"date":"<mt:entrydate escape="json">"
}
</mt:setvarblock>
<mt:var name="json">
sethashvarsを使うときは右辺に改行を含むことができないことに注意してください(以下の例では strip_linefeedsモディファイアで改行を削除しています)。
<mt:sethashvars name="json">
id=<mt:entryid>
title=<mt:entrytitle>
text=<mt:entrybody strip_linefeeds>
permalink=<mt:entrypermalink>
date=<mt:entrydate>
</mt:sethashvars>
<mt:var name="json" to_json>
改行を含めたいときは、以下のようにできます。
<mt:entryid setvar="entry_id">
<mt:entrytitle setvar="entry_title">
<mt:entrybody setvar="entry_body">
<mt:entrypermalink setvar="entry_permalink">
<mt:entrydate setvar="entry_date">
<mt:setvar name="json" key="id" value="$entry_id">
<mt:setvar name="json" key="title" value="$entry_title">
<mt:setvar name="json" key="permalink" value="$entry_permalink">
<mt:setvar name="json" key="text" value="$entry_body">
<mt:setvar name="json" key="date" value="$entry_date">
<mt:var name="json" to_json>
glue属性を使うことと、予約変数 __first__, __last__をうまく使うことがポイントです。
<mt:entries glue=",">
<mt:if name="__first__">
{"totalResult": <mt:var name="__total__">,
"items" : [
</mt:if>
{
"id": <mt:entryid>,
"title" : "<mt:entrytitle escape="json">",
"text" : "<mt:entrybody escape="json">",
"permalink" : "<mt:entrypermalink escape="json">",
"date":"<mt:entrydate escape="json">"
}
<mt:if name="__last__">
] }
</mt:if>
</mt:entries>
mt:objecttojsonタグを使うと、自動的に JSON形式に変換されます。出力形式は、RESTful API エンドポイント(get,listなど)で返却されるデータ形式となっています。
<mt:objecttojson>
取得するカラムを指定したいときは cols属性(カンマ区切りまたは配列)で指定が可能です。指定はRESTful APIが返却するキーで指定します。permalinkではなく「Permalink」であることに注意してください。
<mt:objecttojson cols="id,title,text,Permalink,published_on">
objecttojsonタグを使って記事リストを出力する例は以下のようになります。
<mt:entries glue=",">
<mt:if name="__first__">
{"totalResult": <mt:var name="__total__">,
"items" : [
</mt:if>
<mt:objecttojson cols="id,title,text,Permalink,published_on">
<mt:if name="__last__">
] }
</mt:if>
</mt:entries>
カテゴリー:テンプレート作成Tips | 技術情報 | サイト制作全般
投稿者:Junnama Noda