【PHP・Smarty?】PHPファイルから tplファイルへ値を渡したい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 614
現在『 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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+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());
この直前で呼び出すとどうなりますか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2019/08/22 16:46
通常はPHP側からassign()してview読み込みしたら使えるんですけど、
$this->Set()の挙動次第ですね。
私も初めて聞いたOSSなので実際に入れてみて確認するしかなさそう。
無償版でも再現できますかね?
m.ts10806
2019/08/22 16:47
おぉ・・30日間試用版しかないのか。
azuapricot
2019/08/22 16:49
(導入したの私じゃないのでどうなんでしょう・・・!)
ただ、booked インストールの仕方は↓に一応のせておきます
https://qiita.com/ykoji1112/items/14995071ff991ec7e533
(ダメ元で質問させて頂いてるので回答する質問がなくなったときにで大丈夫です。。。笑)
azuapricot
2019/08/22 16:50
とりあえずassign()してる場所探して眺めてみます。。。
m.ts10806
2019/08/22 16:53
たぶんSet()がラッパーっぽいのでそこにあるとは思います。
あとは呼び出せてるかどうかかなと。
m.ts10806
2019/08/22 17:15
>https://qiita.com/ykoji1112/items/14995071ff991ec7e533
半分以上XAMPP導入ですね・・
ちょっと見てるところが違ったみたいで、ダウンロードできました。
私が見てたところは有償版のトライアルっぽいです。
勘で回答してしまってますが、私の方も導入してみてみます
azuapricot
2019/08/22 17:16
ReservationComponentBinder.php っていうファイルのところに、
/**
* @var IExistingReservationPage
*/
private $page;
$this->page->SetTitle($this->reservationView->Title);
っていう記述が・・・
ここに・・・かいて・・・あげれば・・・もしかしたら・・・・ためしてみます・・・・・
azuapricot
2019/08/22 17:21
ウワアアアアアアアアアアアアアアア!表示されたああああああああ!ヤッターーーーー!!!!!!!
m.ts10806
2019/08/22 17:23
よかったよかった
ただ私の適当回答をベストアンサーにするのは・ちょっと、、、
azuapricot
2019/08/22 17:27
いえ、呼び出されてないって気づいてなかったので・・・
呼び出し部分を探したら万事解決もーまんたいでした。
ナイスな助言でした!!◎◎◎
m.ts10806
2019/08/22 17:29
いえいえ。コード内に呼びだしがないなぁって思っただけなので。
もしかしたら親の親の親の・・基盤のほうで「定義したら勝手に呼びだしてる機能がある」可能性もあったので、探ってみる必要はあるかなと思って、ちょうどダウンロードしてコードだけ見てるところでした。
azuapricot
2019/08/22 17:33
ダウンロードまでして頂きありがとうございました!
私は無能だったので「function SetTest($test);」が呼び出し部分だとめちゃくちゃ勘違いしてました()
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マニュアルですね。