テンプレート変数の状態をチェックしてhtmlを書き出すスニペットを作りたい  【解決済み】

質問全般・改善要望
返信する
monamaster
メンバー
メンバー
記事: 13
登録日時: 2010年9月10日(金) 15:34

テンプレート変数の状態をチェックしてhtmlを書き出すスニペットを作りたい

投稿記事 by monamaster »

皆様のお知恵をお借りしてたいと思います。
やりたいことはテンプレート変数を作り、その変数に何かが入力されると表示されるスニペットを作りたいと思っています。
通常、テンプレート変数では入力された内容しか呼び出せません(HTML Generic Tagを使っても、その項目を含むタグしか出せません)。
今回、ご相談というのはテンプレート変数に何かが入力された場合、その入力をチェックし、中身があるならhtmlタグを表示させるためのスニペットの書き方です。
具体的には
(例)
1.テンプレート変数で「項目1」と「項目2」を作り「テスト」テンプレートで使えるように設定します。
2.「テスト」テンプレートで「項目1」と「項目2」に何かを記入します。
3.スニペットに「項目1」と「項目2」を含むhtmlタグを書き、それを表示させます。
4.テンプレートでスニペットを呼出、htmlタグ付きで表示

例えば「項目1」に何かが入力されたら<tr><td>項目1のタイトル</td><td>「項目1」の内容</td></tr>というふうに、「項目1」だけでは表示されない「項目1のタイトル」というのを事前に仕込んでおき、<tr>〜</tr>までを表示するようにしたいと思っています。

この場合のスニペットの書き方が分からないので、どなたかお知恵をいただければと思います。
ただ、私の方があいにくとシステム関連に疎いもの、できるだけ分かりやすくお教えいただければ助かります。
以上、宜しくお願い致します。
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: テンプレート変数の状態をチェックしてhtmlを書き出すスニペットを作りたい

投稿記事 by kazuike »

StartIf、EndIf等、このあたりのスニペット、けっこう作ってたりしますが、
StartIf、EndIfは、tableに使うには、よろしくないということもありますので、
簡単な例を書いておきますね。(PHPの基本的な文法はわかるとうい前提で)

コード: 全て選択

<?php
$tmplvar_value = '';    // テンプレート変数の値用(入力があった場合ここに入れる)
$tags = '';             // 出力するタグ:テンプレート変数に入力が無かった場合のタグはここに入れておく
$tmplvar_info = $modx->getTemplateVar(項目1);    // テンプレート変数「項目1」の情報を取得(*1)
if ($tmplvar_info !== FALSE) {	// 問題なく情報が取得できた場合
    $tmplvar_value = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}
if ($tmplvar_value !== '') {   // 入力値が空でない場合
    // 以下、出力するタグを生成
    $tags = '<tr><td>項目1のタイトル</td><td>'.$tmplvar_value.'</td></tr>';
}
return $tags;
?>
(*1)項目1の箇所を'hogehoge'等、テンプレート変数名の文字列に置き換えてください。
ちなみに、ウィジェット等は特に考えず、入力値そのままを使っています。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
monamaster
メンバー
メンバー
記事: 13
登録日時: 2010年9月10日(金) 15:34

Re: テンプレート変数の状態をチェックしてhtmlを書き出すスニペットを作りたい

投稿記事 by monamaster »

早速、お知恵を頂きありがとうございます。
とても感謝しています。
ただ、

コード: 全て選択

<?php
$tmplvar_value = '';    // テンプレート変数の値用(入力があった場合ここに入れる)
$tags = '';             // 出力するタグ:テンプレート変数に入力が無かった場合のタグはここに入れておく
$tmplvar_info = $modx->getTemplateVar(項目1);    // テンプレート変数「項目1」の情報を取得(*1)
if ($tmplvar_info !== FALSE) {   // 問題なく情報が取得できた場合
    $tmplvar_value = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}
if ($tmplvar_value !== '') {   // 入力値が空でない場合
    // 以下、出力するタグを生成
    $tags = '<tr><td>項目1のタイトル</td><td>'.$tmplvar_value.'</td></tr>';
}
return $tags;
?>
をテストし、確かに項目1は表示されましたが、項目2を表示させようと思うと、そこで詰まってしまいました。
コードは以下のような記述にしてみました(というか、「項目2」を機械的に追加しただけですが)。

コード: 全て選択

<?php
$tmplvar_value = '';    // テンプレート変数の値用(入力があった場合ここに入れる)
$tags = '';             // 出力するタグ:テンプレート変数に入力が無かった場合のタグはここに入れておく
$tmplvar_info = $modx->getTemplateVar(項目1);    // テンプレート変数「項目1」の情報を取得(*1)
if ($tmplvar_info !== FALSE) {   // 問題なく情報が取得できた場合
    $tmplvar_value = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}
