kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

「kaz_PHP自動作成◎自動生成お助けTOOL」・前回UPの修正漏れかつ、画面を、スマホ対応!レスポンシブサイトにした。VectorからOKが来た。

kaz_PHP自動作成◎自動生成お助けTOOL」・前回UPの修正漏れかつ、画面を、スマホ対応!レスポンシブサイトにしたのものを掲載依頼していた件。VectorからOKが来た。
これで、たぶんPHP8.1.6対応出来ただろう。さらにそこそこの、スマホ対応!レスポンシブサイトになっただろう。
このあと、
kaz_javaSpringBootプログラム自動作成◎自動生成の詳細情報 : Vector ソフトを探す!
も、今回、スマホ対応!レスポンシブサイトに使用したCSSで、もうちょっと見栄えのするスマホ対応!レスポンシブサイトに変える。
いままでは、ハンバーガーメニューにしたぐらいなので、検索画面のとことか登録、更新画面のとことかよくなるはず。うれしいな。
www.vector.co.jp

「kaz_PHP自動作成◎自動生成お助けTOOL」・前回UPの修正漏れかつ、画面を、スマホ対応!レスポンシブサイトにしたので、VectorにUPした。

20:06
①前回「kaz_PHP自動作成◎自動生成お助けTOOL」をphp8.1.6用のXAMPP(xampp-windows-x64-8.1.6-0-VS16-installer.exe)で動く様にした時の修正漏れと、画面を、スマホ対応!レスポンシブサイトにした修正を行ったので、Vectorに載せた。OKがきたらまた報告する予定。
www.vector.co.jp

スマホ対応!レスポンシブサイト
①自動生成した「企業情報検索画面」のPC側画像

②自動生成した「企業情報検索画面」のスマホ側画像

■修正内容は

・2.1(202209251800)
1.前回バージョン2.0にUpしたもので、修正漏れのため、ユーザー側画面で落ちる。のを修正した。
 ①値を参照している個所を修正する
  例:$_SESSION['u_login_id_login']→arryVal($_SESSION,'u_login_id_login')
    $_SESSION['login_type']→arryVal($_SESSION,'login_type')
  補足:$_SESSION['search']は修正しなくても必ず値が入るのでOK
  置換方法:\$_SESSION\[([^]]+)\]←値を入れている項目でないことを確認しながら
       ↓
       arryVal($_SESSION, $1)
 ②ユーザー側のDBデータ追加で「$res = 」が抜けていて、ワーニングになる。のを修正
  例:dbPrepareExeInsert($db, 't_corp', $columns);
    ↓
    $res = dbPrepareExeInsert($db, 't_corp', $columns);


