ひげめがねプログラム

初心者プログラマーの覚書となんかいろいろ

基準日からの前月・次月取得~フラグを添えて~

f:id:pstar:20170829224444j:plain
なんかの基準日があって、それを基準に前月、次月ボタン押して表示データを切り替えたい。

【基準日:2017/09/07】

うーーーん。どうする?
かにゃめはフラグを持たせるやり方で実装しました。めちゃ簡単。

隠しフィールドでフラグを持つ

//blade
{{ Form::hidden('dateFlg', 0,['id' => 'dateFlg']) }}

//HTML
<input id="dateFlg" name="dateFlg" type="hidden" value="0">

基準になる0を値にセットしますよ。もちろん送信するFormの中に書きます。
フラグって名前が微妙にしっくりこないけどいい感じのが思いつかないからいいか。

ボタンクリックイベント

//前月ボタン
$('#lastMonth').click(function(){
 var i = $('#dateFlg').val();
 i -- ;
 $('#dateFlg').val(i);
 $('#dataForm').submit();
});

//次月ボタン
$('#nextMonth').click(function(){
 var i = $('#dateFlg').val();
 i ++ ;
 $('#dateFlg').val(i);
 $('#dataForm').submit();
});

前月ボタンクリックならフラグの値から1引いて、次月ボタンクリックならフラグの値から1足していきます。
さらにさらに今回は基準値より前は選択できないようにします。

ページ読み込み時にフラグの値がゼロだったらボタン無効です。無効無効!

//javascript
if($('#dateFlg').val() == 0){
  $('#lastMonth').prop('disabled',true);
}

laravel Controller側の処理

//フラグのパラメータ取得
$dateFlg = Input::get('dateFlg');

//基準日
$recordDate = date('Y/m/d');

//前月or次月取得
$date = date('Y/m/d', strtotime($recordDate.' +'.$dateFlg.' month'));

フラグ$dateFlgに値が入っているので基準日$recordDateから2か月後とか3カ月後などが取得ができる・・・という感じ。
基準日以前も出したいよって時はifで分岐かなー

//もし0より小さければ・・・
if($dateFlg < 0){
$date = date('Y/m/d', strtotime($recordDate.' -'.-$dateFlg.' month'));
}

マイナス値が入ってる$dateFlgはマイナスつけて反転です。

こんな感じでデータとれたよ('ω')

月末とか次の日とかPHPで取得したい。

PHPの月末取得や〇カ月後などの取得方法のおまとめ。入力値が月末日がチェックして!なーんてことがよくあるかにゃめのメモ。

月末取得したい。

A)mktime()使うと幸せになれる。 参考:PHP: mktime - Manual

//システム日付で今月の月末を取得。
$lastDate = date('Y-m-t'); 

//システム日付で今月の月末を取得。別ver.
$lastDate = date('Y-m-d', mktime(0, 0, 0, date('m') + 1, 0, date('Y'))); 

//翌月の月末を取得。
$lastDate = date('Y-m-d', mktime(0, 0, 0, date('m') + 2, 0, date('Y')));

//先月の月末を取得。
$lastDate = date('Y-m-d', mktime(0, 0, 0, date('m') + 0, 0, date('Y')));

//月の最大日数を取得したい。
$Day = date('t', mktime(0, 0, 0, date('m') + 1, 0, date('Y'))); 

もちろん関数も使える。システム日付じゃなくて指定したいときはそのまま記入してもいいし入力フィールドからとってきて変数に値代入後、mktime()にぶっこんでもいい。

単純にシステム日付の〇カ月前・後を取得したい。

A)strtotime()の出番 参考:
PHP: strtotime - Manual

//3日前
$date = date('Y/m/d', strtotime('-3 day'));

//3週間前
$date = date('Y/m/d', strtotime('-3 week'));

//3カ月前
$date = date('Y/m/d', strtotime('-3 month'));

//3年前
$date = date('Y/m/d', strtotime('-3 year'));

