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

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

ただいまの
回答率

89.13%

PHPによるデータの受け渡し処理でエラーが発生しております

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,726

shinya.g

score 10

ワードプレスの他者様作成のプラグインを改造しております。
使用しているプラグインはmts-simple-booking-cと言うものですが、既に開発者の方のWebは閉じられており、配布も行われておりません。 
http://www.amagistudio.com/reservedemonstration/ 
上記サイトよりmts-simple-booking-cを改造されたものをダウンロードし、さらに改造しております。

現在、下記の処理の流れの中で、「予約フォーム内のデータを引用して確認メール送信」の箇所でエラーが発生しております。
予約フォームにデータ入力>>各種チェック>>データベースへ登録>>予約フォーム内のデータを引用して確認メール送信

表示エラー

Notice: Undefined property: MTSSSB_Simple_Booking::$booking_form in /Applications/MAMP/htdocs/test/wp-content/plugins/mts-simple-booking-guy_006/mtsssb-mail.php on line 47
Fatal error: Call to a member function getBooking() on null in /Applications/MAMP/htdocs/test/wp-content/plugins/mts-simple-booking-guy_006/mtsssb-mail.php on line 47

該当すると思われるファイル
/mts-simple-booking-guy_006/
┣mtsssb-simple-booking.php
┣mtsssb-booking-form.php
┗mtsssb-mail.php

mtsssb-simple-booking.php
下記、エラーが起きている箇所の処理の抜粋になります。
$mail = $this->_load_module('MTSSSB_Mail');の処理でエラーが発生しております。

