4ページ目   #ablogcms

a-blog cms のデータを簡単にサーバーから引っ越しするためのツールを作ってみた

これは a-blog cms Advent Calendar 2021 の 16日目の記事です。


a-blog cms で作られたサイトを引っ越しを依頼されたり、アップデートするのにテスト環境を作るのも引っ越しと言えるでしょう。そんな時に SSH が使えない、phpMyAdmin も使えないそんな経験もあったりします。

これまでインストールを簡単にするための「簡単セットアップsetup.php や、バージョンアップを簡単にするための「簡単アップデートupdate.php などを作ってきていますが、今回は簡単にバックアップをするための a-backup.php を作ってみました。

バックアップする対象

  • archives
  • archives_rev
  • media
  • private/config.system.yaml
  • sql/databaseName_yyyymmddhhmmss.sql
  • storage
  • themes/blog2020

ファイルとしては CMS からアップロードしたファイルが保存されている archives / archives_rev / media / storage と、config.system.yaml と利用しているテーマディレクトリの一式と、MySQL のエクスポートデータを SQL文のテキストで書き出したものが今回のバックアップの対象となります。

テーマが継承されている場合には、子テーマも対象となります。

用意したプログラム

GitHub Gist の kazumich のアカウントで公開している 300行程度の PHP のファイルになります。リンク先にアクセスして Download してください。

https://gist.github.com/kazumich/0c5ce6ed4e8366628842541ee9101b56

利用方法

ブラウザからファイルをダウンロードする設定と、サーバー上にファイルを作る設定の2つの利用方法を用意しました。サイト規模が小さければブラウザからファイルを落とせるかもしれないですが、長く運用されているようなサイトだとブラウザからのダウンロードできないこともあります。

ブラウザから対象ファイルをダウンロードする

一番簡単な方法としてファイルを config.server.php と同じ場所にアップロードして、ブラウザでアクセスするとデータベースのパスワードを聞かれる画面が表示されます。それで簡単に表示されているファイルなどがダウンロードできます。

対象ファイルを圧縮(ZIP)しサーバー内に保存する

ブラウザからダウンロードできなかった時や cron で定期的にバックアップを作りたい時などに利用します。1ファイルになりますので、FTPソフトなどでダウンロードするのも容易になります。

設定

1) 実行方法の設定

# pc  : ブラウザからPCに Zipファイルがダウンロードされます。
# server : サーバー上に Zipファイルを保存します。 5) を設定してください。

$zip_download = "pc"; # pc / server

2) パスワードチェック

# on  : ブラウザ上からパスワードを入力し実行します。(推奨)
# off : cron など画面表示させたくない時に設定ください。

$password_check = "on"; # on / off

3) バックアップテーマの設定

# テーマファイルをバックアップする際には指定してください。
# "site2020" と設定すると site2020 , lp@site2020 , sp@site2020 がバックアップされます。
# "site2020|blog2020" のように複数指定も可能です。

$useThemes = "blog2020";

4) コマンド パスの設定

$mysqldump = "mysqldump";
$mysql = "/usr/bin/mysql";

# MAMP の場合
# $mysqldump = "/Applications/MAMP/Library/bin/mysqldump";
# $mysql ="/Applications/MAMP/Library/bin/mysql";
# 記述の変更が必要なサーバーなどの情報があれば @kazumich に教えてください。

5) バックアップディレクトリの設定

# 1) で server を指定した際に設定してください。
# また、バックアップを保存するディレクトリは public_html , www より上の階層に作成してください。

#$backupDir = "/home/server_name/domain_name/backup";

6) 実行ディレクトリの設定

# ブラウザからの実行の際には設定の必要はありません。 
# cron から実行する際に設定してください。

#$target_dir = "/home/server_name/domain_name/public_html";

今後の改善したい点

a-blog cms のバージョンを出力できるように

