Smarty3 + CakePHP3로 쉽게 파일 출력

5241 단어 Smarty3cakephp3

하고 싶은 일



템플릿 파일을 준비하고 사용자가 양식에서 입력한 값을 포함하고 싶습니다!
그리고 값을 포함한 결과를 파일 출력하고 싶다!

환경



CakePHP: 3.5.6
CentOS: 7.4
Smarty: 3.1

Smarty를 만진 적이 없었기 때문에, 만져 보는 것에.

절차



Smarty 설정



composer에서 설치


composer require smarty/smarty:~3.1

디렉토리 작성


smarty-sample/  ・・・CakeのROOTディレクトリ
  smarty/
    templates/  ・・・テンプレートファイル(.tpl)の設置先
    templates_c/  ・・・コンパイル結果出力先
    cache/ ・・・キャッシュファイル出力先
  files/  ・・・テンプレート埋め込み後のファイル保存先

apache 사용자가 쓸 수 있도록 합니다.
chmod 0777 smarty/templates_c smarty/cache/
chmod 0777 files

PATH 설정



사용하기 쉽도록 paths.php에 씁시다.
// config/paths.phpに追記
# Smarty用ディレクトリ
define('SMARTY_TEMPLATE_DIR', ROOT . DS . 'smarty' . DS . 'templates' . DS);
define('SMARTY_COMPILE_DIR', ROOT . DS . 'smarty' . DS . 'templates_c' . DS);
define('SMARTY_CACHE_DIR', ROOT . DS . 'smarty' . DS . 'cache' . DS);
define('SMARTY_CONFIG_DIR', ROOT . DS . 'smarty' . DS . 'config' . DS);

# ファイル出力用ディレクトリ
define('FILE_DIR', ROOT . DS . 'files' . DS);

클래스 확장


<?php
namespace App\Lib;

use Smarty;

class AppSmarty extends Smarty
{

    function __construct()
    {
        parent::__construct();

        // paths.phpに書いた値を使って初期化
        $this->template_dir = SMARTY_TEMPLATE_DIR;
        $this->compile_dir = SMARTY_COMPILE_DIR;
        $this->config_dir = SMARTY_CONFIG_DIR;
        $this->cache_dir = SMARTY_CACHE_DIR;
    }

}

?>

이제 AppSmarty를 use해 주면 이용 가능합니다!

샘플



드디어 샘플을 만들었습니다.

tpl 파일



smarty/templates/hello.tpl
私の名前は {$name} です!

{$comment}

◯ 食べたいもの
{foreach $favorites as $key => $val}
・{$val}
{/foreach}

smarty/templates/hello2.tpl
名前: {$name}
コメント: {$comment}
好きな食べ物:
{foreach $favorites as $key => $val}
    ・{$val}
{/foreach}

배열을 전달할 수도 있습니다.

컨트롤러



TutorialController.php
<?php
namespace App\Controller;

use App\Controller\AppController;

// AppSmartyの読み込み
use App\Lib\AppSmarty;
use Cake\Filesystem\File;

class TutorialController extends AppController
{
    public function add()
    {

        if ($this->request->is('post')) {
            // 1. インスタンスを作成
            $smarty = new AppSmarty();

            // 2. リクエストデータを変数を割り当て
            // $this->assign(template内変数, 割り当てる値)
            foreach ($this->request->getData() as $key => $val) {
                $smarty->assign($key, $val);
            }

            // 3. fetch('template file')で変数の割当後の値を取得
            // assignした値を使って複数のtemplateを利用することができる
            $hello1 = $smarty->fetch('hello1.tpl');
            $hello2 = $smarty->fetch('hello2.tpl');

            // 4. Fileユーティリティを利用して結果を出力
            (new File(FILE_DIR . 'hello1.txt'))->write($hello1);
            (new File(FILE_DIR . 'hello2.txt'))->write($hello2);
        }

    }
}

보기



add.ctp
<fieldset>
    <?= $this->Form->create(
        null,
        [
            'url' => [
                'controller' => 'Tutorial',
                'action' => 'add'
            ]
        ]) ?>
    <?= $this->Form->input('name') ?>
    <?= $this->Form->input('comment') ?>

    <?= $this->Form->select(
        'favorites',
        [
            ['text' => 'カレー', 'value' => 'カレー'],
            ['text' => 'カツ丼', 'value' => 'カツ丼'],
            ['text' => '焼肉', 'value' => '焼肉'],
        ],
        [
            'multiple' => 'checkbox'
        ]
    ) ?>

    <?= $this->Form->button(__('submit')) ?>
    <?= $this->Form->end() ?>
</fieldset>

현재 21:30. 식욕이 ctp 파일에 여실히 나타납니다.

post해봐





Let's post! !

결과


[fusic@localhost smarty-sample]$ cat files/hello1.txt
私の名前は koga です!

お腹すいた。。

◯ 食べたいもの
・カレー
・焼肉

[fusic@localhost smarty-sample]$ cat files/hello2.txt
名前: koga
コメント: お腹すいた。。
好きな食べ物:
 ・カレー
 ・焼肉

값이 포함된 결과가 제대로 출력되었습니다! !

요약


  • Smarty와 File 유틸리티로 쉽게 파일을 출력할 수 있었습니다!
  • template의 궁리 나름으로 여러가지 할 수 있을지도?

  • 참고 링크



    Smarty3 매뉴얼
    폴더 및 파일

    좋은 웹페이지 즐겨찾기