2.CSSでスマホ対応!レスポンシブサイトにした。スマホで表示する時、ドロワーメニューにした。
 かつ、スマホ表示の時、テーブル表示(tbl-01クラス、tbl-02クラス)を見やすくした。
 (CSSでスマホ対応!レスポンシブサイト)
	■/resources/static/css/layout.css及び、
	 /resources/static/admin/css/layout.css
	<<追加 start>>
	【6】スマホ対応!レスポンシブサイト
		<<追加 end>>
	・・・
	#wrapper
	{
	<<削除 start>>
		width: 100%;
	<<削除 end>>
	<<追加 start>>
		min-width: 100%;
		display: inline-block;
	<<追加 end>>
		margin: 0 auto;
		text-align: left;
	}
	・・・
	#contents
	{
		clear:both;
		background: url(../img/bg_contents.gif) repeat-x left top;
		background-color:#E6E6E6;
		padding:20px 0 20px 0;
	<<追加 start>>
		min-width: 100%;
		display: inline-block;
	<<追加 end>>
	}
	・・・
	<<追加 start>>
	/* =============================================================
	 ■□■ 6. スマホ対応!レスポンシブサイト ■□■
	============================================================= */
	@media screen and (max-width: 480px) {
	/* ハンバーガーメニュー */
	.hamburger {
	  width: 30px;
	  height: 30px;
	  background: #205386;
	  padding: 10px;
	  display: flex;
	  justify-content: center;
	  align-items: center;
	  position: absolute;
	  z-index: 999;
	}
	.hamburger:hover {
	  cursor: pointer;
	}
	.hamburger span {
	  background: #fff;
	  width: 25px;
	  height: 2px;
	  position: absolute;
	  transition: 0.3s ease-out;
	}
	.hamburger span:nth-of-type(1) {
	  top: 15px;
	}
	.hamburger span:nth-of-type(3) {
	  bottom: 15px;
	}
	/* ハンバーガーメニューを左側に隠す */
	.drawer-list {
	  position: absolute;
	  transform: translate(-300px);
	  transition: 0.3s ease-out;
	}
	.drawer-list.open {
	  transform: translate(0);
	  transition: 0.3s ease-out;
	}
	#main
	{
		background-color: #990000;
		margin:0 10px 0 5px;
		background-color:#FFFFFF;
		border:solid 1px #C6C6C6;
		padding:15px 15px 40px 15px;
		
		font-size: 8px;
	}
	.sysTitle {
	  font-size: small;
	  color:#FFFFFF;
	  text-align: center;
	}

	/* ------------- tbl-01(thが縦) ------------- */
	.tbl-01
	{
	/*	width:99%; */
	max-width: 373px; 
	/* white-space: nowrap; */
		border-top:solid 1px #B5B5B5;
		border-left:solid 1px #B5B5B5;
		border-right:solid 1px #B5B5B5;
		margin-bottom:10px;
		border-collapse:separate;
		border-spacing:0;
	}

	.tbl-01 th
	{
		display:block;
		padding:1px 3px 1px 5px;
		text-align:left;
		border-bottom:solid 1px #B5B5B5;
		border-right:solid 1px #B5B5B5;
		border-top:solid 1px #FFFFFF;
		border-left:solid 1px #FFFFFF;
		background-color:#DAECF3;
		width:auto
	/*	vertical-align: top;
		vertical-align:middle;
		*/
	}

	.tbl-01 td
	{
		display:block;
		padding:1px 3px 1px 5px;
		border-bottom:solid 1px #B5B5B5;
		font-weight:normal;
		word-break:break-all;
	}

	.tbl-01 th.bg-blue
	{
		display:block;
		padding:3px 3px 3px 5px;
		text-align:left;
		border-bottom:solid 1px #B5B5B5;
		border-right:solid 1px #B5B5B5;
		border-top:solid 1px #FFFFFF;
		border-left:solid 1px #FFFFFF;
		background-color:#BECBD4;
		width:auto
	/*	vertical-align: top;
		vertical-align:middle;
		*/
	}
	.scroll_table {
		max-width: 373px; 
		overflow-x: auto;
	}
	.scroll_table .tbl-02
	{
		white-space: nowrap; 
	/*	width:99%; */
		border-top:solid 1px #B5B5B5;
		border-left:solid 1px #B5B5B5;
		margin-bottom:10px;
		border-collapse:separate;
		border-spacing:0;
	}

	.scroll_table::-webkit-scrollbar {
		height: 10px; /* スクロールバーの高さ */
	}
	.scroll_table::-webkit-scrollbar-thumb {
		background: #aaa; /* ツマミの色 */
	}
	.scroll_table::-webkit-scrollbar-track {
		background: #ddd; /* トラックの色 */
	}

	}
	@media screen and (min-width: 480px) {
	.hamburger {
	  display:none;
	}
	.drawer-list {
	  display:block;
	}
	.sysTitle {
	  font-size: large;
	  color:#FFFFFF;
	  text-align: center;
	}
	}
	/* ハンバーガーメニューにactiveクラスが付いているときは三本線ではなく×印にする */
	.hamburger.active span:nth-of-type(1) {
	  transform: translateY(9px) rotate(-45deg);
	  transition: 0.3s ease-out;
	}
	.hamburger.active span:nth-of-type(3) {
	  transform: translateY(-9px) rotate(45deg);
	  transition: 0.3s ease-out;
	}
	.hamburger.active span:nth-of-type(2) {
	  opacity: 0;
	}

	■「class="tbl-02"」を「<div class="scroll_table">」の下に置いた
	 これにより、スマホ表示の一覧は横スクロールする。
	<div class="scroll_table">
				<!-- tbl-02 start -->
				<table cellpadding="0" cellspacing="0" class="tbl-02">
	・・・
				<!-- tbl-02 end -->
	</div>