そのバックアップデータが、どの a-blog cms のバージョンで動いていたものかを分かるようにしたい。

storage が違う階層にあっても動作するように

storage は違う階層に置くことでファイルへの直接アクセスできないような設定にすることが推奨だと思うが対応ができてない。

部分ダウンロードできるように

今は、画面上にリストのマーカーがついているが、チェックボックスにして必要無いものを外すことができるようにしたい。そうすることでファイルサイズを減らすこともできる。

テーマの指定を実際の設定されているものを自動で設定したい

どのテーマを使っているか分かっている自分の案件なら分かるが、頼まれて対応するような時にデータベースを調べればテーマディレクトリは分かるハズなので自動抽出してくれると、さらに便利だと思う。

追加インストールしているプログラムも対応に

以下のディレクトリも忘れて移行すると、大問題になる可能性があるので、対象に含めるようにしたい。

  • extension
  • php/AAPP
  • php/ACMS/User

最後に

毎回、苦労して用意していたものが簡単に一式入手ができるようになったので、随分省力化できたのではないかと思っています。標準で持っている バックアップ&リストア 機能というものもありますので、これが公式になる予定は今のところありません。

引越し用のツールですので、利用後はサーバーから削除するなどの対策をお願いします。データベースのパスワードが分かると全てのデータをダウンロードされてしまいますので注意ください。

明日の a-blog cms Advent Calendar 2021 17日目は、口田 聖子さんの「a-blog cmsで現在のエントリーを「関連エントリー」に登録しているエントリーを表示する」になります。まだ、タイトルが分かりませんので、後日アップデート予定です。


a-blog cms Training Camp 2021 Autumn を開催しました

2021年9月10日(金) 11日(土) と2年ぶりに Zoom Meeting と YouTube Live を利用してオンライン開催しました。集合写真がメイン画像になっていないのは寂しいところではあります。例年のように書くと今回は、北海道・青森県・山形県・宮城県・福島県・埼玉県・群馬県・東京都・神奈川県・富山県・福井県・新潟県・長野県・静岡県・愛知県・三重県・岐阜県・大阪府・兵庫県・岡山県・広島県・山口県・香川県・高知県・福岡県と25都道府県から 70人くらいの a-blog cms な人たちが集まりました。

申し込みは、もう少し多かったのですが出欠も取れていないので、ざっくりとした人数で表現しておきます。

1日目 Zoom meeting

Ver. 2.12 のご紹介

アップルップル CTO 伊藤 淳 から、次にリリースされる a-blog cms 2.12.0 の新機能についての紹介がありました。

  • エントリー単位でのエクスポート&インポート機能
  • webhook 機能
  • API 機能

YouTube へリンクしています

新テーマUTSUWAについて

昨年末くらいから用意しているテーマですが、2.12 と一緒にリリース予定です。 こちらはアップルップル 森田さんの発表で。


YouTubeへリンクしています

ECテーマと拡張アプリの紹介

私が発表したセッションです。 2.12 リリース時に Square のカード決済が標準で利用できる ECテーマをリリース予定です。 その他はパートナーさん向けの情報になるので、動画は非公開になっております。


祝日を表示できるライブラリを作ってみました

アップルップルの今年の新人 宇井くんには、 a-blog cms を利用している皆さんが使えそうな JavaScript のライブラリーを作ってもらい、それを発表してもらいました。


YouTubeにリンクしています

テンプレートの変更を減らすために心がけていること

Suzulabo 太田 小夏さんのセッションでは、テーマ実装でためになる話をしてもらいました。


YouTubeにリンクしています

FullCalendarならリッチなカレンダーを簡単に実装できる

アップルップルの菅原さんには FullCalendar という JavaScript ライブラリを利用すると 標準モジュールでできないようなカレンダーの実装ができるよって話をしてもらいました。


YouTubeにリンクしています

Form2Entryを利用してダウンロード計測機能を作成する

