/** * プラグイン規定関数::ブロック型で呼び出された場合の処理 * 認証済みの場合: 再視聴対象選択画面を生成する * 未認証の場合: エラー画面を生成する * * 引数: なし * * @return string 画面(html) */ function plugin_movieviewer_review_convert() { try { $user = plugin_movieviewer_get_current_user(); } catch (MovieViewerRepositoryObjectNotFoundException $ex) { return plugin_movieviewer_convert_error_response("ログインが必要です。"); } $plugin_args = func_get_args(); try { plugin_movieviewer_review_assert_plugin_arguments($plugin_args); } catch (Exception $ex) { return plugin_movieviewer_convert_error_response("プラグインの引数が設定されていません。"); } $start_page_bank = $plugin_args[0]; $start_page_credit = $plugin_args[1]; $viewing_periods = plugin_movieviewer_get_viewing_periods_by_user_repository()->findById($user->id); $requests_not_yet_confirmed = plugin_movieviewer_get_review_pack_purchase_request_repository()->findNotYetConfirmed($user->id); $hsc = "plugin_movieviewer_hsc"; // 期限の切れているものをリストアップ $viewing_periods = $viewing_periods->getExpiredPeriods(); // コースごとに分類 $viewing_periods_by_course = MovieViewerViewingPeriod::sortByCourse($viewing_periods); $courses = plugin_movieviewer_get_courses_repository()->find(); $content_courses = ""; foreach ($viewing_periods_by_course as $course_id => $periods) { $course = $courses->getCourse($course_id); $content_periods = ""; foreach ($periods as $period) { if (MovieViewerReviewPackPurchaseRequest::requestsHasItem($requests_not_yet_confirmed, $course_id, $period->session_id)) { continue; } $session = $course->getSession($period->session_id); $field_id = "{$hsc($course->id)}_{$hsc($session->id)}"; $content_periods .= <<<TEXT <label class='movie-session' for="{$field_id}">{$session->describe()}</label> <input class='movie-session' type="checkbox" name="sessions" id="{$field_id}" value="{$field_id}"> TEXT; } if ($content_periods === "") { continue; } $content_course = <<<TEXT <div class='movieviewer-course'> <h3>{$hsc($course->name)}</h3> <fieldset style='border: none;'> {$content_periods} </fieldset> </div> TEXT; $content_courses .= $content_course; } $uri_start_bank = plugin_movieviewer_get_script_uri() . "?{$start_page_bank}&purchase_method=bank"; $uri_start_credit = plugin_movieviewer_get_script_uri() . "?{$start_page_credit}&purchase_method=credit"; $buttons_payment = <<<TEXT <a href="{$uri_start_bank}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>銀行振り込みで申し込み</a> TEXT; $settings = plugin_movieviewer_get_global_settings(); if ($settings->payment->isCreditEnabled()) { $buttons_payment .= <<<TEXT <a href="{$uri_start_credit}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>クレジットカードで申し込み</a> TEXT; } $content = <<<TEXT <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> <link href="https://code.jquery.com/ui/1.12.0/themes/cupertino/jquery-ui.css" rel="stylesheet"> <script src="plugin/movieviewer/assets/js/movieviewer_review.js"></script> <link href="plugin/movieviewer/assets/css/movieviewer.css" rel="stylesheet"> <link href="plugin/movieviewer/assets/css/movieviewer_review.css" rel="stylesheet"> <style> </style> <h2>再視聴可能な単元</h2> <p> 再視聴したい単元を選択して、申し込みボタンを押してください。 </p> <p> <ul style='margin-left:0;'> <li>1回にお申込みいただける回数は最大4回分までです。 <li>ご入金後のキャンセル、変更はできません。 <li>視聴可能な単元(通常受講分)がある場合、平行してご覧いただけます。 </ul> </p> {$content_courses} <div style="margin-top:10px;"> {$buttons_payment} <ul style='margin-left:0;margin-top:1.5em;'> <li>再視聴が可能な期間は、1ヵ月のみです。ご入金確認後、約1週間後から視聴が 可能になります。<br>確定した期間については、マイページにてご確認ください。ご自身で期間を指 定することはできません。 <li>複数回の再視聴をお申込みの場合、すべて同時視聴となり、視聴可能期間は 1ヵ月のみとなります。<br>第1回から第4回までを1回分1ヵ月ずつずらして4か月ご覧になりたい場合は、 お手数ですが1回分ずつお申込み下さい。<br>第1回の再視聴が終了してから第2回をお申込みいただくか、 再視聴期間が終わる頃に第2回をお申込み下さい。 </ul> </div> TEXT; return $content; }
/** * [アクション] 入金確定対象の受講申し込み一覧画面を生成する * * @return array ページ名, 画面(html) */ function plugin_movieviewer_review_purchase_confirm_payment_action_confirm() { $page = plugin_movieviewer_get_current_page(); $ids = filter_input(INPUT_POST, 'purchase_requests', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); foreach ($ids as $req_id) { try { plugin_movieviewer_validate_review_pack_request_id($req_id); } catch (MovieViewerValidationException $ex) { return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。"); } } $requests = array(); foreach ($ids as $req_id) { try { $request = plugin_movieviewer_get_review_pack_purchase_request_repository()->findById($req_id); } catch (MovieViewerRepositoryObjectNotFoundException $ex) { return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。"); } $requests[] = $request; } if (count($requests) === 0) { return plugin_movieviewer_action_error_response($page, "申し込みが見つかりません。"); } $date_begin = filter_input(INPUT_POST, 'viewing_perod_date_begin', FILTER_DEFAULT); try { plugin_movieviewer_validate_ymd($date_begin); } catch (MovieViewerValidationException $ex) { return plugin_movieviewer_action_error_response($page, "指定した内容に誤りがあります。"); } $date_begin = new DateTime($date_begin); $settings = plugin_movieviewer_get_global_settings(); $service = new MovieViewerReviewPackPurchaseConfirmationService($settings); usort($requests, "MovieViewerReviewPackPurchaseRequest::compareByMemberId"); $hsc = "plugin_movieviewer_hsc"; $content_rows = ""; foreach ($requests as $request) { $ctrl_value = $hsc($request->getId()); $ctrl_id = $hsc("pr_{$ctrl_value}"); $confirmation = $service->preConfirm($request, $date_begin); $content_row = <<<TEXT <tr> <input type="hidden" name="purchase_requests[]" value="{$ctrl_value}" id="{$ctrl_id}"> <td><label for="{$ctrl_id}">{$hsc($request->getUser()->memberId)}</label></td> <td><label for="{$ctrl_id}">{$hsc($request->getUser()->lastName)} {$hsc($request->getUser()->firstName)}</label></td> <td><label for="{$ctrl_id}">{$hsc($request->getUser()->id)}</label></td> <td><label for="{$ctrl_id}">{$hsc($request->describePack())}</label></td> <td><label for="{$ctrl_id}">{$hsc($request->getDateRequested()->format("Y/m/d H:m:s"))}</label></td> <td>{$hsc($confirmation->getViewingPeriod()->date_begin->format("Y/m/d"))}</td> <td>{$hsc($confirmation->getViewingPeriod()->date_end->format("Y/m/d"))}</td> </tr> TEXT; $content_rows .= $content_row; } $content_requests = <<<TEXT <div> <table class="table purchase-requests"> <thead> <tr> <th>会員番号</th> <th>名前</th> <th>メールアドレス</th> <th>対象</th> <th>申込日</th> <th>視聴期限(開始)</th> <th>視聴期限(終了)</th> </tr> </thead> <tbody> {$content_rows} <tbody> </table> </div> TEXT; $hsc = "plugin_movieviewer_hsc"; $input_csrf_token = "plugin_movieviewer_generate_input_csrf_token"; $action_url = plugin_movieviewer_get_script_uri() . "?cmd=movieviewer_review_purchase_confirm_payment&page={$page}"; $content = <<<TEXT <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script> <link href="https://code.jquery.com/ui/1.12.0/themes/cupertino/jquery-ui.css" rel="stylesheet"> <link href="plugin/movieviewer/assets/css/movieviewer.css" rel="stylesheet"> <h2>入金確認(最終確認)</h2> <p> 以下の申し込みの入金を確定します。確認の上、確定ボタンを押してください。 </p> <h4>確定対象</h4> <p> <form action="{$action_url}" method="POST"> <input type="hidden" name="ope_type" value="execute"> {$input_csrf_token()} {$content_requests} <input type=hidden name="viewing_perod_date_begin" value="{$date_begin->format("Y-m-d")}"> </p> <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only">確定</button> </form> TEXT; return array('msg' => $page, 'body' => $content); }
/** * [ブロック] 視聴画面を生成する * 視聴可能な単元、受講済みの単元を一覧で表示する * * @param array $plugin_args プラグインに設定されている引数 * * @return string 画面(html) */ function plugin_movieviewer_convert_show_contents($plugin_args) { global $script; try { plugin_movieviewer_assert_plugin_arguments($plugin_args); } catch (Exception $ex) { return plugin_movieviewer_convert_error_response("プラグインの引数が設定されていません。"); } $review_page = $plugin_args[0]; $user_id = plugin_movieviewer_get_auth_manager()->getUserId(); $current_user = plugin_movieviewer_get_user_repository()->findById($user_id); $viewing_periods = plugin_movieviewer_get_viewing_periods_by_user_repository()->findById($user_id); $body_valid_courses = plugin_movieviewer_convert_render_courses($viewing_periods->getValidPeriods()); $body_expired_courses = plugin_movieviewer_convert_render_courses($viewing_periods->getExpiredPeriods()); $hsc = "plugin_movieviewer_hsc"; $message_env = ""; if (PLUGIN_MOVIEVIEWER_ENV !== "") { $env = PLUGIN_MOVIEVIEWER_ENV; $message_env = <<<TEXT <div style="position:fixed;top:0px;right:0px;"><p class="caution">環境変更中: {$env}</p></div> TEXT; } $uri_review = plugin_movieviewer_get_script_uri() . "?{$review_page}"; $body = <<<TEXT <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script> <link href="https://code.jquery.com/ui/1.11.4/themes/redmond/jquery-ui.css" rel="stylesheet"> <script src="plugin/movieviewer/assets/js/movieviewer.js"></script> <link href="plugin/movieviewer/assets/css/movieviewer.css" rel="stylesheet"> <link href="//vjs.zencdn.net/5.4/video-js.css" rel="stylesheet"> {$message_env} <div> <h2>視聴可能な単元</h2> </div> <div class="movieviewer-sessions movieviewer-sessions-viewable"> {$body_valid_courses} </div> <div> <h2>受講済みの単元</h2> </div> <a href="{$uri_review}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>再視聴の申し込み</a> <div class="movieviewer-sessions movieviewer-sessions-attended"> {$body_expired_courses} </div> <div id="myModal" title="View Movie"> <div id="myModal_body"></div> </div> <script src="https://vjs.zencdn.net/5.4/video.js"></script> <script src="{$base_uri}/plugin/movieviewer/assets/js/videojs-contrib-hls.min.js"></script> <script type="text/javascript"> window.movieviewer = {}; window.movieviewer.baseUrl = "{$script}"; </script> TEXT; return $body; }
/** * [ブロック] クレジット支払い用の申し込みフォームを生成する * * @param MovieViewerSettings $settings プラグインの設定 * @param MovieViewerUser $user ログインユーザ * @param MovieViewerReviewPackPurchaseRequest $request 申し込み * @param string $request_stash_id 申し込み仮ID * @param string $current_page 画面名 * * @return string フォーム(html) */ function plugin_movieviewer_review_purchase_start_convert_credit($settings, $user, $request, $request_stash_id, $current_page) { // 取引IDに会員番号を利用するため、会員番号がない場合は、クレジットカード支払いはできない if (!$user->hasMemberId()) { return plugin_movieviewer_convert_error_response("クレジットカードの支払いには会員番号が必要です。"); } $paygent_settings = $settings->payment->credit->paygent; $generator = new MovieViewerReviewPackPaygentParameterGenerator($paygent_settings, $user, $request); $return_params = array("cmd" => "movieviewer_review_purchase_start", "request_stash_id" => $request_stash_id); $return_uri = plugin_movieviewer_get_script_uri() . "?" . http_build_query($return_params); $hsc = "plugin_movieviewer_hsc"; $request_details = plugin_movieviewer_review_purchase_start_convert_get_request_details($settings, $request); $content = <<<TEXT <h2>再視聴申し込み</h2> <p> 申し込み内容を確認してください。<br> 「申し込む」ボタンをクリックすると、クレジットカードの支払いページに移動します。<br> 支払いページは、提携の決済代行会社ペイジェントのページになります。<br> </p> <p> 決済の手続きが終了すると当サイトに再び戻ってきますので、それまで手続きを続けてください。 当サイトに戻ってくる前に手続きを中断してしまった場合、購入完了となりませんのでご注意ください。<br> </p> <p> ※ 当研究所では、会員のみなさまのクレジットカード情報は一切お預かりいたしません。<br> </p> {$request_details} ※ クレジット決済画面の表示後、5日以内に入金を完了させてください。<br> 期限が過ぎると、クレジット決済画面が表示されなくなり、入金できなくなります。 </p> <form action="{$paygent_settings["request_uri"]}" method="post"> <input type="hidden" name="trading_id" value="{$generator->getTradingId()}"> <input type="hidden" name="id" value="{$generator->getId()}"> <input type="hidden" name="seq_merchant_id" value="{$generator->getSeqMerchantId()}"> <input type="hidden" name="hc" value="{$generator->getHash()}"> <input type="hidden" name="payment_detail" value="{$generator->getPaymentDetail()}"> <input type="hidden" name="return_url" value="{$return_uri}"> <button type="submit" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>申し込む</button> </form> TEXT; return $content; }
function plugin_movieviewer_get_home_uri() { $settings = plugin_movieviewer_get_global_settings(); $page_home = $settings->pages["home"]; return plugin_movieviewer_get_script_uri() . "?{$page_home}"; }
function generateMessage($user, $context) { $settings = plugin_movieviewer_get_global_settings(); $offer_maker = new MovieViewerDealPackOfferMaker($settings->payment, $user); if (!$offer_maker->canOffer()) { return ''; } $offer = $offer_maker->getOffer(); $req_params = "&deal_pack_id={$offer->getPackId()}"; $start_uri_bank = plugin_movieviewer_get_script_uri() . "?{$context['start_page_bank']}&purchase_method=bank{$req_params}"; $start_uri_credit = plugin_movieviewer_get_script_uri() . "?{$context['start_page_credit']}&purchase_method=credit{$req_params}"; $hsc = "plugin_movieviewer_hsc"; $bank_names_with_notes = nl2br($offer->getPaymentGuide()->bank_transfer->bank_names_with_notes); $price_with_notes = plugin_movieviewer_render_dealpack_offer_price($offer); if ($settings->payment->isCreditEnabled()) { $acceptable_brands = ""; foreach ($offer->getPaymentGuide()->credit_card->acceptable_brands as $brand) { $file_name = "logo_" . strtolower($brand) . ".gif"; $acceptable_brand = <<<TEXT <img src="img/{$file_name}" ALT="{$brand}"> TEXT; $acceptable_brands .= $acceptable_brand; } $money_transfer_info = <<<TEXT <tr><th rowspan=2>振込先</th><th width=45%>利用可能な銀行</th><th width=45%>利用可能なクレジットカード</th></tr> <tr> <td>{$bank_names_with_notes}</td> <td style='vertical-align:top;'>{$acceptable_brands}</td> </tr> TEXT; } else { $money_transfer_info = <<<TEXT <tr><th>振込先</th><td colspan=2>{$bank_names_with_notes}</td></tr> TEXT; } $bank_transfer_info = <<<TEXT <p> <table class="movieviewer-payment-guide"> <tr><th>項目</th><td colspan=2>{$hsc($offer->describePack())}</td></tr> <tr><th>金額</th><td colspan=2>{$price_with_notes}</td></tr> {$money_transfer_info} <tr><th>振込期限</th><td colspan=2>{$hsc($offer->getPaymentGuide()->deadline->format("Y年m月d日"))}まで</td></tr> </table> </p> TEXT; $buttons_payment = <<<TEXT <a href="{$start_uri_bank}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>銀行振り込みで申し込み</a> TEXT; if ($settings->payment->isCreditEnabled()) { $buttons_payment .= <<<TEXT <a href="{$start_uri_credit}" class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only'>クレジットカードで申し込み</a> TEXT; } if ($offer->canDiscount()) { $discount_period = $offer->getDiscountPeriod(); if ($offer->isFirstPurchase()) { $discount_message = "新規特別割引は{$hsc($discount_period->date_end->format('m月d日'))}までになります。この機会にぜひお申し込みください。"; } else { $discount_message = "お得な継続割引は{$hsc($discount_period->date_end->format('m月d日'))}までになります。この機会にぜひ継続ください。"; } $offer_message = <<<TEXT <p> <h3 id='content_1_1'>{$hsc($offer->describePack())}の受講申し込みができるようになりました。<a class='anchor' id='p77e7264' name='p77e7264'></a></h3> </p> {$bank_transfer_info} <p> {$discount_message} </p> <p> {$buttons_payment} </p> TEXT; } else { $offer_message = <<<TEXT <p> <h3 id='content_1_1'>{$hsc($offer->describePack())}の受講申し込みができます。<a class='anchor' id='p77e7264' name='p77e7264'></a></h3> </p> {$bank_transfer_info} <p> {$buttons_payment} </p> TEXT; } $content = <<<TEXT <div class="movieviewer-notice movieviewer-notice-purchase-offer"> {$offer_message} </div> TEXT; return $content; }
/** * パスワードリセット用ページのURIを返す * * @param string $page パスワードリセット用ページ名 * * @return array ページ名, 画面(html) */ function plugin_movieviewer_reset_password_get_script_uri($page) { $base_uri = plugin_movieviewer_get_script_uri(); return "{$base_uri}?{$page}"; }