menu

Showing posts with label Phalcon. Show all posts
Showing posts with label Phalcon. Show all posts

Phalcon - CRUD (Delete)


Akhirnya sampai juga pada tutorial terakhir sistem CRUD Phalcon, pada tutorial terakhir ini kita akan membuat feature delete yang akan digunakan untuk menghapus data user pada database

Oke langsung saja kita mulai tutorialnya,
Pertama, buat terlebih dahulu routenya dengan mengedit file router.php pada path app/config/ menjadi seperti ini,
<?php

$router = $di->getRouter();

// Define your routes here
/**
 * Get user lists data by query
 */
$router->addGet(
    "/user",
    [
        "controller"        => "user",
        "action"            => "index"
    ]
);
$router->addGet(
    "/user/{userId}",
    [
        "controller"        => "user",
        "action"            => "show"
    ]
);
$router->addGet(
    "/user/create",
    [
        "controller"        => "user",
        "action"            => "create"
    ]
);
$router->addPost(
    "/user/create",
    [
        "controller"        => "user",
        "action"            => "save"
    ]
);
$router->addDelete(
    "/user/delete/{userId}",
    [
        "controller"        => "user",
        "action"            => "delete"
    ]
);
$router->addPut(
    "/user/edit/{userId}",
    [
        "controller"        => "user",
        "action"            => "edit"
    ]
);

$router->addGet(
    "/test",
    [
        "controller"        => "test",
        "action"            => "test"
    ]
);

$router->handle();

Selanjutnya, buat method delete dengan mengedit file UserController.php pada path app/controllers/ menjadi seperti ini,
<?php

class UserController extends ControllerBase
{
    public function indexAction()
    {
     $users = Users::find();
     $this->view->title = "Phalcon - Users";
     $this->view->users = $users;
     // dd($users);
    }

    public function showAction($userId)
    {
     $conditions = ['userId'=>$userId];
     $user = Users::findFirst([
      'conditions' => 'id=:userId:',
      'bind' => $conditions,
  ]);
     $this->view->title = "Phalcon - User";
     $this->view->user = $user;
     // dd($users);
    }

    public function createAction()
    {
        $this->view->title = "Phalcon - Create user";
    }

    public function saveAction()
    {
        $name = $this->request->get('name');
        $email = $this->request->get('email');
        $address = $this->request->get('address');

        $user = new Users();
        $user->name = $name;
        $user->email = $email;
        $user->address = $address;

        if ($this->request->isPost()) {
            if ($user->create()) {
                return $this->response->redirect('user');
            }
        } else {
            $this->flash->error('User form is not valid.');
        }
    }

    public function deleteAction($userId)
    {
        $conditions = ['userId'=>$userId];
        $user = Users::findFirst([
            'conditions' => 'id=:userId:',
            'bind' => $conditions,
        ]);
        if ($user->delete() === false) {
            $messages = $user->getMessages();
            foreach ($messages as $message) {
                $this->flash->error($message);
            }
        } else {
            return $this->response->redirect('user');
        }
    }

    public function editAction($userId)
    {
        $conditions = ['userId'=>$userId];
        $user = Users::findFirst([
            'conditions' => 'id=:userId:',
            'bind' => $conditions,
        ]);
        $this->view->title = "Phalcon - User";
        $this->view->user = $user;

        if ($this->request->isPost()) {
            $name = $this->request->get('name');
            $email = $this->request->get('email');
            $address = $this->request->get('address');

            $user->name = $name;
            $user->email = $email;
            $user->address = $address;

            if ($user->save()) {
                return $this->response->redirect('user');
            } else {
                $messages = $user->getMessages();
                foreach ($messages as $message) {
                    $this->flash->error($message);
                }
            }
        }
    }
}

Terakhir buat button atau link untuk menghapus data pada view index dengan mengedit file index.volt pada path app/views/user/ menjadi seperti ini,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
 <br><br>
 <div class="row">
  <div class="col-md-12">
   user list:
   <br><br>
   <table width="100%">
    <tr>
     <th>Name</th>
     <th>Action</th>
    </tr>
    {% for user in users %}
     <tr>
      <td>{{ user.name }}</td>
      <td><a href="user/{{ user.id }}">show</a> || <a href="user/edit/{{ user.id }}">edit</a> || <a href="user/delete/{{ user.id }}">delete</a></td>
     </tr>
    {% endfor %}
   </table>
   <br>
   <button onclick="window.location.href='user/create'">Create</button>
  </div>
 </div>
{% endblock %}