ましじめ株式会社 の田村さんには、a-blog cms の有償拡張アプリを利用した実装についてお話ししてもらいました。 この機能を利用するとログインしていないユーザーが何らかのフォームを送信することでエントリー(記事)を作ることができます。


YouTubeにリンクしています

また最近、田村さんは 現場のプロから学ぶ CSSコーディングバイブル という本を執筆したことから、今回のイベント参加者に何冊か本のプレゼントをしていただきました。ありがとうございます。

a-blog cms導入をきっかけに、サイト制作のワークフローを見直したことについて

にいがた三昧の 保坂さんに実装側ではなく、社内全体のワークフローについてお話し頂きました。こちらは非公開ということで参加者のみで動画公開はありません。


a-blog cms × 外部サービスで作る、営業ツールとしてのWebサイト

ONiWA株式会社 CTO 小野さんのセッションでは、a-blog cms を活用してWebサイトを営業ツールにしようという話がありました。 a-blog cms では、フォームから外部連携の機能が多く用意していますし、今回の 2.12.0 からは webhook も追加されますので、より便利に色々なことができるようになるはずです。


YouTubeにリンクしています

キャンペーンサイトをJamStack的な構成でやってみた

1日目の最後に、アップルップル CTO 伊藤さんが最近実装担当をした JamStack なキャンペーンサイトの紹介がありました。こちらの動画は残念ながら公開されていないです。


2日目 YouTube Live & oVice

2日目は、弊社のスタッフが1時間づつ受け持って、カスタマイズ講座を行っています。 普段であれば ベースキャンプ名古屋でオフラインでやってるような内容をライブ配信でやってみました。

また、YouTube で配信中に裏で oVice というサービスを利用して相談会も開催してみましたが、本編やってる時に来る人は残念ながらほとんどいなかったですね。リアルセミナーの外でブース出しているようなもんなので、仕方が無いところでしょうね。

私の過去の合宿レポート

  1. 日本各地から集まった a-blog cms Power User Training Camp 2010 Spring が終了しました
  2. 日本各地から集まった a-blog cms Training Camp 2010 Autumn が終了しました
  3. a-blog cms Power User Training Camp 2011 Spring 終わりました!
  4. 13都道府県から集まった a-blog cms Training Camp 2011 Autumn が終了しました
  5. 5回目の合宿 a-blog cms Power User Training Camp 2012 Spring が開催されました
  6. a-blog cms Power User Training Camp 2012 Autumn が終了しました
  7. a-blog cms Summer Camp 2013 が終了しました
  8. a-blog cms Training Camp 2014 Spring が開催されました
  9. a-blog cms Training Camp 2014 Autumn が開催されました
  10. a-blog cms Training Camp 2015 Spring が開催されました
  11. a-blog cms DAY & Training Camp 2015 Autumn が開催されました
  12. a-blog cms Training Camp 2016 OKINAWA が開催されました
  13. a-blog cms Training Camp 2016 Autumn が開催されました
  14. a-blog cms Training Camp 2017 Spring が開催されました
  15. a-blog cms Training Camp 2017 Autumn が開催されました
  16. a-blog cms Training Camp 2018 Spring が開催されました
  17. a-blog cms Training Camp 2018 TOKYO を開催しました
  18. a-blog cms Training Camp 2019 Spring を開催しました
  19. a-blog cms Training Camp 2019 Autumn を開催しました

a-blog cms Training Camp 2020 Spring / 2020 Autumn / 2021 Spring を中止

次回の春開催は!

来年の春開催は、リアルに開催できることを願っています。 2年リアル開催できてないので 沖縄 でやりたいと思っていますが、どうでしょうか?

 

最後に、Zoom のところで集合写真撮りたかったですね。1枚も人が出てないレポートエントリーでした。


イベント用のモジュールの仕様を妄想してみた

これは a-blog cms Advent Calendar 2020 の6日目のエントリーです。今回は、こんなモジュールがあったらいいなって妄想を書いてみようと思います。


