カテゴリーを SELECT で検索するフォームを作るには


カテゴリーリストモジュール( Category_List )を利用して、検索フォームを作る実装について書いてみます。カテゴリーリストモジュールは、子カテゴリーがあった際に入れ子で表示ができるようにするために少し複雑な動きをしています。

まずは、カテゴリーリストモジュールのスニペットを確認してみます。

カテゴリーリストモジュールのスニペット

<!-- BEGIN_MODULE Category_List -->
<div class="acms-margin-bottom-medium">
@include("/admin/module/setting.html")
  <!-- BEGIN category:loop --><!-- BEGIN ul#front -->
  <ul class="acms-list-group">
  <!-- END ul#front --><!-- BEGIN li#front -->
    <li><!-- END li#front --><!-- BEGIN category:veil -->
      <a href="{url}" class="acms-list-group-item">{name}<!-- BEGIN amount:veil -->
        <span class="acms-badge acms-float-right">{amount}</span><!-- END amount:veil -->
      </a><!-- END category:veil --><!-- BEGIN li#rear -->
    </li><!-- END li#rear --><!-- BEGIN ul#rear -->
  </ul>
  <!-- END ul#rear --><!-- END category:loop -->
</div>
<!-- END_MODULE Category_List -->

エントリーリストモジュール であれば、<ul> は entry:loop の外にあるのが一般的ですが、カテゴリーリストモジュール は、category:loop の内側に <ul> があるのでカスタマイズする際には注意が必要です。

最終的な表示されるフォームのHTML

上記のようなスニペットを利用して、以下のような HTML ができるようなことを考えてみます。

<form action="" method="POST">
  <select name="cid">
    <option>全て</option>
    <option value="2">お知らせ</option>
    <option value="3">製品情報</option>
    <option value="4">会社概要</option>
    <option value="6">お問い合わせ</option>
    <option value="7">採用情報</option>
    <option value="8">物件情報</option>
  </select>
  <input type="submit" name="ACMS_POST_2GET" value="検索">
</form>

フォームとしては実際には、以下のようになります。

スニペットを改造してみる

普通に考えると、まずは以下のように実装するのではないかと思います。

<form action="" method="POST">
  <!-- BEGIN_MODULE Category_List -->
  <select name="cid">
    <option value="">全て</option>
  <!-- BEGIN category:loop -->
    <option value="{cid}">{name}</option>
  <!-- END category:loop -->
  </select>
  <!-- END_MODULE Category_List -->
<input type="submit" name="ACMS_POST_2GET" value="検索">
</form>

しかし、これを a-blog cms のテンプレートに書くと、残念ながら以下のような結果になります。今回、どうしてそうなるのかという説明は省きますが、必要のない   <option value=""></option> を表示させないようにすることを追記することを考えます。

<select name="cid">
  <option value="">全て</option>
  <option value=""></option>
  <option value="2">お知らせ</option>
  <option value=""></option>
  <option value="3">製品情報</option>
  <option value=""></option>
  <option value="1">家庭用製品</option>
  <option value=""></option>
  <option value="5">業務用製品</option>
  <option value=""></option>
  <option value=""></option>
  <option value=""></option>
  <option value="4">会社概要</option>
  <option value=""></option>
  <option value="6">お問い合わせ</option>
  <option value=""></option>
  <option value="7">採用情報</option>
  <option value=""></option>
  <option value="8">物件情報</option>
  <option value=""></option>
  <option value=""></option>
</select>

空の optoin を非表示にする

方法としては IFブロックを利用して表示されて欲しくない部分は出ないようにします。例えば、{cid} が空ではない時という条件を設定したり

  <!-- BEGIN category:loop -->
    <!-- BEGIN_IF [{cid}/nem]-->
      <option value="{cid}">{name}</option>
    <!-- END_IF -->
  <!-- END category:loop -->