Sehingga tampilan halaman utamanya akan tampak seperti ini,


===DONE!===

Phalcon - CRUD (Update)


Pada tutorial kemarin kita sudah membuat feature untuk menambahkan data user pada database, tutorial kali kita akan membuat feature untuk mengedit data user pada database

Oke kita mulai saja experimentnya,
Pertama, buat terlebih dahulu routenya dengan cara mengedit file router.php pada path app/config/ edit menjadi seperti ini,
<?php

$router = $di->getRouter();

// Define your routes here
/**
 * Get user lists data by query
 */
$router->addGet(
    "/user",
    [
        "controller"        => "user",
        "action"            => "index"
    ]
);
$router->addGet(
    "/user/{userId}",
    [
        "controller"        => "user",
        "action"            => "show"
    ]
);
$router->addGet(
    "/user/create",
    [
        "controller"        => "user",
        "action"            => "create"
    ]
);
$router->addPost(
    "/user/create",
    [
        "controller"        => "user",
        "action"            => "save"
    ]
);
$router->addPut(
    "/user/edit/{userId}",
    [
        "controller"        => "user",
        "action"            => "edit"
    ]
);

$router->addGet(
    "/test",
    [
        "controller"        => "test",
        "action"            => "test"
    ]
);

$router->handle();

Selanjutnya, tambahkan method baru pada controller dengan cara mengedit file UserController.php pada path app/controllers/ edit menjadi seperti ini,
<?php

class UserController extends ControllerBase
{
    public function indexAction()
    {
     $users = Users::find();
     $this->view->title = "Phalcon - Users";
     $this->view->users = $users;
     // dd($users);
    }

    public function showAction($userId)
    {
     $conditions = ['userId'=>$userId];
     $user = Users::findFirst([
      'conditions' => 'id=:userId:',
      'bind' => $conditions,
  ]);
     $this->view->title = "Phalcon - User";
     $this->view->user = $user;
     // dd($users);
    }

    public function createAction()
    {
        $this->view->title = "Phalcon - Create user";
    }

    public function saveAction()
    {
        $name = $this->request->get('name');
        $email = $this->request->get('email');
        $address = $this->request->get('address');

        $user = new Users();
        $user->name = $name;
        $user->email = $email;
        $user->address = $address;

        if ($this->request->isPost()) {
            if ($user->create()) {
                return $this->response->redirect('user');
            }
        } else {
            $this->flash->error('User form is not valid.');
        }
    }

    public function editAction($userId)
    {
        $conditions = ['userId'=>$userId];
        $user = Users::findFirst([
            'conditions' => 'id=:userId:',
            'bind' => $conditions,
        ]);
        $this->view->title = "Phalcon - User";
        $this->view->user = $user;

        if ($this->request->isPost()) {
            $name = $this->request->get('name');
            $email = $this->request->get('email');
            $address = $this->request->get('address');

            $user->name = $name;
            $user->email = $email;
            $user->address = $address;

            if ($user->save()) {
                return $this->response->redirect('user');
            } else {
                $messages = $user->getMessages();
                foreach ($messages as $message) {
                    $this->flash->error($message);
                }
            }
        }
    }
}

Kemudian, buat file view baru dengan nama edit.volt pada path app/views/user/ dan isikan code berikut,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
 <br><br>
 <div class="row">
  <div class="col-md-12">
   <form method="POST">
    <div class="form-group">
     <label>Nama user</label>
     <input type="text" name="name" class="form-control" placeholder="Type your name" required value="{{ user.name }}">
    </div>
    <div class="form-group">
     <label>Email user</label>
     <input type="email" name="email" class="form-control" placeholder="Type your email" required value="{{ user.email }}">
    </div>
    <div class="form-group">
     <label>Address user</label>
     <textarea name="address" class="form-control" placeholder="Type your address" required>{{ user.address }}</textarea>
    </div>
    <input type="submit" value="Save"> <button type="button" onclick="window.location.href='../../user'">Cancel</button>
   </form>
  </div>
 </div>
{% endblock %}

Terakhir, tambahkan link untuk kehalaman update dengan cara edit file index.volt pada path app/views/user/ menjadi seperti ini,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
 <br><br>
 <div class="row">
  <div class="col-md-12">
   user list:
   <br><br>
   <table width="100%">
    <tr>
     <th>Name</th>
     <th>Action</th>
    </tr>
    {% for user in users %}
     <tr>
      <td>{{ user.name }}</td>
      <td><a href="user/{{ user.id }}">show</a> || <a href="user/edit/{{ user.id }}">edit</a></td>
     </tr>
    {% endfor %}
   </table>
   <br>
   <button onclick="window.location.href='user/create'">Create</button>
  </div>
 </div>
{% endblock %}