〇日前はマイナスをプラスにしてやるだけでおーけーだ。これでもう日付は大丈夫だな。え?まだわかんない所がある?PHPのマニュアル読んどけ!おーらい!

チェック入れたものだけ計算したいんです先生!しかも金額も変更可能です!

f:id:pstar:20170830221754j:plain
「よろしい。ならばjavascriptだ。」
「はい。」
っつってググってググってググりまくったけどわかんなくてしばらくはまってた処理。

商品 金額

























↑チェックいれたものだけ計算。金額変更してチェック入ってたら計算。
たったこれだけの処理なのにね。

HTML

<table>
<tr>
<th style="background-color:gray;">商品</th>
<th style="background-color:gray;">金額</th>
<th style="background-color:gray;"></th>
</tr>
<tr>
<td><label for="glasses">めがね</label></td>
<td><input placeholder="金額" class="price" id="glassesPrice" name="glassesPrice" type="text" value="400"></td>
<td><input class="check" data-price="glassesPrice" id="" name="checkGlasses" type="checkbox">
</td>
</tr>
<tr>
<td><label for="mustache">ひげ</label></td>
<td><input placeholder="金額" class="price" id="mustachePrice" name="mustachePrice" type="text" value="300"></td>
<td><input class="check" data-price="mustachePrice" id="" name="checkMustache" type="checkbox"></td>
</tr>
<tr>
<td><label for="kGlasses">めがね(かにゃめモデル)</label</td>
<td><input placeholder="金額" class="price" id="kGlassesPrice" name="kGlassesPrice" type="text" value="900"></td>
<td><input class="check" data-price="kGlassesPrice" id="" name="checkKGlassesPrice" type="checkbox" ></td>
</tr>
<tr>
<td><label for="priceTotal">合計</label></td>
<td><input placeholder="合計金額" id="priceTotal" name="priceTotal" type="text"></td>
<td></td>
</tr>
</table>

金額入力フィールドとチェックボックスをどうやって結び付けたらいいのかわからなくて結局チェックボックスのdata-priceに金額idと同じものを設定してattrで呼び出すことに。

JavaScript & JQuery

$(function(){
//チェックボックスのチェンジイベント
 $(document).on('change', 'input[class = "check"]' ,function(){
    calcPrice();
 });

//金額フィールドのフォーカスアウト
$('.price').focusout(function(){
    calcPrice();
});

//金額合計のためのfunction
function calcPrice(){
  var price = [];
  //チェックされたものだけ回す
  $('input[class = "check"]:checked').each(function(){
 //数値型に変換して変数に代入するよ
  var number = parseInt($("#" + $(this).attr('data-price')).val());
  //配列に入れる                
  price.push(number);

  });
  var price_total = 0;
 //for文で配列を回して合計を出す
  for(var i = 0, len = price.length;i < len; i++){
  price_total += price[i];
  }
  $("#priceTotal").val(price_total +"円");
 }
});

ほんとは計算前に数字かどうかの確認とかカンマ入れたりのけたりする処理がはいったりしますが割愛します。
そんなこんなで〇時間かかってようやくできたのでした。乙!

laravel固定値がきまっているときの連想配列


タイトルが既におかしい。けどちゃんとした処理名がわかんない。
タイトルこんなのに直したほうがいいよって優しき方はコメントください~。
※悪気なくまちがいを書いてる場合があります。

最終目標は

No Name
1
2
3
このようなテーブルをviewで表示したい。Noは固定値で1~3,NameはNoと紐づくものがDBに登録があれば表示する。

こいつのDBのテーブルは【testtable】でカラムは
【number】・・・Noの値登録するとこ
【name】・・・Nameの値登録するとこ
があるとする。
(deleteDateとかupdateDateとかは省く!)

NoもDBからとってくるだけなら楽なんですよねー変数にぶちこんでviewに渡してやればいいもんね。
けど今回はNoの値が固定値になってる場合。さてどうする?('ω')

Controllerの処理(index)

