ページ 11

フロント画面でデザインテンプレートを切り替えるボタンについて

Posted: 2022年8月01日(月) 16:49
by Weird
お世話になります。
-----
MODXのバージョン:1.0.25J
PHPのバージョン:7.4.28
データベース:5.5.5-10.5.15-MariaDB
-----

ユーザーの操作画面でテンプレートを切り替える仕組みを探しておりましたが、
理想のプラグイン・スニペット等が発見できなかったため質問させていただきます。

プログラムにそれほど詳しくないのですが、「MODX_MobileConverter」のソースを一部参考にスニペットで実現しようとしてみました。
デザインテンプレートとして、以下を作成しています。
[2]black
[3]white
[4]black-content
[5]white-content
※black⇆white、black-content⇆white-contentの切り替わりを想定しています。

ユーザーが操作するフロント側の画面にボタンを配置し、ボタンをクリックすると、用意されたテンプレートに切り替わる仕組みです。
以下、リソース画面に配置するボタンのソースです。

コード: 全て選択

<form name="form" action="[~[*id*]~]" method="post">
<input type="submit" class="btn" name="subject" id="subject" value="白" />
<input type="submit" class="btn" name="subject" id="subject" value="黒" />
<input id="thisTPL" name="thisTPL" type="hidden" value="[*template*]" />
</form>
以下、スニペットです。

コード: 全て選択

$post = $_POST['subject'];
$thisTPL = $_POST['thisTPL'];
//白から黒へ切り替わる部分抜粋
if($thisTPL == '4'){ //現在4 black-content
  if($post == "白"){
    $tbl = $modx->getFullTableName("site_templates");
    $whr = 'templatename=\''. 'white-content' .'\'';
    if( $rs = $modx->db->select('id,content',$tbl,$whr) ){
      if( $resource = $modx->fetchRow($rs) ){
        $this->documentObject['template'] = $resource['id'];
        $this->documentContent =  $resource['content'];
        //$this->documentContent= $this->parseDocumentSource($this->documentContent);
      }
    }
  }else{
  }
}
助言を頂けますと助かります。
よろしくお願いいたします。

フロント画面でデザインテンプレートを切り替えるボタンについて

Posted: 2022年8月03日(水) 07:54
by yama

コード: 全て選択

<?php
//白から黒へ切り替わる部分抜粋
if($_POST['thisTPL'] != 4){
    return;
}
if($_POST['subject'] != "白"){
    return;
}

$rs =db()->select(
    'id,content',
    '[+prefix+]site_templates',
    'templatename="white-content"'
);
if( !$rs ){
    return;
}
$resource = db()->getRow($rs);
if( !$resource ){
    return;
}

$this->documentObject['template'] = $resource['id'];
$this->documentContent =  $resource['content'];
php部分を書き換えてみました。でもこれだと白にしか変わらないってことですね?

フロント画面でデザインテンプレートを切り替えるボタンについて

Posted: 2022年8月09日(火) 17:11
by Weird
返信ありがとうございます!
コードは、白から黒へ切り替わるところを抜粋して書かせていただきました。

その後試行錯誤して、動くようになったのものがあるので全コードを書かせていただきます。
(コード初心者のため内容が汚くて申し訳ないです。もっとコンパクトにできるのではと思っています…)

HTMLのリソース側は変更なしです。

スニペット側:[[changeTPL]]

コード: 全て選択

$tbl = $modx->getFullTableName("site_templates");
$post = $_POST['subject'];
$thisTPL = $_POST['thisTPL'];
$id = $modx->documentObject['id'];

//現在のテンプレートを取得し、切り替える
if($thisTPL == '2'){ //現在2 black 3へ
  if($post == "白"){
    $tbl = $modx->getFullTableName("site_content");
    $fields = array(
      "template" => 3
      );
    $result = $modx->db->update($fields, $tbl, 'id = "' . $id . '"');
    if( $result ) {
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        header("Location:#");
        exit;
      }
    }
  }
}
if($thisTPL == '3'){ //現在3 white 2へ
  if($post == "黒"){
    $tbl = $modx->getFullTableName("site_content");
    $fields = array(
      "template" => 2
      );
    $result = $modx->db->update($fields, $tbl, 'id = "' . $id . '"');
    if( $result ) {
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        header("Location:#");
        exit;
      }
    }
  }
}
if($thisTPL == '4'){ //現在4 black-content 5へ
  if($post == "白"){
    $tbl = $modx->getFullTableName("site_content");
    $fields = array(
      "template" => 5
      );
    $result = $modx->db->update($fields, $tbl, 'id = "' . $id . '"');
    if( $result ) {
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        header("Location:#");
        exit;
      }
    }
  }
}
if($thisTPL == '5'){ //現在5 white-content 4へ
  if($post == "黒"){
    $tbl = $modx->getFullTableName("site_content");
    $fields = array(
      "template" => 4
      );
    $result = $modx->db->update($fields, $tbl, 'id = "' . $id . '"');
    if( $result ) {
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        header("Location:#");
        exit;
      }
    }
  }
}
使用中テンプレートが2の場合は3へ、3の場合は2へ。4の場合は5へ、5の場合は4へ。
DBのtemplateをupdateしています。
また、切り替えただけだと画面上が変わらないので、一度リロードをかけています。

フロント画面でデザインテンプレートを切り替えるボタンについて

Posted: 2022年8月15日(月) 12:36
by tktools
木下です。

面白そうなのでコンパクトにしてみました。
切り替えを判断する部分と
実際に切り替える部分を分けることで
共通して発生している切り替え部分の分コンパクトになったと思います。

また、切り替えの種類が増えたり、切り替え時の処理を変更する必要が生じた場合にも
変更する箇所は最低限で済むので今後のメンテナンスも楽になると思います。

尚、実際に動作させてませんので動かなかったらごめんなさい。

コード: 全て選択

$tbl = $modx->getFullTableName("site_templates");
$post = $_POST['subject'];
$thisTPL = $_POST['thisTPL'];
$id = $modx->documentObject['id'];

$changetemplete = false;

// テンプレートの切り替えが発生するか調べる
if($thisTPL == '2'){ //現在2 black 3へ
  if($post == "白"){
    $changetemplete = 3;
  }
}
if($thisTPL == '3'){ //現在3 white 2へ
  if($post == "黒"){
    $changetemplete = 2;
  }
}
if($thisTPL == '4'){ //現在4 black-content 5へ
  if($post == "白"){
    $changetemplete = 5;
  }
}
if($thisTPL == '5'){ //現在5 white-content 4へ
  if($post == "黒"){
    $changetemplete = 4;
  }
}

//現在のテンプレートを取得し、切り替える
if( $changetemplete ){
    $tbl = $modx->getFullTableName("site_content");
    $fields = array(
      "template" => $changetemplete
      );
    $result = $modx->db->update($fields, $tbl, 'id = "' . $id . '"');
    if( $result ) {
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        header("Location:#");
        exit;
      }
    }
}