testing

========
Unit test : Hanya untuk testing satu method biasanya untuk memastikan rumus (yang biasanya kompleks) benar proses dan outputnya. Kalau methodnya cuma CRUD, tidak usah dibuat unit test.

========
Functional test : Untuk testing satu controller, jadi kalau ada CRUD Users, bisa dibuatkan functional test dan biasanya sudah testing datatabasenya sehingga saya pakai
'use Illuminate\Foundation\Testing\DatabaseTransactions;'.
Ini tidak perlu ada hubungannya dengan javascript, bisa via phpunitnya laravel. Ini cuplikan dari dokumentasi rails. http://guides.rubyonrails.org/testing.html...

"In Rails, testing the various actions of a controller is a form of writing functional tests."

========
Integration test: Untuk testing antar controllers biasanya, misalnya jika CRUD yang ada ajax callnya ke route berbeda, bisa dikategorikan disini. Di laravel juga sudah ada, gunakan dokumentasi ini untuk ajax call dan lihat json outputnya. https://laravel.com/docs/5.3/application-testing... dan ini cuplikan dari dokumentasi rails

"Integration tests are used to test how various parts of your application interact. They are generally used to test important workflows within our application."

========
User Acceptance Test: Biasanya saya pakai ini untuk interaksi javascriptnya, sekarang pakai selenium walaupun masih sulit untuk beberapa case, sehingga case tertentu, cukup dengan integration test saja. Sementara di depan ada Laravel Dusk, kita tunggu.

========
Regression Test: ini testing untuk mencari celah bug pada prosesnya, tidak ada error di method misalnya, tapi outputnya salah. Mungkin saya biasanya pakai Unit Test saja sih.

========
Environment: di laravel hanya bisa satu environment via .env. Saya sudah berkali-kali coba tanpa modifikasi agar memanggil .env.testing belum berhasil. Sehingga sekarang .env digunakan untuk database mysql sedangkan untuk testing di config/database.php saya modifikasi menjadi 'default' => $app->environment('testing') ? 'sqlite' : env('DB_CONNECTION', 'mysql'),

karena secara default phpunit.xml sudah ada code <env name="APP_ENV" value="testing"/>

Tapi di Laravel 5.2 ke atas tidak bisa modifikasi config di atas, karena helper methodnya belum terload. Sehingga yang dilakukan di phpunit.xml itu tambahkan path-nya sqlite. <env name="DB_DATABASE" value='path/to/database.sqlite' /> atau jika ingin menggunakan database mysql juga, tapi beda database dengan .env maka lengkapi seperti setup value database di mysql sehingga menjadi

<env name="APP_ENV" value="testing"/>
<env name="DB_HOST" value='localhost' />
<env name="DB_DATABASE" value='mysql_testing' />
<env name="DB_USERNAME" value='root' />
<env name="DB_PASSWORD" value='' />

laravel parameter menggunakan slash

Route::get('view/{slashData?}', 'ExampleController@getData')
    ->where('slashData', '(.*)');
jika menggunakan route::resource
simpan di routeserviceprovider
Route::pattern('id', '[0-9]+');

parsley validation

 $('#corrective-form .btn').on('click', function() {
           $('#corrective-form').parsley().validate();
           validateFront();
         });
         var validateFront = function() {
           if (true === $('#corrective-form').parsley().isValid()) {
             $('.bs-callout-info').removeClass('hidden');
             $('.bs-callout-warning').addClass('hidden');
           } else {
             $('.bs-callout-info').addClass('hidden');
             $('.bs-callout-warning').removeClass('hidden');
           }
         };

Laravel ajax file upload

di view

$("#modal-edit-corrective").find('.modal-footer #btn-submit').on('click', function(e){
    var id={!! $incompatibility->corrective->id !!}
    var formdata = new FormData();    
    var file = $("#modal-edit-corrective").find('#attachment')[0].files[0];
    formdata.append('attachment', file);
    formdata.append('_token','{{ csrf_token() }}');
    formdata.append('corrective_action',$("#modal-edit-corrective").find(".modal-body #corrective_action").val());
    formdata.append('preventive_measure',$("#modal-edit-corrective").find(".modal-body #preventive_measure").val());
    $.ajax({
      type:"POST",
      url:"{!! route('corrective.update',$incompatibility->corrective->id) !!}",
      headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
      data:formdata,
      cache:false,
      processData: false,
      async:false,
      contentType: false,
      success:function(){
          window.location.reload();
      }
    })
  })

disable datatable back to page one

disable datatable kembali ke halaman pertama
gunkan

stateSave: true,

