質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.22%

【PHP・Smarty?】PHPファイルから tplファイルへ値を渡したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 614

azuapricot

score 2233

現在『  booked  』 という予約管理システムのオープンソースを改修しています。

booked は 画面表示に tplファイルを使うらしく、
試しに画面に1項目増やしてみているのですが、値が表示されません。

以下該当コードとなります。

データ格納部分

<?php

require_once(ROOT_DIR . 'Pages/Reservation/ReservationPage.php');

interface IExistingReservationPage extends IReservationPage
{

// 省略

    /**
     * @param $test string
     */
    // 追加部分
    function SetTest($test);
}

class ExistingReservationPage extends ReservationPage implements IExistingReservationPage
{
    protected $IsEditable = false;
    protected $IsApprovable = false;

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

    public function PageLoad()
    {
        parent::PageLoad();
    }

    protected function GetPresenter()
    {
        $preconditionService = new EditReservationPreconditionService();
        $reservationViewRepository = new ReservationViewRepository();

        return new EditReservationPresenter($this,
                                            $this->LoadInitializerFactory(),
                                            $preconditionService,
                                            $reservationViewRepository);
    }

    protected function GetTemplateName()
    {
        $readOnly = $this->GetQuerystring(QueryStringKeys::READ_ONLY) == 1;

        if (!$readOnly && $this->IsApprovable && !$this->UpdatingBeforeApproving())
        {
            return 'Reservation/approve.tpl';
        }
        if (!$readOnly && $this->IsEditable)
        {
            return 'Reservation/edit.tpl';
        }
        return 'Reservation/view.tpl';
    }

    protected function GetReservationAction()
    {
        return ReservationAction::Update;
    }

    public function SetAdditionalResources($additionalResourceIds)
    {
        $this->Set('AdditionalResourceIds', $additionalResourceIds);
    }

   // 試しに追加してみたところ
    public function SetTest($test)
    {
        $this->Set('Testtest', "Testtest");
    }
}

class DuplicateReservationPage extends ExistingReservationPage
{
    public function __construct()
    {
        parent::__construct();
        $this->Set('Title', Resources::GetInstance()->GetString('DuplicateReservation'));
    }

    protected function GetTemplateName()
    {
        return 'Reservation/create.tpl';
    }

    public function PageLoad()
    {
        parent::PageLoad();

        $this->Set('ReturnUrl', urldecode($this->GetQuerystring('return')));
    }

    protected function GetReservationAction()
    {
        return ReservationAction::Create;
    }

    protected function GetReturnUrl()
    {
        return urldecode($this->GetQuerystring(QueryStringKeys::REDIRECT));
    }

    public function SetTermsAccepted($accepted)
    {
        $this->Set('TermsAccepted', false);
    }
}

継承元ファイル(特に変更なし)

<?php

require_once(ROOT_DIR . 'Pages/SecurePage.php');
require_once(ROOT_DIR . 'Presenters/Reservation/ReservationPresenter.php');

interface IReservationPage extends IPage
{
    /**
     * @param $startPeriods array|SchedulePeriod[]
     * @param $endPeriods array|SchedulePeriod[]
     * @parma $lockDates bool
     */
    public function BindPeriods($startPeriods, $endPeriods, $lockPeriods);

    /**
     * @param $resources array|ResourceDto[]
     */
    public function BindAvailableResources($resources);

    /**
     * @param $accessories Accessory[]
     */
    public function BindAvailableAccessories($accessories);

    /**
     * @param IResource $resource
     */
    public function SetReservationResource($resource);

    /**
     * @param ReservationUserView[] $participants
     */
    public function SetParticipants($participants);

    /**
     * @param ReservationUserView[] $invitees
     */
    public function SetInvitees($invitees);

    /**
     * @param $accessories ReservationAccessory[]|array
     */
    public function SetAccessories($accessories);

    /**
     * @param $attachments ReservationAttachmentView[]|array
     */
    public function SetAttachments($attachments);

    /**
     * @param bool $canShowAdditionalResources
     */
    public function ShowAdditionalResources($canShowAdditionalResources);

    /**
     * @param TermsOfService $termsOfService
     */
    public function SetTerms($termsOfService);

    /**
     * @param bool $accepted
     */
    public function SetTermsAccepted($accepted);
}

abstract class ReservationPage extends Page implements IReservationPage
{
    protected $presenter;
    protected $available = true;

    /**
     * @var PermissionServiceFactory
     */
    protected $permissionServiceFactory;

    public function __construct($title = null)
    {
        parent::__construct($title);

        if (is_null($this->permissionServiceFactory))
        {
            $this->permissionServiceFactory = new PermissionServiceFactory();
        }
    }

    /**
     * @return IReservationPresenter
     */
    protected abstract function GetPresenter();

    /**
     * @return string
     */
    protected abstract function GetTemplateName();

    /**
     * @return string
     */
    protected abstract function GetReservationAction();