標準提供の範囲内での実装を考えてみる

a-blog cms には、スケジュールをサイト上に掲載するためのモジュールとして

と、2種類のモジュールが用意されています。

スケジュール ( Schedule ) モジュール

こちらは、管理画面の「スケジュール」より1ヶ月分をまとめて管理するような UI で簡単な休日カレンダーなど作ることができるようになっています。


このモジュールでは、縦に1ヶ月分を表示させるリスト表示と 七曜表表示ができ、さらに指定ヶ月分や年間表示など機能が満載です。

お店の休日カレンダーや月間イベント情報など、手軽に休日など日のステータスや、イベントのタイトルくらいをお伝えするのに向いています。アップルップルでは、毎年この時期には「年休日カレンダー」をスケジュールモジュールで作って社内で共有 しています。

エントリーカレンダー ( Entry_Calendar ) モジュール

a-blog cms はエントリーのカタチで情報を持たせておくと、いろいろな方法で情報が表示可能です。 その中でも、エントリーカレンダー は面白い使い方ができるモジュールになっています。

スケジュールモジュールのようなカタチでカレンダーを表示させる事ができ、その日付の中にエントリー情報を表示ができるようにしたものです。スケジュールと大きく違うところはカレンダーに表示されるエントリーリンクから詳細ページを用意できる事です。

妄想で仕様を考えてみる

ここからは「こんなのがあったらいいな」を書いていきます。

エントリーカレンダー ( Entry_Calendar ) モジュール の弱点 を共有しておきます。 例えば、今日から3日間は「臨時休業」とするとします。その際には、3日分のエントリーを作ってタイトルに「臨時休業」というエントリーを作る必要があります。 繰り返し同じ情報を表示する際には複製が必要になります。

日付の管理の仕方を変える

これを解決しようと思うと、日付を複数設定できるようにする必要があります。 システム自体の管理を変更するには大事ですが、a-blog cms では管理画面を自由にカスタマイズが可能ですから、まずはカスタムフィールドグループで複数の日付を設定できるようにしてみてはどうでしょうか?

都度、日付を登録するフォームの場合


この場合、1週間とか1ヶ月毎日になったりすると設定が大変そうです。

また、入力欄には class="js-datepicker" を設定する事で日付の選択画面が出るようになります。

FROM - TO で日付を設定する場合


FROM - TO を設定できるようにする事で長いスケジュールも設定手軽に登録ができるようにできますね。

カスタムフィールドの日付に対応するモジュール

エントリー日付ではなく、上記のようなカスタムフィールド {event_date_from}{event_date_to} を利用して情報を表示するモジュールを作ります。

  • イベントカレンダーモジュール ( Event_Calendar )
  • イベントサマリーモジュール ( Event_Summary )
  • イベント七曜カレンダーモジュール ( Event_Calendar7 )

イベントカレンダーモジュール ( Event_Calendar )

Entry_Calendar 互換で、カスタムフィールド日付で情報が表示できるモジュールになります。複数の日付の場所に同様のエントリーにリンクがはられるイメージです。

イベントサマリーモジュール ( Event_Summary )

表示設定としては Entry_Summary 互換っぽいが、Entry_Calendar のような

  • 週の始まり
  • 表示モード 月表示 / 週表示(その日から) / 週表示(週の始まりから)
  • ページ送り数

が、必要だと思う。 そして、エントリー自身は同じエントリーは表示させずに、Summaryっぽい日付の場所には日付をFROM - TO で表示させる。

イベント七曜カレンダーモジュール ( Event_Calendar7 )

七曜表示で画像のような表示ができるようにする。


こんなの作りました。ではなく、こんなのあったらいいね。って事を書いてみました。

明日は、ウェビングスタジオ 口田さん が「 コンテキスト(URLコンテキスト、ctx属性)について解説記事 」を書いてくれるそうです。なんとか、今年も毎日続けたいですね。