integrasi wysiwyg bootstrap

 <h2>Uraian Ketidaksesuaian</h2>
                         
                  <div class="clearfix"></div>
                </div>
                <div class="x_content">
                  <div id="alerts"></div>
                 
                  <div class="btn-toolbar editor" data-role="editor-toolbar" data-target="#editor">
                    <div class="btn-group">
                      <a class="btn dropdown-toggle" data-toggle="dropdown" title="" data-original-title="Font"><i class="fa fa-font"></i><b class="caret"></b></a>
                      <ul class="dropdown-menu">
                      <li><a data-edit="fontName Serif" style="font-family:'Serif'">Serif</a></li><li><a data-edit="fontName Sans" style="font-family:'Sans'">Sans</a></li><li><a data-edit="fontName Arial" style="font-family:'Arial'">Arial</a></li><li><a data-edit="fontName Arial Black" style="font-family:'Arial Black'">Arial Black</a></li><li><a data-edit="fontName Courier" style="font-family:'Courier'">Courier</a></li><li><a data-edit="fontName Courier New" style="font-family:'Courier New'">Courier New</a></li><li><a data-edit="fontName Comic Sans MS" style="font-family:'Comic Sans MS'">Comic Sans MS</a></li><li><a data-edit="fontName Helvetica" style="font-family:'Helvetica'">Helvetica</a></li><li><a data-edit="fontName Impact" style="font-family:'Impact'">Impact</a></li><li><a data-edit="fontName Lucida Grande" style="font-family:'Lucida Grande'">Lucida Grande</a></li><li><a data-edit="fontName Lucida Sans" style="font-family:'Lucida Sans'">Lucida Sans</a></li><li><a data-edit="fontName Tahoma" style="font-family:'Tahoma'">Tahoma</a></li><li><a data-edit="fontName Times" style="font-family:'Times'">Times</a></li><li><a data-edit="fontName Times New Roman" style="font-family:'Times New Roman'">Times New Roman</a></li><li><a data-edit="fontName Verdana" style="font-family:'Verdana'">Verdana</a></li></ul>
                    </div>

                    <div class="btn-group">
                      <a class="btn dropdown-toggle" data-toggle="dropdown" title="" data-original-title="Font Size"><i class="fa fa-text-height"></i>&nbsp;<b class="caret"></b></a>
                      <ul class="dropdown-menu">
                        <li>
                          <a data-edit="fontSize 5">
                            <p style="font-size:17px">Huge</p>
                          </a>
                        </li>
                        <li>
                          <a data-edit="fontSize 3">
                            <p style="font-size:14px">Normal</p>
                          </a>
                        </li>
                        <li>
                          <a data-edit="fontSize 1">
                            <p style="font-size:11px">Small</p>
                          </a>
                        </li>
                      </ul>
                    </div>

                    <div class="btn-group">
                      <a class="btn" data-edit="bold" title="" data-original-title="Bold (Ctrl/Cmd+B)"><i class="fa fa-bold"></i></a>
                      <a class="btn" data-edit="italic" title="" data-original-title="Italic (Ctrl/Cmd+I)"><i class="fa fa-italic"></i></a>
                      <a class="btn" data-edit="strikethrough" title="" data-original-title="Strikethrough"><i class="fa fa-strikethrough"></i></a>
                      <a class="btn" data-edit="underline" title="" data-original-title="Underline (Ctrl/Cmd+U)"><i class="fa fa-underline"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn" data-edit="insertunorderedlist" title="" data-original-title="Bullet list"><i class="fa fa-list-ul"></i></a>
                      <a class="btn" data-edit="insertorderedlist" title="" data-original-title="Number list"><i class="fa fa-list-ol"></i></a>
                      <a class="btn" data-edit="outdent" title="" data-original-title="Reduce indent (Shift+Tab)"><i class="fa fa-dedent"></i></a>
                      <a class="btn" data-edit="indent" title="" data-original-title="Indent (Tab)"><i class="fa fa-indent"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn btn-info" data-edit="justifyleft" title="" data-original-title="Align Left (Ctrl/Cmd+L)"><i class="fa fa-align-left"></i></a>
                      <a class="btn" data-edit="justifycenter" title="" data-original-title="Center (Ctrl/Cmd+E)"><i class="fa fa-align-center"></i></a>
                      <a class="btn" data-edit="justifyright" title="" data-original-title="Align Right (Ctrl/Cmd+R)"><i class="fa fa-align-right"></i></a>
                      <a class="btn" data-edit="justifyfull" title="" data-original-title="Justify (Ctrl/Cmd+J)"><i class="fa fa-align-justify"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn dropdown-toggle" data-toggle="dropdown" title="" data-original-title="Hyperlink"><i class="fa fa-link"></i></a>
                      <div class="dropdown-menu input-append">
                        <input class="span2" placeholder="URL" type="text" data-edit="createLink">
                        <button class="btn" type="button">Add</button>
                      </div>
                      <a class="btn" data-edit="unlink" title="" data-original-title="Remove Hyperlink"><i class="fa fa-cut"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn" title="" id="pictureBtn" data-original-title="Insert picture (or just drag &amp; drop)"><i class="fa fa-picture-o"></i></a>
                      <input type="file" data-role="magic-overlay" data-target="#pictureBtn" data-edit="insertImage" style="opacity: 0; position: absolute; top: 0px; left: 0px; width: 41px; height: 34px;">
                    </div>

                    <div class="btn-group">
                      <a class="btn" data-edit="undo" title="" data-original-title="Undo (Ctrl/Cmd+Z)"><i class="fa fa-undo"></i></a>
                      <a class="btn" data-edit="redo" title="" data-original-title="Redo (Ctrl/Cmd+Y)"><i class="fa fa-repeat"></i></a>
                    </div>
                  </div>

                 

                  <div id="editor" name="uraian" class="editor-wrapper placeholderText" contenteditable="true">            
                  </div>

                      <textarea name="uraian" id="uraian" style="display: none;"></textarea>


                  <div class="ln_solid"></div>


 <!-- bootstrap-wysiwyg -->
    <script>
      $(document).ready(function() {
        function initToolbarBootstrapBindings() {
          var fonts = ['Serif', 'Sans', 'Arial', 'Arial Black', 'Courier',
              'Courier New', 'Comic Sans MS', 'Helvetica', 'Impact', 'Lucida Grande', 'Lucida Sans', 'Tahoma', 'Times',
              'Times New Roman', 'Verdana'
            ],
            fontTarget = $('[title=Font]').siblings('.dropdown-menu');
          $.each(fonts, function(idx, fontName) {
            fontTarget.append($('<li><a data-edit="fontName ' + fontName + '" style="font-family:\'' + fontName + '\'">' + fontName + '</a></li>'));
          });
          $('a[title]').tooltip({
            container: 'body'
          });
          $('.dropdown-menu input').click(function() {
              return false;
            })
            .change(function() {
              $(this).parent('.dropdown-menu').siblings('.dropdown-toggle').dropdown('toggle');
            })
            .keydown('esc', function() {
              this.value = '';
              $(this).change();
            });

          $('[data-role=magic-overlay]').each(function() {
            var overlay = $(this),
              target = $(overlay.data('target'));
            overlay.css('opacity', 0).css('position', 'absolute').offset(target.offset()).width(target.outerWidth()).height(target.outerHeight());
          });

          if ("onwebkitspeechchange" in document.createElement("input")) {
            var editorOffset = $('#editor').offset();

            $('.voiceBtn').css('position', 'absolute').offset({
              top: editorOffset.top,
              left: editorOffset.left + $('#editor').innerWidth() - 35
            });
          } else {
            $('.voiceBtn').hide();
          }
        }

        function showErrorAlert(reason, detail) {
          var msg = '';
          if (reason === 'unsupported-file-type') {
            msg = "Unsupported format " + detail;
          } else {
            console.log("error uploading file", reason, detail);
          }
          $('<div class="alert"> <button type="button" class="close" data-dismiss="alert">&times;</button>' +
            '<strong>File upload error</strong> ' + msg + ' </div>').prependTo('#alerts');
        }

        initToolbarBootstrapBindings();

        $('#editor').wysiwyg({
          fileUploadError: showErrorAlert
        });

        $('#form_tindakan').submit(function(){
          $("#uraian").val($("#editor").html());
        })

        window.prettyPrint;
        prettyPrint();

        $(".js-example-basic-multiple").select2();
 
      });
    </script>