子カテゴリーがあるものがあった時に子カテゴリーを非表示にしたい場合を考え、階層の変数 {level} が 1 のものだけを表示する

  <!-- BEGIN category:loop -->
    <!-- BEGIN_IF [{level}/eq/1]-->
      <option value="{cid}">{name}</option>
    <!-- END_IF -->
  <!-- END category:loop -->

このような設定をします。

selected="selected" の処理

検索結果のページで select が選択したところが選択したままになるようにするためには、option に selected="selected" をつける必要があります。

今回は、option の中に IFブロックを書き、グローバル変数 %{CID} とカテゴリーリストモジュール内の {cid} との比較を行います。

<!-- BEGIN_IF [%{CID}/eq/{cid}] --> selected="selected"<!-- END_IF -->

最終的なカテゴリーリストモジュールの実装

  1. スニペットを改造してみる
  2. 空の optoin を非表示にする
  3. selected="selected" の処理

を実装し、人が読みやすいようにテンプレートを書くと以下のようになります。

<form action="" method="POST">
  <!-- BEGIN_MODULE Category_List -->
  <select name="cid">
    <option value="">全て</option>
  <!-- BEGIN category:loop -->
    <!-- BEGIN_IF [{level}/eq/1]-->
    <option value="{cid}"
      <!-- BEGIN_IF [%{CID}/eq/{cid}] -->
        selected="selected"
      <!-- END_IF -->
    >{name}</option>
    <!-- END_IF -->
  <!-- END category:loop -->
  </select>
  <!-- END_MODULE Category_List -->
<input type="submit" name="ACMS_POST_2GET" value="検索">
</form>

a-blog cms のテンプレートは、必要がないところは消える仕様になっていますが、消える部分の外にある改行だけ有効になってしまうことから上記を実行すると

<form action="" method="POST">
  
  <select name="cid">
    <option value="">全て</option>
  
    
  
    
    <option value="2"
      
    >お知らせ</option>
    
  
    
  
    
    <option value="3"
      
    >製品情報</option>


(以下略)

のように空白だらけのソースコードになります。HTML として表側では改行や空白は関係ないので、このままでも構いませんが綺麗にした例もご紹介しておきます。

<form action="" method="POST">
  <!-- BEGIN_MODULE Category_List -->
  <select name="cid">
    <option value="">全て</option>
  <!-- BEGIN category:loop --><!-- BEGIN_IF [{level}/eq/1]-->  <option value="{cid}"<!-- BEGIN_IF [%{CID}/eq/{cid}] --> selected="selected"<!-- END_IF -->>{name}</option>
  <!-- END_IF --><!-- END category:loop --></select>
  <!-- END_MODULE Category_List -->
<input type="submit" name="ACMS_POST_2GET" value="検索">
</form>

この HTML であれば、以下のようなソースコードになります。

<form action="" method="POST">
  
  <select name="cid">
    <option value="">全て</option>
    <option value="2">お知らせ</option>
    <option value="3">製品情報</option>
    <option value="4">会社概要</option>
    <option value="6">お問い合わせ</option>
    <option value="7" selected="selected">採用情報</option>
    <option value="8">物件情報</option>
  </select>
  
<input type="submit" name="ACMS_POST_2GET" value="検索">
</form>

今回は、特殊なカテゴリーリストのループをシンプルにする方法と、現在表示している selected の対応についての紹介でした。

WebサーバーのPHPのバージョンアップをしたら、サイトが表示されなくなった

Ver. 2.11.x 以下

ケース1:ionCube Loader がうまく動いていない場合

ionCube Loader がうまく動いていない可能性があります。WebサーバーのPHPのバージョンに合った ionCube Loader をご利用ください。

ケース2:ionCube Loader 自体のバージョンが古い場合

ionCube Loader 自体のバージョンが古い可能性が考えられます。動作条件にあったバージョンをご利用ください。

ケース3:license.phpが古い場合

上記の2つを対応しても改善しない場合は、license.phpが古い可能性があります。マイページより再ダウンロード(再生成されます)してお試しください。