Sehingga tampilan halaman editnya akan tampak seperti ini,



===DONE!===

Phalcon - CRUD (Create)


Pada tutorial sebelumnya kita sudah membuat sistem read data user dari database dan menampilkannya dalam list maupun detail per masing-masing user. Pada tutorial kali ini kita akan membuat sistem create untuk menginputkan atau menambah data user pada database

Oke kita langsung saja memulai eksperiment create data pada phalcon,
Pertama, buat terlebih dahulu route untuk create dengan mengedit file router.php pada path app/config/ menjadi seperti ini,
<?php

$router = $di->getRouter();

// Define your routes here
/**
 * Get user lists data by query
 */
$router->addGet(
    "/user",
    [
        "controller"        => "user",
        "action"            => "index"
    ]
);
$router->addGet(
    "/user/{userId}",
    [
        "controller"        => "user",
        "action"            => "show"
    ]
);
$router->addGet(
    "/user/create",
    [
        "controller"        => "user",
        "action"            => "create"
    ]
);
$router->addPost(
    "/user/create",
    [
        "controller"        => "user",
        "action"            => "save"
    ]
);

$router->addGet(
    "/test",
    [
        "controller"        => "test",
        "action"            => "test"
    ]
);

$router->handle();

Selanjutnya, buat controller untuk menampilkan halaman create dan untuk menyimpan data user baru dengan mengedit file UserController.php pada path app/controllers/ menjadi seperti ini,
<?php

class UserController extends ControllerBase
{
    public function indexAction()
    {
     $users = Users::find();
     $this->view->title = "Phalcon - Users";
     $this->view->users = $users;
     // dd($users);
    }

    public function showAction($userId)
    {
     $conditions = ['userId'=>$userId];
     $user = Users::findFirst([
      'conditions' => 'id=:userId:',
      'bind' => $conditions,
  ]);
     $this->view->title = "Phalcon - User";
     $this->view->user = $user;
     // dd($users);
    }

    public function createAction()
    {
        $this->view->title = "Phalcon - Create user";
    }

    public function saveAction()
    {
        $name = $this->request->get('name');
        $email = $this->request->get('email');
        $address = $this->request->get('address');

        $user = new Users();
        $user->name = $name;
        $user->email = $email;
        $user->address = $address;

        if ($this->request->isPost()) {
            if ($user->create()) {
                return $this->response->redirect('user');
            }
        } else {
            $this->flash->error('User form is not valid.');
        }
    }
}

Kemudian, buat file view untuk create dengan membuat file baru dengan nama create.volt pada path app/views/user/ dan isikan code berikut,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
 <br><br>
 <div class="row">
  <div class="col-md-12">
   <form method="POST">
    <div class="form-group">
     <label>Nama user</label>
     <input type="text" name="name" class="form-control" placeholder="Type your name" required>
    </div>
    <div class="form-group">
     <label>Email user</label>
     <input type="email" name="email" class="form-control" placeholder="Type your email" required>
    </div>
    <div class="form-group">
     <label>Address user</label>
     <textarea name="address" class="form-control" placeholder="Type your address" required></textarea>
    </div>
    <input type="submit" value="Save"> <button type="button" onclick="window.location.href='../user'">Cancel</button>
   </form>
  </div>
 </div>
{% endblock %}

Terakhir, edit file view index.volt pada path app/views/user/ menjadi seperti ini,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
 <br><br>
 <div class="row">
  <div class="col-md-12">
   user list:
   <br><br>
   <table width="100%">
    <tr>
     <th>Name</th>
     <th>Action</th>
    </tr>
    {% for user in users %}
     <tr>
      <td>{{ user.name }}</td>
      <td><a href="user/{{ user.id }}">show</a></td>
     </tr>
    {% endfor %}
   </table>
   <br>
   <button onclick="window.location.href='user/create'">Create</button>
  </div>
 </div>
{% endblock %}

Sehingga hasilnya akan tampak seperti ini,



===DONE!===

Phalcon - CRUD (Read)



Back to phalcon, pada tutorial kemarin kita sudah sampai pada experiment menambahkan mirgation dan seeder secara manual pada project phalcon kita,