Membuat Global Variable di Laravel

buat folder composers di dalamfolder app

buat file di app/composers dengan nama NavbarComposer.php

<?php

/**

*

*/

namespace App\Composers;

use Illuminate\Contracts\View\View;

use App\Models\Incompatibility;



class NavbarComposer{



 public function compose($view){

  $incompatibilities=Incompatibility::where('status','=',NULL)->get();



  $view->with('incompatibilities',$incompatibilities);

 } 

}

?>





Terus edit file AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->buatNavbar();
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('user','App\Models\User');
    }

    private function buatNavbar(){
        view()->composer('backend.layout.app','App\Composers\NavbarComposer');
    }
}



Mengambil nilai array yang di inginkan

mengambil nilai array di inginkan menngunakan array_pluck di laravel

contoh saya punya array seperti ini

array:2 [▼
  0 => array:1 [▼
    "departement" => array:2 [▼
      "id" => 3
      "nama_departement" => "IT"
    ]
  ]
  1 => array:1 [▼
    "departement" => array:2 [▼
      "id" => 6
      "nama_departement" => "Marketing"
    ]
  ]
]
bagaimana jika saya ingin mengambil hanya nama departement saja
gunakan array_pluck

array_pluck($depart,'departement.nama_departement')

dan Hasilnya 