$mtsssb_simple_booking = new MTSSSB_Simple_Booking();
class MTSSSB_Simple_Booking {
    /**
     * 予約登録・メール送信処理内部ディスパッチャー
     *
     */
    public function internal_dispatcher() {

        $action = isset($_POST['action']) ? $_POST['action'] : '';

        if (is_page(self::PAGE_BOOKING_FORM)) {
            if ($action == 'confirm') {
                $booking_form = $this->_load_module('MTSSSB_Booking_Form');
                if ($booking_form->front_booking()) {
                    $mail = $this->_load_module('MTSSSB_Mail');
…

mtsssb-mail.php
下記、エラーが起きている箇所の処理抜粋になります。
$booking = $mtsssb_simple_booking->booking_form->getBooking();の行でエラーが出ております。

<?php
class MTSSSB_Mail {

    /**
     * 予約登録のメール
     *
     */
    public function booking_mail() {
        global $mtsssb_simple_booking;

        $booking = $mtsssb_simple_booking->booking_form->getBooking();

        // 予約IDの生成
        $reserve_id = date('ymd', $booking['booking_time']) . substr("00{$booking['booking_id']}", -3);

        // 予約者情報
        $adda = array($booking['client']['name'], $reserve_id);

        // メールテンプレートの読込み
        $template = get_option($this->domain . '_reserve');

        // メール文生成
        $body = $this->_booking_content($booking, $template);

        // クライアント
        $subject = $template['title'];
        $client_content = $this->_replace_variable($template['header'], $adda) . $body . $this->_replace_variable($template['footer'], $adda);
        $client_to = $booking['client']['email'];
        if (!empty($client_to)) {
            $client_ret = wp_mail($client_to, $subject, $client_content, $this->fromshop);
        }
    }
}

mtsssb-simple-booking.php
下記、今回のエラーで該当するであろう部分を抜粋しております。
少し長くなり申し訳ございません。

<?php
if (!class_exists('MTSSSB_Booking')) {
    require_once(dirname(__FILE__) . '/mtsssb-booking.php');
}
class MTSSSB_Booking_Form extends MTSSSB_Booking {
    const PAGE_NAME = 'mtsssb_booking-form';

    /**
     * フォーム入力予約登録処理
     *
     */
中略
        // 予約データを正規化し、登録データを取得する
        $this->booking = $this->normalize_booking($_POST['booking'], $this->article['count']);

中略
        // 予約を新規登録する
        $booking_id = $this->add_booking();
        if (!$booking_id) {
            $this->err_message = $this->_err_message('ERROR_ADD_BOOKING');
            return false;
        }
        $this->booking['booking_id'] = $booking_id;
        return $booking_id;
    }

    /**
     * ステータス別予約フォーム処理
     *
     */
    public function booking_form($content) {

        // 予約登録処理実行の後処理
        $action = isset($_POST['action']) ? $_POST['action'] : '';
        if ($action == 'confirm') {
            if (empty($this->err_message)) {
                echo 'ご予約ありがとうございました。';
            }
            return $this->_out_errorbox();
        }
中略

            // 予約データを正規化し、登録データを取得する
            $this->booking = $this->normalize_booking($_POST['booking'], $this->article['count']);
中略
    /**
     * お客様入力フォームの表示
     *
     */
    protected function _input_form() {
        global $current_user;

        $url = get_permalink();
        $client = $this->booking['client'];

中略

        // ログイン中であればログインユーザー情報をセットする
        if (is_user_logged_in() && empty($client['name']) && empty($client['email'])) {
            get_currentuserinfo();
中略
            $client['name'] = $current_user->last_name . ' ' . $current_user->first_name;
            $client['email'] = $email2 = $current_user->user_email;
中略
        }

        ob_start();
?>

<?php
    /**
     * 予約入力確認フォームの表示
     *
     */
    protected function _confirming_form() {

        $url = get_permalink();
        $client = $this->booking['client'];

        // オプション追加選択の処理
        if ($this->article['addition'] == 1) {
            $options = get_option($this->domain . '_option');
        }

        ob_start();
?>

<div id="mtsssb_booking-form" class="content-form">

<form method="post" action="<?php echo $url ?>">
    <fieldset id="booking-confirm-fieldset">
    <legend><?php echo apply_filters('booking_form_confirm_title', 'ご予約内容の確認') ?></legend>
    <table>
        <tr>
            <th>ご宿泊日</th>
            <td><?php echo esc_html($this->article['name']) ?><br />
                <?php echo apply_filters('booking_form_date', date('Y年n月j日 ', $this->booking['booking_time']), $this->booking['booking_time']) ?><br /><?php echo apply_filters('booking_form_date', date('H時 i分', $this->thetime), $this->thetime) ?> チェクイン可
            </td>
        </tr>
中略

                <?php echo nl2br(esc_html($this->booking['note'])) ?>
                <input type="hidden" name="booking[note]" value="<?php echo esc_textarea($this->booking['note']) ?>" />
            </td>
        </tr>
    </table>
    </fieldset>

    <div id="action-button" style="text-align: center">
        <?php echo apply_filters('booking_form_submit_button', '<button type="submit" name="reserve_action" value="validate">予約する</button>'); ?>
    </div>
    <input type="hidden" name="nonce" value="<?php echo wp_create_nonce("{$this->domain}_" . self::PAGE_NAME) ?>" />
    <input type="hidden" name="booking[article_id]" value="<?php echo $this->article_id ?>" />
    <input type="hidden" name="booking[booking_time]" value="<?php echo $this->thetime ?>" />
    <input type="hidden" name="action" value="confirm" />
    <input type="hidden" name="booking[user_id]" value="<?php echo esc_html($this->booking['user_id']) ?>" />
</form>
</div>
<?php
        return ob_get_clean();
    }


    /**
     * 対象予約品目の参照を戻す
     *
     */
    public function getArticle() {
        return $this->article;
    }

    /**
     * 各種条件設定パラメータの参照を戻す
     *
     */
    public function getControls() {
        return $this->controls;
    }

}

$booking_formやgetBookingの記載がないことが原因かと思われます。
クラスや関数を用いたコードの記載がほとんどないため、どの部分にどのように追記すれば良いのか、
または、$booking = $mtsssb_simple_booking->booking_form->getBooking();の記載方法が正しいのか、
四苦八苦しております。
アドバイスをいただけないでしょうか、よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

Notice: Undefined property: MTSSSB_Simple_Booking::$booking_form in /Applications/MAMP/htdocs/test/wp-content/plugins/mts-simple-booking-guy_006/mtsssb-mail.php on line 47
Fatal error: Call to a member function getBooking() on null in /Applications/MAMP/htdocs/test/wp-content/plugins/mts-simple-booking-guy_006/mtsssb-mail.php on line 47

このエラーメッセージから、

  • MTSSSB_Simple_Booking には $booking_form というプロパティに値が定義されていない
  • ので、MTSSSB_Simple_Booking->booking_form なんてのはないので null になる
  • ので、MTSSSB_Simple_Booking->booking_form->getBooking() は、nullオブジェクトからの呼び出しになるから、そんなものはない!で怒られる

ということが分かります。

class MTSSSB_Simple_Booking {
    /**
     * 予約登録・メール送信処理内部ディスパッチャー
     *
     */
    public function internal_dispatcher() {

        $action = isset($_POST['action']) ? $_POST['action'] : '';

        if (is_page(self::PAGE_BOOKING_FORM)) {
            if ($action == 'confirm') {
                $booking_form = $this->_load_module('MTSSSB_Booking_Form');
                if ($booking_form->front_booking()) {
                    $mail = $this->_load_module('MTSSSB_Mail');

これだと $booking_form がローカル変数になっていて、このクラスのインスタンスのプロパティである booking_form にはなりません。
$this->booking_form にしないと。
※たぶん $mail も同じ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/30 11:03

    アドバイスありがとうございます。
    おっしゃっている内容は何となく理解できるので、調べつつ努力してみます。

    キャンセル

0

メール送信、無事にできるようになりました。
ありがとうございます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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