if ($tmplvar_value !== '') {   // 入力値が空でない場合
    // 以下、出力するタグを生成
    $tags = '<tr><td>項目1のタイトル</td><td>'.$tmplvar_value.'</td></tr>';
}
return $tags;

$tmplvar_value = '';    // テンプレート変数の値用(入力があった場合ここに入れる)
$tags = '';             // 出力するタグ:テンプレート変数に入力が無かった場合のタグはここに入れておく
$tmplvar_info = $modx->getTemplateVar(項目2);    // テンプレート変数「項目1」の情報を取得(*1)
if ($tmplvar_info !== FALSE) {   // 問題なく情報が取得できた場合
    $tmplvar_value = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}
if ($tmplvar_value !== '') {   // 入力値が空でない場合
    // 以下、出力するタグを生成
    $tags = '<tr><td>項目2のタイトル</td><td>'.$tmplvar_value.'</td></tr>';
}
return $tags;
?>
これでテストすると「項目1」は表示されるのですが、「項目2」は表示されません。
「return $tags;」を最後に一つだけにすると「項目2」は表示されますが、「項目1」は表示されません。
※どちらも値が入っている場合。同じ変数なので、当たり前といえば当たり前なんでしょうが…
下記のようにしても同じでした。

コード: 全て選択

<?php
$tmplvar_value = '';    // テンプレート変数の値用(入力があった場合ここに入れる)
$tags = '';             // 出力するタグ:テンプレート変数に入力が無かった場合のタグはここに入れておく
$tmplvar_info = $modx->getTemplateVar(項目1);    // テンプレート変数「項目1」の情報を取得(*1)
if ($tmplvar_info !== FALSE) {   // 問題なく情報が取得できた場合
    $tmplvar_value = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}
if ($tmplvar_value !== '') {   // 入力値が空でない場合
    // 以下、出力するタグを生成
    $tags = '<tr><td>項目1のタイトル</td><td>'.$tmplvar_value.'</td></tr>';
}
return $tags;

$tmplvar_value2 = '';    // テンプレート変数の値用(入力があった場合ここに入れる)
$tags = '';             // 出力するタグ:テンプレート変数に入力が無かった場合のタグはここに入れておく
$tmplvar_info2 = $modx->getTemplateVar(項目2);    // テンプレート変数「項目1」の情報を取得(*1)
if ($tmplvar_info2 !== FALSE) {   // 問題なく情報が取得できた場合
    $tmplvar_value2 = $tmplvar_info['value'];    // テンプレート変数の入力値を取得
}
if ($tmplvar_value2 !== '') {   // 入力値が空でない場合
    // 以下、出力するタグを生成
    $tags = '<tr><td>項目2のタイトル</td><td>'.$tmplvar_value2.'</td></tr>';
}
return $tags;
?>
やはり「return $tags;」を最後に一つだけにしても「項目2」しか表示されませんでした。

「項目1」と「項目2」を同時に表示させる(入力の有無によりそれぞれ表示させる)ためにはどこをどのように変更すればよいのでしょうか?
たぶん、2つまで表示できれば(例題を工夫して)あとは増やせると思うので、宜しくお願い致します。
なお、当方デザイン系なのでphpは…全然、素人です。申し訳ない…
soushi
管理人
記事: 224
登録日時: 2009年7月30日(木) 01:59

Re: テンプレート変数の状態をチェックしてhtmlを書き出すスニペットを作りたい

投稿記事 by soushi »

soushi in OSCです、

昨日、返信書きながら寝てしまいました(笑)
以下のような設定はどうでしょうか。

[テンプレート変数 1つめ]
変数名:Str1
入力タイプ:Text

[テンプレート変数 2つめ]
変数名:Str2
入力タイプ:Text

[スニペット]

コード: 全て選択

<?php
$rslt ='';
$titile=array();
$titile['Str1']='タイトル1';
$titile['Str2']='タイトル2';

foreach( $titile as $key => $val){
  $tv = $modx->getTemplateVar($key);
  if( !empty($tv['value']) ){
    $rslt .= '<tr><td>'.$val.'</td><td>'.$tv['value'].'</td></tr>'."\n";
  }
}
echo $rslt;
?>
テンプレート変数を増やす場合はスニペット内の$title変数にも項目を追加する必要があります。
monamaster
メンバー
メンバー
記事: 13
登録日時: 2010年9月10日(金) 15:34

Re: テンプレート変数の状態をチェックしてhtmlを書き出すスニペットを作りたい  【解決済み】

投稿記事 by monamaster »

soushi 様

素晴らしい!!
うまく行きました。
変数部分を増やすだけで済むので、メンテナンスも楽々です。非常にグレートです!!
soushi さんが書きました: 昨日、返信書きながら寝てしまいました(笑)
とのこと、さぞやお疲れの事だったでしょう。
その中、私の拙い質問に答えていただき申し訳ありません。
soushi 様並びにkazuike 様に感謝いたします。ありがとうございました。
返信する