固定値で決まってるNoの配列作る
$nums = ['1','2','3'];
DBからデータを取得する(初回はもちろんデータはない)
$datas = testModel::getTest();
//ここ適当。testModelていうModelにgetTestというfunctionがあるとしてデータを変数$datasに代入する
固定値入れた配列回しながらデータもまわしてくっつける
$arry = [];
foreach($nums as $num){
  foreach($datas as $data){
   if($num == $data->number){
        $arry2 = [];
	$arry2['num'] = $num;
	$arry2['name'] = $data -> name; 
	$arry[$num] = $arry2;
	break; //一個合致するものがあったらifぬける
      }
    }
 }
viewで受け取れるようにrequestにmergeします
request()->merge([
 'arry' => $arry
]);
固定値入れた配列もviewへ渡す
return view('master/test/index')->with([
 'nums' => $nums,
]);

Controllerの処理はおしまい。あとはviewで表示させるだけ。

Viewの処理

<table>
 <tr>
  <th></th>
  <th>No</th>
  <th>Name</th>
 </tr>
 @foreach ($nums as $num)
 <tr>
  <td>{{ $num }}</td>
  <td class="left">{{ Form::text("arry[$num][name]", null, []) }}</td>
 </tr>
 @endforeach
</table>

これで固定値Noも表示ができてデータがるNameも表示されます。
number = 2 で name = かにゃめ のデータがあるとするとこうなる↓

No Name
1
2
3

表示があるということは登録もあるということですが今回は表示のみ。
登録するとき(Controllerへ渡すとき)のNoの取り出し方は・・・隠しフィールドにでも値もっとけばとりだしやすいのではないかな('ω')

<td>{{ Form::hidden("arry[$num][code]", $num,[]) }}</td>

こんな感じで。

Controller側ではviewに渡すときはrequest()にmergeしてるので

$arryDatas = Input::get('arry');

でデータがとれます。

読まなくてもいい余談

こういう時の変数名すごい悩むね。

laravel開発のすすめ方【手順書】


毎回ページを新しく作るときのおおまかな流れメモ。
何も見なくてもできるようになりたいですねぇ。
※悪気なく間違いを書いてる可能性があります。。

【ここでつかうもの】

  • Controller(動き処理)
  • Model(DB処理)
  • Request(エラーチェック処理)
  • view(blade.php)
  • Route

ざっくりした流れです。

Controllerページをつくる

コマンドプロンプトからたたいてcontroller作成もできるみたいですがわたしは直接フォルダにphpファイルを作成しています。

TestController.php をControllerフォルダへ作り、

<?php

namespace App\Http\Controllers\Test;

use App\Http\Controllers\AbstractController;

class TestController extends AbstractController {

  //ここにfunctionかいてく

}	

?>

こんな感じ。

Controllerに必要なfunction書く(中身は空)

<?php
namespace App\Http\Controllers\Test;

use App\Http\Controllers\AbstractController;

class TestController extends AbstractController {
  public function index(){
  }
  public function search(){
  }
}	
?>

そのページに必要なfunctionをずらっと書いてく。

Route書き込む

<?php
Route::get('test', 'TestController@index')->name('test');
Route::get('test/search', 'TestController@search')->name('test/search');
?>

functionがきちんと飛ぶかURLたたいて確認

さっき書いたRouteがちゃんと通っているかURLを直接入力して確認する。
ちゃんと通ってたら真っ白ページが表示される。

注意 getなら真っ白でOKだけどpostは表示はできないので注意。URL直接入力してもエラーなるよ。

Model書く

DBの処理を書くところ。ここは書く処理こそ違うけどControllerに激似。まぁどこも似たようなもんですが。
ここでは仮にTestmodel.phpファイルをModelフォルダに作ったとします。

<?php
namespace App\Http\Models;
use App\Http\Models\AbstractModel;

class Testmodel extends AbstractModel {
   //中身も書くよ
}
?>

そのページにはどんなデータが必要なのか仕様書をよく見て処理を書いてく。

Controller内部の処理を書き込む