Ver. 3.0.x 以上

WebサーバーのPHPのバージョンがあっていない可能性があります。対応バージョンページを確認して、CMSのバージョンにあった、PHPバージョンを選択ください。

YouTube を利用せず mp4 をアップロードするカスタムユニットの実装

一般に非公開の動画を CMS のコンテンツとして扱いたい場合、YouTube や Vimeo にアップすることが NG なこともあります。その際には CMS をインストールしているサーバーに mp4 のファイルをアップロードできるようにし video タグで再生することになります。

今回はカスタムユニットで mp4 のファイルをアップロードし再生できるものを作ってみます。

カスタムユニットを作る際には /theme_name/admin/entry/unit/extend.html にソースコードを追加します。

a-blog cms の良さは、HTMLの知識のみでオリジナルのブロックである「カスタムユニット」を実装できるところですね。



mp4 カスタムユニットの仕様

  • アップロードした mp4 のプレビュー機能を用意
  • ファイルサイズを表示
  • 再生時の音声をミュートにできる設定を用意
  • ダウンロード UI の非表示できる設定を用意
  • サイズを設定、表示位置を左寄せか、中央表示かを指定できる設定を用意

管理画面側のテンプレート

/theme_name/admin/entry/unit/extend.html

<!-- BEGIN custom_mp4 -->
<table class="entryFormColumnSettingTable entryFormColumnTable {diff}">
  <tr>
    <!-- BEGIN_IF [{video-file@path}/nem/] -->
    <td class="entryFormFileentryFormImages">
      <video src="%{ARCHIVES_DIR}{video-file@path}" controls 
      <!-- BEGIN_IF [{mute}/eq/true] -->muted<!-- END_IF--> <!-- BEGIN_IF [{download}/eq/ng] -->controlslist="nodownload"<!-- END_IF --> class="acms-admin-img-responsive">
  </video>
    </td>
    <!-- END_IF -->
    <td class="entryFormFileControl">
      <table>
      <tr>
        <th><label for="unit-video-id-{id}">MP4ファイル</label></th>
        <td>
          <!-- BEGIN_IF [{video-file@path}/nem] -->{video-file@fileSize}[convert_bytes('m',1)] MB
          <input type="hidden" name="video-file{id}@old" value="{video-file@path}" />
          <input type="hidden" name="video-file{id}@secret" value="{video-file@secret}" />
          <input type="hidden" name="video-file{id}@fileSize" value="{video-file@fileSize}" />
          <label for="input-checkbox-video-file{id}@edit" class="acms-admin-form-checkbox">
            <input type="checkbox" name="video-file{id}@edit" value="delete" id="input-checkbox-video-file{id}@edit" />
            <i class="acms-admin-ico-checkbox"></i>削除</label>        
          <!-- END_IF -->
          <input type="file" name="video-file{id}" />
          <input type="hidden" name="unit{id}[]" value="video-file{id}" />
          <input type="hidden" name="video-file{id}@baseName" value="{video-file@baseName}" />
          <input type="hidden" name="video-file{id}:extension" value="file" />
          <input type="hidden" name="video-file{id}@extension" value="mp4" />
        </td>
      </tr>
      <tr>
        <th><label for="unit-video-mute-{id}">音声</label></th>
        <td>
          <div class="acms-admin-form-checkbox">
            <input type="checkbox" name="mute{id}[]" value="true" {mute:checked#true} {download:checked#ng} <!-- BEGIN_IF [{video-file@path}/em] --> checked="checked"<!-- END_IF --> id="input-checkbox-mute-true-{id}" />
            <label for="input-checkbox-mute-true-{id}">
              <i class="acms-admin-ico-checkbox"></i>再生時ミュート</label>
          </div>
          <input type="hidden" name="unit{id}[]" value="mute{id}" />
        </td>
      </tr>
      <tr>
        <th><label for="unit-video-download-{id}">ダウンロード</label></th>
        <td>
          <div class="acms-admin-form-checkbox">
            <input type="checkbox" name="download{id}[]" value="ng" {download:checked#ng} <!-- BEGIN_IF [{video-file@path}/em] --> checked="checked"<!-- END_IF --> id="input-checkbox-download-ng-{id}" />
            <label for="input-checkbox-download-ng-{id}">
              <i class="acms-admin-ico-checkbox"></i>不可</label>
          </div>
          <input type="hidden" name="unit{id}[]" value="download{id}" />
        </td>
      </tr>
      <tr>
        <th><label for="unit-video-size-{id}">サイズ</label></th>
        <td>
          <select name="video-size{id}">
            <option value="acms-col-sm-12" {video-size:selected#acms-col-sm-12}>幅1/1 (820px)</option>
            <option value="acms-col-sm-8" {video-size:selected#acms-col-sm-8}>幅2/3 (540px)</option>
            <option value="acms-col-sm-6" {video-size:selected#acms-col-sm-6}>幅1/2 (400px)</option>
          </select>
          <input type="hidden" name="unit{id}[]" value="video-size{id}" />
           <div class="acms-admin-form-checkbox">
            <input type="checkbox" name="video-align{id}[]" value="center" {video-align:checked#center} id="input-checkbox-video-align-center-{id}" />
            <label for="input-checkbox-video-align-center-{id}">
              <i class="acms-admin-ico-checkbox"></i>中央表示</label>
          </div>
          <input type="hidden" name="unit{id}[]" value="video-align{id}" />
        </td>
      </tr>
      </table>
    </td>
  </tr>
  </table>
<!-- END custom_mp4 -->

表示用側のテンプレート

/theme_name/include/unit/extend.html

<!-- BEGIN unit#custom_mp4 -->
<!-- BEGIN_IF [{video-file@path}/nem] -->
<div class="column-video-<!-- BEGIN_IF [{video-align}/eq/center] -->center<!-- ELSE -->auto<!-- END_IF --> {video-size}"{display_size}[raw]>
  <video src="%{ARCHIVES_DIR}{video-file@path}" controls 
      <!-- BEGIN_IF [{mute}/eq/true] -->muted<!-- END_IF--> <!-- BEGIN_IF [{download}/eq/ng] -->controlslist="nodownload"<!-- END_IF --> class="acms-admin-img-responsive">
  </video>
</div><!-- END_IF -->
<!-- END unit#custom_mp4 -->

コンフィグの設定

コンフィグのエントリー編集画面の 編集設定ユニット追加ボタンcustom_mp4 という設定を追加します。



その後、コンフィグのエントリー編集画面の ユニット設定 で、以下の画像のようなカタチになるように、動画 ボタンを一度クリックして保存してください。



これで、mp4 カスタムユニット の作成は完了です。

最後に、コピペすら面倒だという方のために、そのまま使える extend.html を zip したものをアップしておきました。ダウンロードしてお試しください。


参考ページ




入力したユーザー名とパスワードは合っているのに、CMSにログインできない

正確なユーザー名とパスワードを入力しているにも関わらず、CMSへログインできない場合は、以下の項目をご確認ください。

サイトのURLとconfig.server.php に記載されているドメインが一致しているか確認する

サイトのURLとconfig.server.php の DOMAIN が合っていない可能性があります。 現在表示しているURLとconfig.server.phpに記述されているドメインが一致しているかご確認ください。

Cookieを削除してみる

ブラウザのCookieを開発ツールなどから削除してください。削除しても改善されない場合は、http:// 表示時とhttps://表示時で、それぞれCookieを削除してください。

リバースプロキシなどのインフラが関係し、セッションが維持できていない

「ページの有効期限が切れています」というメッセージが出る場合は、セッションが維持できていない可能性があります。リバースプロキシなどのインフラが関係している可能性があるので、インフラ担当者にセッションが維持できるようになっているか、ご確認ください。