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

質問全般・改善要望
返信する
Weird
メンバー
メンバー
記事: 3
登録日時: 2012年6月22日(金) 17:01

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

投稿記事 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{
  }
}
助言を頂けますと助かります。
よろしくお願いいたします。
アバター
yama
管理人
記事: 3212
登録日時: 2009年7月29日(水) 02:50

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

投稿記事 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部分を書き換えてみました。でもこれだと白にしか変わらないってことですね?
Weird
メンバー
メンバー
記事: 3
登録日時: 2012年6月22日(金) 17:01

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

投稿記事 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しています。
また、切り替えただけだと画面上が変わらないので、一度リロードをかけています。
返信する