array:2 [▼
  0 => "IT"
  1 => "Marketing"
]

Dokumentasi mengenai array_pluck

Mengambil Paramater Route dari Middleware

Cara Mengambil nilai parameter route di Laravel

di routes.php untuk laravel 5.2 ke bawah

dan web.php di laravel 5.3

Route::GET('corrective/create/{id}',['uses'=>'CorrectiveController@create','as'=>'corrective.create'])->middleware('hasCorrective');



dan di middleware nya

 $id=$request->route()->parameters('id');

coba echo menggunakan dd untuk mengetahui nilai nya

echo dd($id)

textxbox dinamis


@extends('layouts.app')

@section('content')
Create Test


@endsection @push('scripts') @endpush

Error Gulp Watch di Ubuntu


jalankan :

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
https://github.com/gulpjs/gulp/issues/217

merubah string jadi variabel di PHP

$$ mengubah string jadi variabel

  for ($i=1; $i <= 10; $i++) {

    $b='bulan'.$i;

    $$b='bulan ke'.$i;

  }



echo $bulan3; //hasilnya bulan ke3



dokumentasi resmi PHP nya http://php.net/manual/en/language.variables.variable.php

Edit password user login

public function updateProfile($id,Request $request){

        $rules=[
            'old_password'=>'required|old_password_validation',
            'password'=>'required|confirmed',
            'password_confirmation'=>'required'];
       
        $pesan=[
            'old_password_validation'=>'Pasword lama Salah',
            ];

        Validator::extend('old_password_validation', function($field, $value, $parameters)
            {
                return Hash::check($value, Auth::User()->password);
            });

        $validator = Validator::make($request->all(), $rules, $pesan);  
             if ($validator->fails()){
                  return redirect()->back()
                    ->withErrors($validator)
                    ->withInput($request->except('password'));
            }

            $user=User::find($id);
            $user->password=bcrypt($request->input('password'));
            $user->nama=$request->input('nama');
            $user->save();

            return redirect()->back();

    }

Faker di Laravel

faker di laravel berfungsi untuk membuat data dummy jadi jika kita butuh sample data banyak..
tidak perlu menginput satu-satu ke dalam database
CMIWW

contoh penggunaan

$faker = Faker\Factory::create();

    $limit = 10000;

    $users=App\User::all();

    for ($i = 0; $i < $limit; $i++) {
        App\User::create([
        'name'=>$faker->name,
        'email'=>$faker->unique()->email,
        'phone'=>$faker->phoneNumber
        ]);
    }


dari syntax di atas akan menginput data sejumlah 10000 record ke table user..
jadi data di looping sesuai variable limit

loop variable di laravel 5.3

doc laravel blade loop

$loop->iteration /untuk mengambil no looping sekarang

$loop->count /untuk menghitung jumlah looping

Laravel-elixir-error

error saat running gulp

TypeError: Elixir.ready is not a function
    at Object.<anonymous> (/var/www/html/demand/node_modules/laravel-elixir-vue/main.js:3:8)

masuk ke direktori project 

npm install laravel-elixir-vueify

dan jika masih ada error atau ada error seperti ini 

TypeError: Cannot read property 'transformers' of undefined

jalankan perintah 

npm install laravel-elixir-browserify-official --save-dev


rubah file gulpfile.js

awal
require('laravel-elixir-vue');

menjadi
require('laravel-elixir-vueify');

reference:

https://github.com/JeffreyWay/laravel-elixir-browserify

https://github.com/JeffreyWay/laravel-elixir-vueify

https://github.com/JeffreyWay/laravel-elixir-vueify/issues/26

https://github.com/JeffreyWay/Laravel-Elixir-v6-Vue-example/issues/1

https://laracasts.com/discuss/channels/elixir/cannot-find-module-vendorlaravelelixirelixir


cara install gulp di ubuntu

cara install gulp di ubuntu



Masuk ke direktori laravel 
jalankan perintah npm install gulp

Apa Yang Baru di Laravel 5.3 ??

direktori dan file routes berubah

di laravel 5.2 file routes.php ada di app/http/routes.php

sedangkan di laravel 5.3 routes.php berubah menjadi web.php dan direktori menjadi routes/web.php

route logout,, jika di laravel sebelumnya Route::get('logout'),method harus di rubah jadi post

laravel error composer



solusi..

update composser..

composer self-update

Laravel Validation return Json

 $validator = Validator::make($data = $request->all(),User::$rules);
        if ($validator->fails())
        {
            return response()->Json(array('errors'=>$validator->errors()->toArray()));
        }