PICKUP記事をお知らせ一覧の最初に出しておくための実装のポイントはソート順の設定

このところブログを書くのをサボっていましたが、今年も a-blog cms Advent Calendar 2020 のトップバッターという事で a-blog cms のカスタマイズについて書いてみようと思います。

  1. モジュールを2つ用意して通常のお知らせ一覧の上に PICKUP一覧を置く
  2. モジュールは 1つで並び順で対応する

よくあるカスタマイズの依頼で「お知らせの一覧に最初に出しっぱなしにしておけるようにして欲しい」というもの。この実装を皆さんは、どのように実装しますか?

1. モジュールを2つ用意して通常のお知らせ一覧の上に PICKUP一覧を置く

先日、受託の制作で同様の依頼があった時に、サクッとこんな実装をしました。

えっ! 貴方が受託の案件で実装してるのって思う人もいるかもしれませんが、そんな時もあります。


管理画面には、チェックボックスで「最初に表示させる場合にはチェックを入れてください」とでもしましょう。しかし、これには弱点があります。

  • PICKUP の件数が複数件になる事もあるし無い事もある。
  • PICKUP と通常のエントリーの合計の件数は固定がいい。

こう言われると、2つのモジュールの合作はうまく行きません。 この 合計の件数は固定 というのがハードルが高いことになります。最初のキャプチャ画像のように縦に積むような場合には「5件が6件になってもいいじゃないですかー!」と逃げる事もできますが、以下のような横に数件並ぶ場合には個数は大事になってきます。


2. モジュールは 1つで並び順で対応する

この方法は、CTO の伊藤さんに教えてもらいました。

エントリー系のモジュールは、ソートのキーが2つ設定できるようになっています。 なので、1つ目のキーをカスタムフィールドにして、2つ目のキーを日付にする事で簡単に実現 できます。

モジュールID の表示設定を見るとこんな感じで


フィールドの昇順・降順は、データに入っている内容によっては逆順にしないといけない事もありますが、

上記を書いている時に ソートフィールド名 という項目を見つけました。 あれ? いつこんな項目ができたんだろう? 知りませんでした。なので、今回紹介しようと思っていた実装よりも簡単に済ませる事ができてしまいます。

field-pickup.html

themes/beginner2020/admin/entry の中にある field-pickup.html の「サブカラムに表示させる...」の部分を「最初に表示させる...」にテキストだけ修正しておきます。

<div class="acms-admin-form-checkbox">
	<input type="checkbox" name="pickup[]" value="true"{pickup:checked#true} id="input-checkbox-pickup" />
	<label for="input-checkbox-pickup"><i class="acms-admin-ico-checkbox"></i>
   最初に表示させる場合はチェックを入れてください。</label>
</div>
<input type="hidden" name="field[]" value="pickup" />

モジュールID 表示設定



表示順 フィールド順(降順)
第2表示順 日付(降順)
ソートフィールド名 pickup

あとは IFブロックで {pickup} の値によって、PICKUP と出したり、日付を出すようにして少し違った表示にしています。

<!-- BEGIN_IF [{pickup}/eq/true] -->
<p><span class="acms-label acms-label-danger">PICKUP</span></p>
<!--ELSE -->
<p>{date#Y}年{date#m}月{date#d}日( {date#week} )</p>
<!-- END_IF -->

もう少し面倒な事をして実装した事を紹介するつもりだったのですが、これを書くのにキャプチャして説明を書こうとしている時に ソートフィールド名 という存在を知って、より簡単にできるという説明になってしまいました。

どう面倒に実装したのかは、分かりにくくなるので書かないでおきます。

明日は、井斉さん が「 運用視点で嬉しい管理画面の設計とa-blog cmsを使った実践の方法 」を書いてくれるそうです。なんとか、今年も毎日続けたいですね。