3.ログイン画面をCSSでスマホ対応!レスポンシブサイトにした。
 ①\作成先フォルダ\.kazphp\view\index.html
 ②\作成先フォルダ\.kazphp\view\admin\index.html

「kaz_PHP自動作成◎自動生成お助けTOOL」をphp8に対応したので、VectorにUPした。

17:20
①「kaz_PHP自動作成◎自動生成お助けTOOL」をphp8.1.6用のXAMPP(xampp-windows-x64-8.1.6-0-VS16-installer.exe)で動く様にした。
 これから、Vectorに載せる。OKがきたらまた報告する予定。
www.vector.co.jp
 php7.2→php8.1.6は、こんなに修正しないと動かない。なかなか大変だ~。
Vectorに載せた修正履歴。(php7.2→php8.1.6バージョンアップ)

・202109191800
 php8.1.6用のXAMPP(xampp-windows-x64-8.1.6-0-VS16-installer.exe)で動く様にした。
 php7.2→php8.1.6VerUpに伴う以下のエラーなどに対応した。
    ★エラー:
        Fatal error: Uncaught ArgumentCountError: Too few arguments to function userErrorHandler(), 
        4 passed in C:\xampp\htdocs\kaz\index.php on line 11 and exactly 5 expected in C:\xampp\htdocs\.kazphp\common.php:75 
        Stack trace: #0 C:\xampp\htdocs\kaz\index.php(11): userErrorHandler(2, 'Undefined array...', 'C:\\xampp\\htdocs...', 11) #1 
        {main} thrown in C:\xampp\htdocs\.kazphp\common.php on line 75
    対処:php8では、引数$varsがなくなったので削除した。
    解決:
    function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
        ↓
    function userErrorHandler ($errno, $errmsg, $filename, $linenum) {    

    ★エラー:
        Notice: Only variables should be assigned by reference in C:\xampp\htdocs\kaz\admin\index.php on line 8
    解決:&をなくした
        $o =& htmlspecialchars_r($_REQUEST); // output用(FORMからの入力値)
        ↓
        $o = htmlspecialchars_r($_REQUEST); // output用(FORMからの入力値)

    ★エラー:
        Warning: Undefined array key "mode" in C:\xampp\htdocs\kaz\admin\index.php on line 11
    解決:$_REQUEST['mode']のnullを考慮した。さらに、
    ★エラー:http://localhost:3000/kaz/admin/ 画面に
        Warning: Undefined array key "login" in C:\xampp\htdocs\.kazphp\view\admin\index.html on line 52
         表示された。配列に存在しない項目を参照するとワーニングになるらしい。
    解決:$o['loginid']のnullを考慮した。
        <?= $o['loginid']?>
            ↓
        <?= arryVal($o, 'loginid')?>

    手順:
        ①C:\xampp\htdocs\.kazphp\functions.phpに
        // 配列値取得
        function arryVal ($vars, $itemName) {
            return $vars[$itemName] ?? "";
        }
        を追加した。
        ②html(hinagata\View)、php(\hinagata\Library\index.txt,\hinagata\Library\index_user.txt)を以下のように置換する
        \$err\['([^]]+)\]
        ↓
        arryVal($err, $1)
        及びhtml(hinagata\View)
        \$o\[([^]]+)\]
        ↓
        arryVal($o, $1)
        及びphp(inagata\Model以下のphp、txtおよび作成先フォルダ\.システムphpBasePgm以下のphp)
        \$_REQUEST\[([^]]+)\]←値を入れている項目でないことを確認しながら
        但し
         ・unset($_REQUEST['KAZ_TOOL_token']);はこのままにしておく。
         ・isset( $_REQUEST['pageID'] )以外の、「$_REQUEST['pageID']」は「$_REQUEST['pageID']??0」にする。
        ↓
        arryVal($_REQUEST, $1)
        
        そのほか、表示された。配列に存在しない項目を参照する箇所は修正した。(絶対、値が入っている場所はそのままにした)
        補足:$_SERVERは現在のままでよい。(無いときはワーニングでよいので)

    ★エラー:”Non static method”エラー解消
    解決:function → static functionに修正した
        C:\xampp\htdocs\.kazphp\common\AppCheckUtil.phpのメソッド修正
        checkMoji
        checkDate
        checkDateFromTo
        checkStringCompareTo
        checkNumericCompareTo
        checkCodeValue
        checkNumeric
        checkDotNumeric
        typeOf
        getCharType
        getStringWidth
        checkPhoto
        checkIUPPhoto
        checkDateTime
        checkLrgCodeValue
        checkMidCodeValue
        checkSmlCodeValue

        C:\xampp\htdocs\.kazphp\common\TokenHandle.phpのメソッド修正
        getTokenHtml
        isTokenValid

        C:\xampp\htdocs\.kazphp\common\AppSrchUtil.phpのメソッド修正
        setSqlStrSub1
        setSrchChkBoxArray

        C:\xampp\htdocs\.kazphp\common\AppHtmlUtil.phpのメソッド修正
        getHTMLSelect
        getHTMLRadio
        getHTMLCheckBox
        getHTMLCheckBoxDispStr
        creJSvarCategory
        creJSvarAryLrgmidsmlAjaxKbn
        getHTMLSelectLrgPlus
        getHTMLSelectMidPlus
        getHTMLSelectSmlPlus

    ★エラー:C:\xampp\htdocs\.kazphp\common\AppCheckUtil.phpのエラー
                if( ($chartype & $type) == 0 ){で
    [{
        "resource": "/c:/xampp/htdocs/.kazphp/common/AppCheckUtil.php",
        "owner": "_generated_diagnostic_collection_name_#1",
        "code": "1006",
        "severity": 8,
        "message": "Expected type 'null|bool|int|float|string'. Found '文字種を表す定数'.",
        "source": "intelephense",
        "startLineNumber": 618,
        "startColumn": 9,
        "endLineNumber": 618,
        "endColumn": 18
    }]エラー
    解決:ビット演算は(int)が必要らしい。入れたらOKになったから。
                if( ($chartype & $type) == 0 ){で
    ↓
                if( ((int)$chartype & $type) == 0 ){で

    ★エラー:C:\xampp\htdocs\.kazphp\common\AppDbCdUtil.phpのエラー
            $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $smlDelItem);
    [{
        "resource": "/c:/xampp/htdocs/.kazphp/common/AppDbCdUtil.php",
        "owner": "_generated_diagnostic_collection_name_#1",
        "code": "1008",
        "severity": 8,
        "message": "Undefined variable '$smlDelItem'.",
        "source": "intelephense",
        "startLineNumber": 219,
        "startColumn": 147,
        "endLineNumber": 219,
        "endColumn": 158
    }]エラー
    解決: $smlDelItemを「$this->smlDelItem」に修正する
            $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $smlDelItem);
    ↓
            $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $this->smlDelItem);
    と、同様のエラー箇所
                    $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $smlDelItem);
    ↓
                    $this->smlTblNm, $this->smlTblAriasNm, $this->smlKey1Item, $this->smlKey2Item, $this->smlKey3Item, $this->smlNmItem, $this->smlEngNmItem, $this->smlDelItem);

    ★エラー:C:\xampp\htdocs\.kazphp\common\AppHtmlUtil.phpのエラー
        $str = $str . "<script language='JavaScript'>\n";で
    [{
        "resource": "/c:/xampp/htdocs/.kazphp/common/AppHtmlUtil.php",
        "owner": "_generated_diagnostic_collection_name_#1",
        "code": "1008",
        "severity": 8,
        "message": "Undefined variable '$str'.",
        "source": "intelephense",
        "startLineNumber": 162,
        "startColumn": 9,
        "endLineNumber": 162,
        "endColumn": 13
    }]エラー
    解決:$strを初期設定する。
    <<追加 start>>
        $str = '';
    <<追加 end>>
        $str = $str . "<script language='JavaScript'>\n";
    と、同様のエラー箇所

    ★エラー:C:\xampp\htdocs\.kazphp\view\admin\item\itemAAmendRegisterViewInc.htmlのエラー
    及び、C:\xampp\htdocs\.kazphp\view\admin\item\itemAListView.htmlのエラー
    <script>
    <!-- 
    var cal1_srch_item54_from = new JKL.Calendar("calid_srch_item54_from","frm","srch_item54_from");で
    [{
        "resource": "/c:/xampp/htdocs/.kazphp/view/admin/item/itemAAmendRegisterViewInc.html",
        "owner": "_generated_diagnostic_collection_name_#1",
        "severity": 8,
        "message": "Expression expected.",
        "source": "javascript",
        "startLineNumber": 24,
        "startColumn": 1,
        "endLineNumber": 24,
        "endColumn": 2
    }]エラー
    解決:カレンダー表示の箇所。「<!-- 」→「//<!-- 」に修正した
    <script>
    //<!-- 
    var cal1_srch_item54_from = new JKL.Calendar("calid_srch_item54_from","frm","srch_item54_from");で

    ★エラー:C:\xampp\htdocs\.kazphp\check_functions.phpのエラー
        $extStr = implode( $exts, ")|(" );
    と、
            $errorMessage = 'アップロード可能な画像拡張子は' . implode( $exts, ',' ) . 'です';
    [{
        "resource": "/c:/xampp/htdocs/.kazphp/check_functions.php",
        "owner": "_generated_diagnostic_collection_name_#1",
        "code": "1006",
        "severity": 8,
        "message": "Expected type 'null|array'. Found 'string'.",
        "source": "intelephense",
        "startLineNumber": 9,
        "startColumn": 28,
        "endLineNumber": 9,
        "endColumn": 33
    }]エラー
    解決:implodeの引数指定の順番が間違っていた。
        $extStr = implode( $exts, ")|(" );
    ↓
        $extStr = implode( ")|(",  $exts);
            $errorMessage = 'アップロード可能な画像拡張子は' . implode( $exts, ',' ) . 'です';
    ↓
            $errorMessage = 'アップロード可能な画像拡張子は' . implode( ',', $exts) . 'です';

    ★エラー:C:\xampp\htdocs\kaz\admin\item\itemA.phpのエラー
            $result = AppCheckUtil::checkCodeValue($vars, $errorMessages, $o["c_elements_idx"]=='0'?"有効/無効データ":"use/nouse data",  $result, "srch_deldt_flg", "YUKO_FLG", false,'0');
    [{
        "resource": "/c:/xampp/htdocs/kaz/admin/item/itemA.php",
        "owner": "_generated_diagnostic_collection_name_#1",
        "code": "1008",
        "severity": 8,
        "message": "Undefined variable '$o'.",
        "source": "intelephense",
        "startLineNumber": 760,
        "startColumn": 65,
        "endLineNumber": 760,
        "endColumn": 67
    }]エラー
    解決:    global $o;を追加した。
    // 検索条件入力値のチェック
    function srchValidCheck(&$vars) {
    <<追加 start>>
        global $o;
    <<追加 end>>

    ★エラー:C:\xampp\htdocs\kaz\admin\logininfo\logininfo.phpのエラー
        $pageNavi =new PageNavi(array(でPageNaviクラスのコンストラクタ(function PageNavi($options = array(), $eleIdx = '0'))が
        動かない。    
    解決:クラス名と同じ名前のコンストラクタは、PHP 5.3.3 以降はコンストラクタとみなされない。とあったが、PHP7.2までは動いた。
    C:\xampp\htdocs\.kazphp\PageNavi.class.phpを修正
    function PageNavi($options = array(), $eleIdx = '0')
    ↓
    function __construct($options = array(), $eleIdx = '0')

    ★エラー:C:\xampp\htdocs\.kazphp\functions.phpを修正
            $url = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . $string;で
            $_SERVER['HTTPS'] が存在しないときワーニングになる。
    解決:$_SERVER['HTTPS']は存在確認することにした。
            $url = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . $string;で
    ↓
            $url = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . $string;
    同じよううに
            $url = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']). '/' . $string;
    ↓
            $url = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']). '/' . $string;

    ★エラー:エラーログがうまく出ていない
    解決:C:\xampp\htdocs\.kazphp\common.php userErrorHandler関数などのログ出力をerror_log使用に変えた。
    function userErrorHandler ($errno, $errmsg, $filename, $linenum) {    
    ・・・
    <<修正前 start>>
        $fp = fopen(DIR_LOG . date('Ymd') . '_log.txt', 'a');
        flock($fp, LOCK_EX);
        fwrite($fp, 'Date: ' . date('Y/m/d H:i:s') . "\n");
        fwrite($fp, 'Errno: ' . $errno . "\n");
        fwrite($fp, 'Errortype: ' . $errortype[$errno] . "\n");
        fwrite($fp, 'Message: ' . $errmsg . "\n");
        fwrite($fp, 'Filename: ' . $filename . "\n");
        fwrite($fp, 'Linenum: ' . $linenum . "\n");
        fwrite($fp, "----------\n");
        flock($fp, LOCK_UN);
        fclose($fp);
    <<修正前 end>>
    <<修正後 start>>
        // $fp = fopen(DIR_LOG . date('Ymd') . '_log.txt', 'a');
        // flock($fp, LOCK_EX);
        // fwrite($fp, 'Date: ' . date('Y/m/d H:i:s') . "\n");
        // fwrite($fp, 'Errno: ' . $errno . "\n");
        // fwrite($fp, 'Errortype: ' . $errortype[$errno] . "\n");
        // fwrite($fp, 'Message: ' . $errmsg . "\n");
        // fwrite($fp, 'Filename: ' . $filename . "\n");
        // fwrite($fp, 'Linenum: ' . $linenum . "\n");
        // fwrite($fp, "----------\n");
        // flock($fp, LOCK_UN);
        // fclose($fp);
    <<修正後 end>>
    <<追加 start>>
        error_log('Date: ' . date('Y/m/d H:i:s') . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt');
        error_log('Errno: ' . $errno . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt');
        error_log('Errortype: ' . $errortype[$errno] . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt');
        error_log('Message: ' . $errmsg . "\n, 3, DIR_LOG . date('Ymd') . '_log.txt'");
        error_log('Filename: ' . $filename . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt');
        error_log('Linenum: ' . $linenum . "\n", 3, DIR_LOG . date('Ymd') . '_log.txt');
        error_log("----------\n", 3, DIR_LOG . date('Ymd') . '_log.txt');
    <<追加 end>>
        if (!empty($db)) {


    ★改善:PearのDB.phpをやめて、PDOに変更する。
    解決:以下など(以下以外にもある)のDB関連を修正
    C:\xampp\htdocs\.kazphp\db_functions.php
    C:\xampp\htdocs\.kazphp\functions.php
    C:\xampp\htdocs\kaz\admin\shohin\shohinA.php

    ★初期データアップロードのview呼出し関数のパラメータから「$result」を削除する。
     (理由:”Undefined variable $result”エラーになるので)
     例:「iUp■{PRG_NAME}■CsvView($o, $err, $result) {」→「iUp■{PRG_NAME}■CsvView($o, $err) {」
    そのほか、配列関係(CSVの項目数が少ない場合、存在しないINDEXを見にいくので落ちた)や、DB関係で修正した。

    ★phpの日付が日本になっていないので、config.phpを修正した。
    <<修正後>>
    // 日本にする
    //if (substr(PHP_OS, 0, 3) == 'WIN') { 
    //} else { 
    //    define('TIMEZONE', 'Asia/Tokyo');
    //    putenv('TZ=' . TIMEZONE);
    //}
    define('TIMEZONE', 'Asia/Tokyo');
    putenv('TZ=' . TIMEZONE);
    date_default_timezone_set(TIMEZONE);

    ★論理削除のとき「"削除してもよろしいですか?"」だとわかりづらいので
    「"削除(論理削除)してもよろしいですか?"」にした。
    
    ★秘密の画像(例:http://localhost/kaz01u/imageDsp.php?fname=item/A2209190001/item51.png&user=admin」が
    「Uncaught Error: Call to undefined function imagecreatefrompng()」エラーで表示できない。
    xammpのphp.iniの「;extension=gd」→「extension=gd.so」にした。
    なぜだか。PHP8対応のxammpのphp.iniではコメントアウトされているので。
    「PHP作成マクロ(お助けTOOL).xlsm」に追記した。

    ★テーブル項目一覧などの定義エクセルの「項目チェック内容」にあった
    「小数点なし及びカンマあり数値」「小数点なし及びカンマなし数値」「小数点あり及びカンマあり数値」を
    削除した。・・・チェックロジックを作ってなかった。これからつくるのも面倒なので。
    ハハハハハ、php8にするのに労力を使いはたしたって感じ。

PHP・Laravelの勉強中 ログイン機能のController・つづき

6:04
①4日前からのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』をやっている。
①-1. 『web.phpのAuth::routes();について分かったこと。』のつづき
・なぜ、「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Support\Facades\Route.php」にgetメソッドが無いのに
 Laravel\Ui\AuthRouteMethods.phpでは「$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');」とか、getが使えているのか?
 を、調べた。
 ・Route.phpにあった getFacadeAccessor()の「return 'router';」は、Laravelはサービスコンテナから
  「router」に結び付けられたインスタンスを依存解決しているってことで、
  サービスコンテナの「router」は「Illuminate\Routing\Router」のことだった。
  確かに、Router.phpにはgetメソッドがある。

    public function get($uri, $action = null)
    {
        return $this->addRoute(['GET', 'HEAD'], $uri, $action);
    }

 ・サービスコンテナ結合キー=routerで、ファサード=Route、
  クラス=Illuminate\Routing\RouterなんだってNetに書いてあった。
  ’router’が、どこに書いてあるかを調べたら、
  「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Foundation\Application.php」にあった。これだろうと思う。
  これによると、'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
  なので、関係しているのは [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],の3個らしい。
   \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::classは両方interfaceだった。

    /**
     * Register the core class aliases in the container.
     *
     * @return void
     */
    public function registerCoreContainerAliases()
    {
        foreach ([
            'app' => [self::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class],
            'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
・・・
            'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
            'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
・・・
            'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
        ] as $key => $aliases) {
            foreach ($aliases as $alias) {
                $this->alias($key, $alias);
            }
        }
    }

②ログインはphp artisan route:listによると、「 GET|HEAD login ................. login › Auth\LoginController@showLoginForm」なので
 C:\laravel-project\sample-project\app\Http\Controllers\Auth\LoginController.phpになる。
 コンストラクトに$this->middleware('guest')->except('logout');とある。
 middleware('guest')はApp\Http\Kernel.phpに記述されている$routeMiddlewareの
 'guest'に登録されているRedirectIfAuthenticatedクラスのこと

・App\Http\Kernel.php
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
・・・
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,

③C:\laravel-project\sample-project\app\Http\Middleware\RedirectIfAuthenticated.php
 handleメソッドが動くらしい。
 ここでは、Illuminate\Auth\AuthManagerでguard()メソッドを実行するとSessionGuardインスタンスが作成される。
 Auth::guard($guard)->check()はSessionGuardのcheckメソッドを実行している。
 認証が完了している場合は/home(RouteServiceProvider::HOME)にリダイレクトする。
  ・$guardsってなんだろう?
   ・ガード (guard)とは、C:\laravel-project\sample-project\config\auth.phpにある、'guards'。
    Laravel では「認証」と呼ぶ。ECサイトの「管理者」と「会員」など。
   ・ここにある$guardsって、だれが渡してくれるんだろう?
    
  ・なぜ、 foreachで回しているのだろう?
    ガード (guard)が複数あるかららしい。
  ・return $next($request);でなぜログイン画面になるのか?
   ・次のmiddlewareの処理につながる$nextへ$requestが渡される。
   ・$next($request)はコントローラーのアクションが実行された結果が返されます。
  ・LoginController@showLoginFormのshowLoginFormはどこにあるのだろう?
   ・LoginController中に「 use AuthenticatesUsers;」とありtraitだった。
    「C:\laravel-project\sample-project\vendor\laravel\ui\auth-backend\AuthenticatesUsers.php」は
    showLoginFormメソッドを持っていて「return view('auth.login');」している。

・RedirectIfAuthenticated.php
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                return redirect(RouteServiceProvider::HOME);
            }
        }

        return $next($request);
    }
||< 
④LoginController中のAuthenticatesUsers.phpは「ublic function login(Request $request)」でログインメソッドでログインしている
 ・ $this->validateLogin($request);でバリデーションしている。
 ・以前サンプルで「class CreateTask extends FormRequest」作ったとき、バリデーションは
  「 public function rules()」に「return [
            'title' => 'required|max:100',
            'due_date' => 'required|date|after_or_equal:today',
        ];」と書いていたのだけど、Controller中にも書ける・・・のかな。
 ・validateLoginメソッド使用した後エラーがあるかどうか聞いていないので、エラーの時は勝手にエラーに戻るのかな?
>||
    protected function validateLogin(Request $request)
    {
        $request->validate([
            $this->username() => 'required|string',
            'password' => 'required|string',
        ]);
    }

 

PHP・Laravelの勉強中 ログイン機能のController

13:45
①3日前からのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』をやっている。
①-1. web.phpのAuth::routes();について分かったこと。
・C:\laravel-project\sample-project\routes\web.phpのAuth::routes();にログイン機能のルーティングが書いてある。ので、調査
・web.phpに、use Illuminate\Support\Facades\Auth;と書いてあるので、Auth::routes();は Illuminate\Support\Facades\Auth.phpのことで、
 ・「public static function routes(array $options = [])」のことだった。
 ・そしてこの関数には「static::$app->make('router')->auth($options);」とある。
  make('router')のrouterとは、「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Support\Facades\Route.php」・
  「class Route extends Facade」の「getFacadeAccessor()」に書いてある「return 'router';」のことだった。
    疑問:$app->make('router')って、new Auth.php-じゃダメなのか?と調べたら、
       Laravelのサービスコンテナにサービスコンテナ(app()) にインスタンスを作ってもらう時は
       $app->make('router')って書くって、あった。さらにLaravelでは$app->makeしか使わなくなるって書いてあった。
 ・Route.phpについて、\laravel\uiパッケージの「C:\laravel-project\sample-project\vendor\laravel\ui\composer.json」に
  以下のように書いてある

・composer.json
    "extra": {
        "branch-alias": {
            "dev-master": "3.x-dev"
        },
        "laravel": {
            "providers": [
                "Laravel\\Ui\\UiServiceProvider"
            ]
        }
    },

  "Laravel\\Ui\\UiServiceProvider"により、「use Illuminate\Support\Facades\Route;」のRoute.php
  Laravel\Ui\AuthRouteMethods.phpの内容がmixinされている。

・Laravel\\Ui\\UiServiceProvider"
    public function boot()
    {
        Route::mixin(new AuthRouteMethods);
    }

  なので、「static::$app->make('router')->auth($options);」は
  Laravel\Ui\AuthRouteMethods.phpのauth()のことだった。
    補足:実フォルダはC:\laravel-project\sample-project\vendor\laravel\ui\src\AuthRouteMethods.php
       だけど、「C:\laravel-project\sample-project\vendor\laravel\ui\composer.json」に
 「"autoload": { "psr-4": {"Laravel\\Ui\\": "src/",・・・」あるので、srcが抜けてl→Lとu→Uになっている。
  こんな風に書いてある。

・Laravel\Ui\AuthRouteMethods.php
    public function auth()
    {
        return function ($options = []) {
            $namespace = class_exists($this->prependGroupNamespace('Auth\LoginController')) ? null : 'App\Http\Controllers';

            $this->group(['namespace' => $namespace], function() use($options) {
                // Login Routes...
                if ($options['login'] ?? true) {
                    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
                    $this->post('login', 'Auth\LoginController@login');
                }
・・・
    }

PHP・Laravelの勉強中

22:39
①おとといからのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』
 ・まだ、わからない。
②わかってきたこと。まだ、まだ、だけど。
 ・Composerを使用し、サンプルを見ながら作った「sample-project」
  (>composer create-project laravel/laravel sample-project --prefer-dist)は
  laravel/laravelパッケージをGitからZip形式でダウンロードしてsample-project という名前で展開したものらしい。
 ・さらに、laravel/laravelパッケージにはいくつかのパッケージ(これは、composer.jsonの"require":に書いてあるもののことらしい)も一緒に入っているらしい。
 ・ログイン画面などを
  (>composer require laravel/ui)で入れたが、これはlaravel/uiパッケージを入れたことになる。