Pada tutorial kali ini, kita akan mulai bereksperiment membuat sistem crud, untuk tutorial crud yang pertama yaitu read, yang berarti mendapatkan data dari database yang kemudian menampilkannya pada project kita.

Oke langsung saja kita mulai experimentnya,
Pertama, edit file router.php pada path app/config/ yang satu mengarah pada list user dan yang satu lagi digunakan untuk melihat detail user,

<?php

$router = $di->getRouter();

// Define your routes here
/**
 * Get user lists data by query
 */
$router->addGet(
    "/user",
    [
        "controller"        => "user",
        "action"            => "index"
    ]
);
$router->addGet(
    "/user/{userId}",
    [
        "controller"        => "user",
        "action"            => "show"
    ]
);

$router->addGet(
    "/test",
    [
        "controller"        => "test",
        "action"            => "test"
    ]
);

$router->handle();

Selajutnya, edit file  UserController.php pada path app/controllers/ menjadi seperti ini
<?php

class UserController extends ControllerBase
{
    public function indexAction()
    {
     $users = Users::find();
     $this->view->title = "Phalcon - Users";
     $this->view->users = $users;
     // dd($users);
    }

    public function showAction($userId)
    {
     $conditions = ['userId'=>$userId];
     $user = Users::findFirst([
      'conditions' => 'id=:userId:',
      'bind' => $conditions,
  ]);
     $this->view->title = "Phalcon - User";
     $this->view->user = $user;
     // dd($users);
    }
}

Kemudian, buat file view index.volt pada path app/views/user/ yang digunakan untuk menampilkan list user kemudian isikan code berikut,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
 <br><br>
 <div class="row">
  <div class="col-md-12">
   user list:
   <br><br>
   <table width="100%">
    <tr>
     <th>Name</th>
     <th>Action</th>
    </tr>
    {% for user in users %}
     <tr>
      <td>{{ user.name }}</td>
      <td><a href="user/{{ user.id }}">show</a></td>
     </tr>
    {% endfor %}
   </table>
   
  </div>
 </div>
{% endblock %}

Terakhir, buat file view show.volt pada path app/views/user yang digunakan untuk menampilkan detail user kemudian isikan code berikut,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 User Detail
 <br><br>
 <table width="100%">
  <tr>
   <td>Name</td><td>:</td><td>{{ user.name }}</td>
  </tr>
  <tr>
   <td>Email</td><td>:</td><td>{{ user.email }}</td>
  </tr>
  <tr>
   <td>Address</td><td>:</td><td>{{ user.address }}</td>
  </tr>
 </table>
 <br><br>
 <button onclick="window.location.href='../user'">Back</button>
{% endblock %}

Sehingga tampilannya akan tampak seperti ini,



===DONE!===

Phalcon - Migration and seed


Pada tutorial kemarin kita sudah berkenalan dengan syntax-syntax phalcon,

Tutorial kali ini kita akan membuat migration dan seeder database, dikarenakan sampai saat tutorial ini dibuat phalcon belum menyediakan function untuk migration dan seed database maka kita akan membuatnya dengan cara manual.

Oke langsung saja kita mulai tutorialnya pertama, buat file mirgate.php pada path app/migrations/ dan isikan code berikut,
<?php

defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?: realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');

if (!function_exists('env')) {
    // Use composer autoloader to load vendor classes
 require_once BASE_PATH . '/vendor/autoload.php';

 /**
  * Environment variables
  */
 $dotenv = new Dotenv\Dotenv(BASE_PATH . '/');
 $dotenv->load();
}

$host = getenv('DB_HOST');
$user = getenv('DB_USER');
$pass = getenv('DB_PASS');
$dbname = getenv('DB_NAME');

try {
    $db = new PDO("mysql:host=$host;CHARSET=utf8;COLLATE=utf8_unicode_ci", $user, $pass);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->exec("CREATE DATABASE IF NOT EXISTS `$dbname`; CREATE USER '$user'@'localhost' IDENTIFIED BY '$pass'; GRANT ALL ON `$dbname`.* TO '$user'@'localhost'; FLUSH PRIVILEGES; DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci") 
    or die(print_r($db->errorInfo(), true));
} catch(PDOException $e) {
    die("DB ERROR: ". $e->getMessage());
}

//migrate
include_once "users.php";

//seed
include_once "user_seed.php";

echo "\n Success All!!! \n";

Selanjutnya, pada path yang sama buat file users.php dan isikan code berikut,
<?php

$tablename = "users";