<?php
namespace App\Http\Controllers\Test;

use App\Http\Controllers\AbstractController;

class TestController extends AbstractController {
  public function index(){
  //中身を書く
  }
  public function search(){
  //中身を書く
  }
}	
?>

ある程度書いたらviewへ。

view書く

HTMLとかCSSとかjavaScriptも絡んできます。
laravelは「@extend」とか使えるので便利。

@extends('layout')

@section('script')
//javaScript処理
@endsection

@section('style')
//そのページのCSS処理
@endsection

@section('content')
//ページの中身
@section

共通化したいjavaScriptとかCSSは別途「common.js」「common.css」つくってそこに書く。
毎回書くのが面倒なmetaとかも共通headerに書いてる。

Requestでバリデーション書く

エラーチェックです。TestRequest.phpファイルをRequestフォルダに作ったとする。

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class TestRequest extends FormRequest {

	/**
	 * Determine if the user is authorized to make this request.
	 * @return bool
	 */
	public function authorize() {
		return true;
	}

	/**
	 * Get the validation rules that apply to the request.
	 * @return array
	 */
	public function rules() {
      //検索時にエラーチェックかけたかったら
     if ($this->path() == 'test/search') {
            return[
             //ここにチェックしたいフィールド指定してエラーチェックをごりごり書く
       'testCode'=> 'requied|numeric',
            ];
          }
         return [ ];
        }
}

RequestがかけたらこのRequestが通るようにしないとなのでControllerに

<?php
namespace App\Http\Controllers\Test;

use App\Http\Controllers\AbstractController;
//追記↓
use App\Http\Requests\TestRequest;
use Illuminate\Http\Request;

class TestController extends AbstractController {
  public function index(TestRequest $request){
  }
  public function search(TestRequest $request){
  }
}	
?>

と書くとその処理通る前にエラーチェックができる。

あとは書いて書いて仕様書どおりの動きができるまで書く

Controllerやview、Requestを行ったりきたりバグと戦いながら完成を目指します。
以上( ^ω^ )

この塵クズのような内容よりめちゃんこ詳しく書いてあるところはこちら▼
qiita.com
laravel5.1だけどおおむね一緒のはず。
すごく詳しいんだけど一周まわってよくわからん!となってしまった耐え性のないぼく。

laravelの開発環境を整える


かにゃめの開発環境(2017年8月時点)

もうどうやって開発環境構築したのかあやふやになってきたのでおさらいメモ。
PCはWindowsを使用しています。

PHP7.1

ここのサイトを参考にインストール
weblabo.oscasierra.net

Apach2.4

ここのサイトを参考にインストール
www.adminweb.jp

Eclipse neon4.6(日本語化済)

ここのサイトを参考にインストール(たぶん)
今見てもわかりやすかったのでたぶんそうだと信じたい。
eng-entrance.com

Eclipseは最初っから日本語化されてるものダウンロードもできるけどわたしは英語版をダウンロードして日本語化パッケージをインストール→「eclipse.ini」というeclipseの設定ファイルを変更で日本語化した。
結構簡単でござった。

Composer

composerがないと始まらない。laravel導入に必須。

このあたりを参考
qiita.com

laravel5.4

いちばん大事なところなのにどうやって構築したか忘れた。やべぇ
ちゃんと思い出したら追記予定。

composerインストールしたらあとはlaravel公式ドキュメントに全部書いてくれてる。
一番頼りになるのはやっぱり公式。
インストール 5.4 Laravel

MySQL

現在はheidiSQLを使用しています。

プラグインたち

JQuery3.1.0

bootstrap動作のため

bootstrap 4.0.0 alpha
JQuery basictable

スマホなどでテーブル表示のため

pickadate 3.5.6

カレンダー表示のため

tether 1.3.3

bootstrap動作のため

Font Awesome 4.6.3

アイコン利用のため

こんな感じで現在開発中

初心者でも一人で一通りできたのでそんなに難しくないはず(っ˘ω˘c )