    public function PageLoad()
    {
        $this->presenter = $this->GetPresenter();
        $this->presenter->PageLoad();

        $this->Set('ReturnUrl', $this->GetReturnUrl());
        $this->Set('ReservationAction', $this->GetReservationAction());
        $this->Set('MaxUploadSize', UploadedFile::GetMaxSize());
        $this->Set('MaxUploadCount', UploadedFile::GetMaxUploadCount());
        $this->Set('RepeatEveryOptions', range(1, 20));

        if ($this->IsUnavailable())
        {
            $this->RedirectToError(ErrorMessages::RESERVATION_NOT_AVAILABLE);
            return;
        }

        $this->Display($this->GetTemplateName());
    }

    public function BindAvailableResources($resources)
    {
        $this->Set('AvailableResources', $resources);
    }

    public function SetReservationResource($resource)
    {
        $this->Set('ResourceName', $resource->GetName());
        $this->Set('ResourceId', $resource->GetId());
        $this->Set('Resource', $resource);
    }

    public function ShowReservationDetails($showReservationDetails)
    {
        $this->Set('ShowReservationDetails', $showReservationDetails);
    }

    public function HideRecurrence($isHidden)
    {
        $this->Set('HideRecurrence', $isHidden);
    }

    protected function GetReturnUrl()
    {
        $redirect = $this->GetQuerystring(QueryStringKeys::REDIRECT);
        if (!empty($redirect))
        {
            return $redirect;
        }
        return $this->GetLastPage(Pages::SCHEDULE);
    }

    protected function LoadInitializerFactory()
    {
        $userRepository = new UserRepository();
        return new ReservationInitializerFactory(
                new ScheduleRepository(), $userRepository, new ResourceService(new ResourceRepository(),
                                                                               $this->permissionServiceFactory->GetPermissionService(),
                                                                               new AttributeService(new AttributeRepository()),
                                                                               $userRepository,
                                                                               new AccessoryRepository()),
                new ReservationAuthorization(AuthorizationServiceFactory::GetAuthorizationService())
        );
    }

    public function SetAvailability(DateRange $availability)
    {
        $this->Set('AvailabilityStart', $availability->GetBegin());
        $this->Set('AvailabilityEnd', $availability->GetEnd());
    }

    public function SetTerms($termsOfService)
    {
        $this->Set('Terms', $termsOfService);
    }
}

create.tpl (画面テンプレート)

ダメ元で追加してみた(もちろん表示されなかった)

該当する tpl_cファイル を削除して再生成しても同様。。。

<p>
  { $Testtest }
</p>

画面出力確認結果

<p>

</p>

↑ pタグは出てるけどセットしたはずの Testtest は出力されなかった


ざっくりしすぎてるのでダメ元で質問させていただいてます。。。

smartyとやらも使われてるらしく、どこかに記述が足りないんじゃないかとは思うのですが中々見つけられず・・・。

お時間ある方で、tplファイルにPHPからデータ渡したことある方や、

お気づきの点ある方いらっしゃいましたらご助力頂けますと幸いです。。。

足りない情報等あればお申し付け下さい。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/08/22 17:36

    interfaceなのでメンバーの定義だけですね。
    https://www.php.net/manual/ja/language.oop5.interfaces.php
    で当該メンバーの実装もされているところまではOKでした。

    キャンセル

  • azuapricot

    2019/08/22 17:40

    うわぁ・・・ほんとですね・・・・
    interface 実装してるだけじゃん・・・もっとちゃんと見ておくべきだった(無能)
    理解が深まりました・・・解決後もありがとうございます(感涙)

    キャンセル

  • m.ts10806

    2019/08/22 17:49

    困ったときのPHPマニュアルですね。

    キャンセル

回答 2

+1

一応記述が足りなかった場所を書いておきます

ReservationComponentBinder.php

booked > lib > Application > Reservation > ReservationComponentBinder.php

(皆さんの階層がこれと同じかはわかりませんが・・・)

class ReservationDetailsBinder implements IReservationComponentBinder
{
  public function Bind(IReservationComponentInitializer $initializer)
    {
         // ここが呼び出し部分じゃった
        $this->page->SetTest($this->reservationView->Title);

}

これを足したら・・・

イメージ説明

2日かかった・・・m.ts10806さんありがとうございました(感涙)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

今のコード見た限りの勘で答えてみます。(外してたらすみません)
SetTest()自体は今のところ実装だけでどこからも呼び出されてないように見えます。
Smartyはview呼び出しの前までにassignされた変数がview側で使えるようになるはずなので、
例えば・・・・
$this->Display($this->GetTemplateName());
この直前で呼び出すとどうなりますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/22 17:22

    うわ~~~~~~ m.ts10806さんのおかげで表示されましたヤッタアアアアアア!

    勘のとおりで、呼び出していたつもりで呼び出していませんでした・・・・
    ナイスなヒントありがとうございます!!!!!
    助かりました~~~~~~~!!!!

    キャンセル

  • 2019/08/22 17:24

    結構入り組んでる感じですね。
    むかしCMS(XOOPS)の改修とかやったことあるんですけど、
    あっちこっちいってて分かりづらかった記憶があります。そういえばXOOPSもviewはSmartyですね。
    解決されたようで何よりです

    キャンセル

  • 2019/08/22 17:29

    PHP案件はいくつかやったことがありますがここまで入り組んでるやつは初めてでした・・・

    キャンセル

  • 2019/08/22 17:30

    CMSは結構えげつないですよ。
    IDEないと追うの無理です

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る