try {
    $db = new PDO("mysql:dbname=$dbname;host=$host;CHARSET=utf8;COLLATE=utf8_unicode_ci", $user, $pass);
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $db->exec("CREATE TABLE IF NOT EXISTS $tablename(
      id bigint( 20 ) AUTO_INCREMENT PRIMARY KEY,
      name varchar( 50 ) COLLATE utf8_unicode_ci NOT NULL,
      email varchar( 150 ) COLLATE utf8_unicode_ci NOT NULL, 
      address text( 150 ) COLLATE utf8_unicode_ci,
      created_at timestamp DEFAULT CURRENT_TIMESTAMP,
      updated_at timestamp DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci");
    print("Created $tablename Table success.\n");
} catch(PDOException $e) {
    echo $e->getMessage();
}

Terakhir, pada path yang sama juga buat file user_seed.php dan isikan code berikut,
<?php

$tablename = "users";

try {
    $db = new PDO("mysql:dbname=$dbname;host=$host;CHARSET=utf8;COLLATE=utf8_unicode_ci", $user, $pass);
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $db->exec("TRUNCATE TABLE $tablename;");
    $db->exec("INSERT INTO $tablename (name, email, address) VALUES ('Dracule', 'dracule@mail.com', 'Jalan ganteng kali no. 1')");
    $db->exec("INSERT INTO $tablename (name, email, address) VALUES ('Mihawk', 'mihawk@mail.com', 'Jalan ganteng kali no. 2')");
    print("Seed $tablename Table success.\n");
} catch(PDOException $e) {
    echo $e->getMessage();
}

Sehingga tampilan struktur file nya akan tampak seperti ini,


Untuk mengetestnya, buka terminal dan arahkan pada path project anda, kemudian masukan syntax berikut pada terminal,
php app/mirgations/mirgate.php

Sehingga tampilanya akan tampak seperti ini,


Dan hasilnya akan tampak seperti ini,


===DONE!===

Phalcon - Introduction syntax


Pada tutorial kemarin kita sudah berexperiment menambahkan file .env dan membuat function dd yang digunakan untuk debug code,

Sebelum masuk ke tutorial crud maka ada baiknya kita biasakan diri terlebih dahulu dengan syntax-syntax yang ada apa phalcon,

Oke langsung saja kita mulai bereksperiment dengan phalcon,
Pertama, edit file router.php pada path app/config/ menjadi seperti ini, 
<?php

$router = $di->getRouter();

// Define your routes here
/**
 * Get user lists data by query
 */
$router->addGet(
    "/test",
    [
        "controller"        => "test",
        "action"            => "test"
    ]
);

$router->handle();

Selanjutnya, buat file TestController.php dan isikan code berikut,
<?php

use Phalcon\Forms\Element\Text;
use Phalcon\Forms\Form;

class TestController extends ControllerBase
{
    public function testAction()
    {
     $users = ['aan', 'hei', 'lala'];
     $genders = [
      'LK' => 'Laki-laki',
      'PR' => 'Perempuan'
     ];
        $data['users'] = $users;
        $data['genders'] = $genders;

        //play form phalcon, untuk lebih jelasnya akan dijelaskan pada bab crud
        $form = new Form();
        $name = new Text("name", array('placeholder' => 'Type your name'));
        $name->setLabel('Nama user');
        $form->add($name);
        // dd($data);
     $this->view->data = $data;
        $this->view->form = $form;
     $this->view->title = "Phalcon - User";
    }
}

Kemudian, buat file view test.volt pada path app/views/test/ dan isikan code berikut,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br>
 <div class="row">
  <div class="col-md-12">
   Hello codedoct!!!
   <br>
   users:
   {% if (data['users']) %}
    <ul>
     {% for user in data['users'] %}
      <li>{{user}}</li>
     {% endfor %}
    </ul>
   {% endif %}
  </div>
 </div>

 <div class="row">
  <div class="col-md-12">
   gender:
   <ul>
    {% for key, value in data['genders'] %}
     <li>{{value}}</li>
    {% endfor %}
   </ul>
  </div>
 </div>
 <br>
 <h5>Yang atas menggunakan form phalcon yang bawah menggunakan form biasa</h5>
 <div class="row">
  <div class="col-md-12">
   {{ form.label('name') }}
   {{ form.render('name', ['class':'form-control']) }}
   <br>
  </div>
 </div>
 <div class="row">
  <div class="col-md-12">
   <label>Nama user</label>
   <input type="text" name="name" class="form-control" placeholder="Type your name">
  </div> 
 </div>
 
{% endblock %}

Untuk mengetestnya buka url project phalcon kita dan arahkan pada route test, sehingga akan tampak seperti gambar dibawah ini,


Silahkan dipelajari sendiri syntax-syntaxnya, hehe..

===DONE!===

Phalcon - Add ENV and function dd


Pada tutorial kemarin kita sudah membuat koneksi database pada phalcon dan instalasi composer, tutorial kali ini kita akan menambahkan file .env dan instalasi debuger pada phalcon.

Oke, langsung saja kita mulai experimentnya.
Pertama, edit file config.php pada path app/config/ menjadi seperti ini,
<?php
/*
 * Modified: prepend directory path of current file, because of this file own different ENV under between Apache and command line.
 * NOTE: please remove this comment.
 */
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?: realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
// defined('BASE_URL');

if (!function_exists('env')) {
    /**
     * Load start
     */
    include_once APP_PATH . "/config/start.php";
}

return new \Phalcon\Config([
    'database' => [
        'adapter'     => 'Mysql',
        'host'        => env('DB_HOST'),
        'username'    => env('DB_USER'),
        'password'    => env('DB_PASS'),
        'dbname'      => env('DB_NAME'),
        'charset'     => 'utf8',
    ],
    'application' => [
        'appDir'         => APP_PATH . '/',
        'controllersDir' => APP_PATH . '/controllers/',
        'modelsDir'      => APP_PATH . '/models/',
        'migrationsDir'  => APP_PATH . '/migrations/',
        'viewsDir'       => APP_PATH . '/views/',
        'pluginsDir'     => APP_PATH . '/plugins/',
        'libraryDir'     => APP_PATH . '/library/',
        'cacheDir'       => BASE_PATH . '/cache/',

        // This allows the baseUri to be understand project paths that are not in the root directory
        // of the webpspace.  This will break if the public/index.php entry point is moved or
        // possibly if the web server rewrite rules are changed. This can also be set to a static path.
        'baseUri'        => preg_replace('/public([\/\\\\])index.php$/', '', $_SERVER["PHP_SELF"]),
    ]
]);

Setelah itu, edit file composer.json pada path root menjadi seperti ini,
{
 "name": "codedoct",
 "type": "project",
 "authors": [
        {
            "name": "Mihawk"
        }
    ],
 "require": {
  "guzzlehttp/guzzle": "~6.0"
 },
 "require-dev": {
        "symfony/var-dumper": "2.7.*",
        "vlucas/phpdotenv": "~2.0"
    }
}
Pada code composer diatas kita menbahkan plugin untuk env dan debuger.

Selanjutnya, buat file start.php pada path app/config/ dan isikan code berikut,
<?php
/**
 * Start loader configuration
 */

// Use composer autoloader to load vendor classes
require_once BASE_PATH . '/vendor/autoload.php';

/**
 * Environment variables
 */
$dotenv = new Dotenv\Dotenv(BASE_PATH . '/');
$dotenv->load();

/**
 * Include helpers
 */
include_once BASE_PATH . '/helpers.php';

/*
 * Debug
 */
if (env('APP_ENV') == 'dev') {
    $debug = new \Phalcon\Debug();
    $debug->listen();
}
Dapat dilihat dari code start diatas, kita menambahkan path vendor yang sudah kita build pada tutorial sebelumnya.

Kemudian buat file helpers.php pada path root dan isikan code berikut,
<?php

/**
 * Get .env value and return second parameter as default value
 */
function env($name, $default = null)
{
    return (getenv($name)) ?: $default;
}

/**
 * Current shortcode only available on dev env
 */
if (env('APP_ENV') == 'dev')
{
    /**
     * Simple function for better debugging view
     */
    class Dumper
    {
        /**
         * Dump a value with elegance.
         *
         * @param  mixed  $value
         * @return void
         */
        public function dump($value)
        {
            $dumper = 'cli' === PHP_SAPI ? new \Symfony\Component\VarDumper\Dumper\CliDumper : new \Symfony\Component\VarDumper\Dumper\HtmlDumper;
            $dumper->dump((new \Symfony\Component\VarDumper\Cloner\VarCloner)->cloneVar($value));
        }
    }

    if (!function_exists('dd')) {
        /**
         * Dump the passed variables and end the script.
         *
         * @param  mixed
         * @return void
         */
        function dd()
        {
            array_map(function ($x) {
                (new Dumper)->dump($x);
            }, func_get_args());
            die(1);
        }
    }
}
Dapat dilihat dari code helpers diatas kita menambahkan function dd yang akan digunakan untuk mendebug code.

Terakhir buat file .env pada path root dan isikan code berkut,
APP_ENV="dev"

DB_HOST="localhost"
DB_USER="root"
DB_PASS="root"
DB_NAME="phalcon-experiment_312"

Sehingga struktur file yang baru akan tampak seperti ini,


===DONE!===

Phalcon - Koneksi database dan add vendor


Pada tutorial kali ini kita akan melanjutkan project phalcon yang sebelumnya sudah sampai pada tutorial restruktur phalcon view.

Tutorial kali ini akan membahas tentang membuat koneksi database pada phalcon dan instalasi vendor, oke langsung saja kita mulai experimentnya.

Sebelum membuat koneksi database, buat databasenya terlebih dahulu pada phpmyadmin seperti pada tutorial berikut,

Jika database sudah dibuat, selanjutnya kita akan membuat koneksi database terlebih dahulu, caranya buka file config pada path /app/config/ dan edit bagian database menjadi seperti ini,
'database' => [
    'adapter'     => 'Mysql',
    'host'        => 'localhost',
    'username'    => 'root',
    'password'    => 'rahasia',
    'dbname'      => 'codedoct_phalcon',
    'charset'     => 'utf8',
],

Untuk mengetesnya buka terminal, masuk kedirectory project dan sesuaikan username, password, dan database name pada mysql  
$phalcon migration run

Sehingga akan muncul tampilan seperti pada gambar dbawah,


Jika muncul seperti pada gambar dibawah, berarti username atau password atau dbname salah di masukan.


Selanjutnya instalasi composer bisa lihat disini, jika sudah buat file composer.json pada project phalcon, dan isikan code berikut,
{
 "name": "codedoct",
 "type": "project",
 "authors": [
            {
               "name": "Mihawk"
            }
        ],
 "require": {
  "guzzlehttp/guzzle": "~6.0"
 }
}

Composer akan membuat folder baru bernama vendor dan file composer.lock sehingga akan tampak seperti gambar dibawah strukturnya,



===DONE!===

Phalcon - Restruktur volt


Tutorial kemarin kita sudah mempelajari rules atau cara kerja route-controller-view pada phalcon, sekarang kita akan mempelajari struktur volt sehingga lebih struktural, oke langsung saja kita mulai experimentnya,

Pertama, buka halaman users yang sudah kita buat sebelumnya pada browser sehingga akan tampak gambar seperti ini,


Pada gambar diatas dapat dilihat ada margin kiri pada text "Hello codedoct!!!" sedangkan pada halaman read.volt kita hanya menambahkan code ini,


Adanya margin tersebut dikarenakan pada phalcon secara default setiap akan request halaman, halaman akan memanggil halaman /app/views/index.volt sebagai deafultnya, untuk memudahkan development dengan multi layouts kita akan ubah code index.volt pada path /app/views/ menjadi seperti ini,
{{ content() }}

Kemudian, pada path /app/views/layouts/ tambahkan file default1.volt dan isikan code berikut,
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <title>{{ title ? title|e|striptags : 'Untitled' }}</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    <body>
        <div class="container">
            {% block content %}
            {% endblock %}
        </div>
        <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <!-- Latest compiled and minified JavaScript -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </body>
</html>
Pada code diatas kita sudah menambahkan condition untuk menampilkan title maka pada UserController.volt pada path /app/controllers/ kita ubah codenya menjadi seperti ini,
<?php

class UserController extends ControllerBase
{
    public function readAction()
    {
     $this->view->title = "Phalcon - User";
    }
}

Terakhir ubah code file read.volt pada path /app/views/user/ menjadi seperti ini,
{% extends 'layouts/default1.volt' %}

{% block content %}
 <br/>
 Hello codedoct!!!
{% endblock %}

Dapat dilihat pada code diatas, kita meng-extends halaman read.volt pada halaman default1.volt sehingga akan tampak seperti pada gambar dibawah,


===DONE!===
   

Phalcon - Routes, controller, view


Kembali lagi ditutorial phalcon,

Pada tutorial kemarin kita sudah membuat sebuah project phalcon dan mensetupnya agar bisa di akses di local kita, kali ini codedoct akan membagikan tutorial tentang pemahaman route, controller, dan view pada phalcon.

Oke langsung saja kita mulai tutorialnya, dalam experiment kali ini kita akan membuat halaman untuk users,
Pertama, buat terlebih dahulu route yang akan mengarahkan ke controller UserController dengan mengedit code route.php pada path /app/config/ menjadi seperti ini,
<?php

$router = $di->getRouter();

// Define your routes here
/**
 * Get user lists data by query
 */
$router->addGet(
    "/users",
    [
        "controller"        => "user",
        "action"            => "read"
    ]
);


$router->handle();

Selanjutnya, buat file controller baru dengan nama UserController.php pada path /app/controllers/ isikan code berikut,
<?php

class UserController extends ControllerBase
{
    public function readAction()
    {
     $this->view;
    }
}

Terakhir, buat file view/volt baru dengan nama read.volt pada path /app/views/user dan isikan code berikut,
<br/>
Hello codedoct!!!

Sehinnga saat kita browse url project akan menampilkan tampilan seperti ini,



===DONE!===

Phalcon - Create project (ubuntu)


Hello codedocters, pada tutorial kali ini kita akan melanjutkan tutorial phalcon. Sebelumnya kita sudah  menginstall phalcon pada ubuntu kita, kali ini kita akan memulai membuat sebuah project phalcon sekaligus perkenalan pada salah satu framework PHP yang relatif masih baru ini.

Oke, kita mulai saja experiment phalconnya..

Pertama, buat project phalconnya terlebih dahulu dengan cara,
phalcon create-project phalcon-experiment_3_1_2

Berikut struktur directory phalcon,


Jika project sudah dibuat coba browse url pada localhost, jika terjadi error pada cache tinggal beri full akses saja folder cachenya. caranya,
cd (name_project)
sudo chmod -R 777 cache

Jangan lupa beri fullakses pada apache kalian dengan cara buka file 000-default.conf pada path /etc/apache2/site-available/ dan tambahkan code berikut,


Terakhir restart apache dengan cara,
sudo service apache2 restart

Buka browser, sehingga tampilannya akan tampak seperti ini,
 

===DONE!===

How to - Install phalcon


Tidak terasa sudah lebih dari 2 minggu tidak menulis blog karena sibuk pindah kantor dan pindah rumah, akhirnya bisa kembali bereksperiment,

Kali ini codedoct akan memberikan tutorial cara instalasi phalcon pada ubuntu 16.04. Phalcon sendiri merupakan framework php yang menurut saya memiliki struktur directory yang sangat sederhana bila dibandingkan dengan framework lain.

Oke kita langsung saja mulai tutorialnya,
Pertama, pastikan ubuntu kalian sudah terinstall LAMP cara installnya bisa lihat disini,

Selanjutnya, silahkan ketikan perintah berikut satu-persatu pada terminal,
cd /var/www/html
mkdir phalcon
cd phalcon

sudo apt-get install -y php7.0-fpm \
     php7.0-cli \
     php7.0-curl \
     php7.0-gd \
     php7.0-intl \
 php7.0-pgsql \
 php7.0-mbstring \
 php7.0-xml \
 php7.0-bcmath \
 php-msgpack \
 curl \
 vim \
 wget \
 git

sudo apt-add-repository ppa:phalcon/stable
sudo apt-get update
sudo apt-get install php7.0-phalcon
sudo apt-get install -y gcc make re2c libpcre3-dev php7.0-dev build-essential php7.0-zip

sudo apt-get install gcc make autoconf libc-dev pkg-config
git clone --depth=1 git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo PATH=/opt/sp/php7.0/bin:$PATH ./install

php -i | grep Loaded //untuk melihat path php7.0
sudo bash -c "echo extension=phalcon.so > /etc/php/7.0/cli/conf.d/phalcon.ini"
sudo service php7.0-fpm restart

Untuk mengetes apakah phalcon sudah terinstall dengan baik atau belum silahkan buat file phpinfo.php pada directory /var/www/html kemudian isikan code php berikut,
<?php phpinfo(); ?>

Setelah itu buka browser dan masukan url localhost/phpinfo.php maka saat kita cari phalcon akan muncul seperti ini,


Kemudian install phalcon devtools agar kita bisa menggunakan tools yang ada pada phalcon, cara instalasinya seperti ini,
cd /var/www/html/phalcon
git clone https://github.com/phalcon/phalcon-devtools.git
ln -s /var/www/html/phalcon/phalcon-devtools/phalcon.php /usr/local/bin/phalcon
chmod +x /usr/local/bin/phalcon

Terakhir test phalcon, ketikan printah berikut pada terminal,
cd
phalcon

Sehingga akan muncul seperti ini,


===DONE!===