kecik/mvc

Kecik 框架的外部 MVC 库

1.0.3 2015-12-10 04:26 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:59:56 UTC


README

这是专门为 Kecik 框架制作的库/库,这个库作为外部 MVC 将自动替代仅生成 SQL 命令的内部 MVC 功能,但这个库将按照预期执行 Model 功能。

安装方法

file composer.json

{
    "require": {
        "kecik/kecik": "1.1.*@dev",
        "kecik/dic": "1.0.*@dev",
        "kecik/database": "1.0.*@dev",
        "kecik/mvc": "1.0.*@dev"
    }
}

运行命令

composer install

使用方法

对于您的资产需求,可以在这里下载 Bootstrap:https://bootstrap.ac.cn/

创建如下目录结构

+--app
|  +-- controllers
|  +-- models
|  +-- views
+-- assets
|   +-- css
|   +-- js
|   +-- images
+-- templates

将文件 bootstrap.min.cssbootstrap-theme.min.css 保存到 assets/css/ 目录中,然后创建文件 starter-template.css,其内容如下

body {
  padding-top: 50px;
}
.starter-template {
  padding: 40px 15px;
  text-align: center;
}

然后将它也保存到 assets/css 目录中。

然后创建文件 composer.json,内容如下

{
    "require": {
        "kecik/kecik": "1.0.*@dev",
        "kecik/dic": "1.0.*@dev",
        "kecik/database": "1.0.*@dev",
        "kecik/mvc": "1.0.*@dev"
    }
}

运行命令

composer install

在此示例中,数据库使用 mysql。首先创建名为 kecik 的数据库,然后运行以下 sql 命令

CREATE TABLE IF NOT EXISTS `user` (
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `fullname` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `user` (`username`, `password`, `fullname`, `email`) VALUES
('admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', 'dna.extrim@gmail.com'),
('kecik', '9981b95fcb28eddb5a4dcab5fbe71061', 'Kecik User', 'kecik@blabla.com');

然后创建文件 index.php,内容如下

<?php
require "vendor/autoload.php";

$config = [
    //** Path of Assets
    'path.assets'   => 'assets',
    //** Path of MVC
    'path.mvc'      => 'app',
    //** Path of Template
    'path.template' => 'templates',
    
    //** Load Libraries
    'libraries' => [
        //-- DIC Library
        'DIC' => ['enable' => TRUE],
        //-- Database Library
        'Database' => [
            'enable' => TRUE,
            'config' => [
                'driver' => 'mysqli',
                'hostname' => 'localhost',
                'username' => 'root',
                'password' => '',
                'dbname' => 'kecik'
            ]
        ],
        //-- MVC Library
        'MVC' => ['enable' => TRUE]
    ]
    //-- End Libraries
];

$app = new Kecik\Kecik($config);

    //** Assets
    //-- CSS Assets
    $app->assets->css->add('bootstrap.min');
    $app->assets->css->add('bootstrap-theme.min');
    $app->assets->css->add('starter-template');
    //-- END CSS Assets
    //-- END Assets

    //** Connect to Database
    $app->db->connect();

    //** DIC Container
    //-- User Controller
    $app->container['userController'] = function($container) {
        return new Controller\User();
    };
    //-- END
    
    //** Index
    $app->get('/', function() {
        return $this->container['userController']->index();
    })->template('bootstrap_template');
    
    //** User List
    $app->get('user', function() {
        return $this->container['userController']->read();
    })->template('bootstrap_template');

    //** FORM
    //-- FORM Add
    $app->get('add', function() {
        return $this->container['userController']->form();
    })->template('bootstrap_template');
    //-- FORM Update
    $app->get('edit/:username', function($username) {
        return $this->container['userController']->form($username);
    })->template('bootstrap_template');
    //-- END FORM

    //** Action INSERT, UPDATE, AND DELETE
    //-- INSERT
    $app->post('insert', function() {
        return $this->container['userController']->insert();
    });
    //-- UPDATE
    $app->post('update/:username', function($username) {
        return $this->container['userController']->update($username);
    });
    //-- DELETE
    $app->get('delete/:username', function($username) {
        return $this->container['userController']->delete($username);
    });
    //-- END Action

$app->run();

对于模板,写入以下代码,文件名为 templates/bootstrap_template.php

<!--[if IE 8]> <html lang="en" class="ie8"> <![endif]-->  
<!--[if IE 9]> <html lang="en" class="ie9"> <![endif]-->  
<!--[if !IE]><!--> <html> <!--<![endif]-->  
    <head>
        <title>Contoh MVC</title>
        
        <meta charset="utf-8">
        <title>Simple Template</title>

        <meta name="description" content="overview &amp; stats" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        
        @css
    </head>
    <body>
        <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Kecik Framework</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="{{ $this->url->to('') }}">Home</a></li>
            <li><a href="{{ $this->url->to('user') }}">User</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

    <div class="container">

        @response

    </div><!-- /.container -->
        

        @js
    </body>
</html>

然后创建控制器文件,文件名为 user.php,位于 app/controllers/ 目录中,内容如下

<?php
namespace Controller;

use Kecik\Controller;

class User extends Controller {

    public function __construct() {
        parent::__construct();
    }

    public function index() {
        return $this->view('index');
    }

    public function read() {
        return $this->view('read');
    }

    public function form($id='') {
        if ($id=='') 
            $url = $this->url->linkto('insert');
        else
            $url = $this->url->linkto('update/'.$id);

        return $this->view('form', ['id'=>$id, 'url'=>$url]);
    }

    public function insert() {
        $request = $this->request;
        $user = new \Model\User();
            $user->username = $request->post('username');
            $user->password = md5($request->post('password'));
            $user->fullname = ucwords($request->post('fullname'));
            $user->email = $request->post('email');
        $user->save();
        $this->url->redirect('user');
    }

    public function update($id) {
        $request = $this->request;
        $user = new \Model\User(['username'=>$id]);
            $user->username = $request->post('username');
            $user->password = md5($request->post('password'));
            $user->fullname = ucwords($request->post('fullname'));
            $user->email = $request->post('email');
        $user->save();
        $this->url->redirect('user');
    }

    public function delete($id) {
        $request = $this->request;
        $user = new \Model\User(['username' => $id]);
        $user->delete();
        $this->url->redirect('user');
    }
}

然后创建模型文件,文件名为 user.php,并保存到 app/models/ 目录中,内容如下

<?php
namespace Model;

use Kecik\Model;

class User extends Model {
    protected static $table = 'user';

    public function __construct($id='') {
        parent::__construct($id);
    }
}

然后创建用于显示 index、表单和读取的视图部分。首先创建 index 的视图,文件名为 index.php,位于 app/views/ 目录中,内容如下

<div class="starter-template">
    <h2>Framework Kecik</h2>
    <p align="justify">
        Merupakan framework dengan satu file system yang sangat sederhana, jadi ini bukan merupakan sebuah framework yang 
        kompleks, tapi anda dapat membangun dan mengembangkan framework ini untuk menjadi sebuah framework yang kompleks.
        Framework ini mendukung MVC sederhana dimana anda masih harus mengcustom beberapa code untuk mendapatkan MVC yang
        kompleks, untuk Model hanya sebatas men-generate perintah SQL untuk INSERT, UPDATE dan DELETE saja, jadi untuk 
        code pengeksekusian SQL nya tersebut silakan dibuat sendiri dengan bebas mau menggunakan library database manapun.
        Framework ini juga mendukung Composer, jadi bisa memudahkan anda untuk menambahkan sebuah library dari composer.
    </p>

    <h1>EXAMPLE/CONTOH MVC</h1>
</div>

然后创建用于读取的视图文件,文件名为 read.php,并保存到 app/views/ 目录中,内容如下

<br />
<a href="<?php $this->url->to('index.php/add') ?>" class="btn btn-success">Add Data</a><br />

<table class="table table-striped table-hover">
    <thead>
        <tr>
            <th>NO</th>
            <th>USERNAME</th>
            <th>EMAIL</th>
            <th>ACTION</th>
        </tr>
    </thead>

    <tbody>
        <?php
        $rows = Model\User::find();
        $no = 1;
        foreach ($rows as $data) {
        ?>
        <tr>
            <td><?php echo $no; ?></td>
            <td><?php echo $data->username; ?></td>
            <td><?php echo $data->email; ?></td>
            <td>
                <a href="<?php $this->url->to('index.php/edit/'.$data->username) ?>" class="btn btn-primary">UPDATE</a>
                <a href="<?php $this->url->to('index.php/delete/'.$data->username) ?>" class="btn btn-danger">DELETE</a>
            </td>
        </tr>
        <?php
            $no++;
        }
        ?>
    </tbody>
</table>

然后创建用于表单的视图文件,文件名为 form.php,并保存到 app/views 目录中,内容如下

<?php
  if ($id != '') {
    $rows = Model\User::find([
      'where' => [
        ['username', '=', $id]
      ]
    ]);
    foreach ($rows as $data) {
      $username = $data->username;
      $fullname = $data->fullname;
      $email = $data->email;
    }
  }
?>
<br />
<form method="POST" action="<?php echo $url ?>">
  <div class="form-group">
    <label for="username">Username</label>
    <input type="text" class="form-control" id="username" name="username" placeholder="Input Username" value="<?php echo (isset($username))? $username:''; ?>" />
  </div>
  <div class="form-group">
    <label for="password">Password</label>
    <input type="password" class="form-control" id="password" name="password" placeholder="Input Password" value="" />
  </div>
  <div class="form-group">
    <label for="fullname">Fullname</label>
    <input type="text" class="form-control" id="fullname" name="fullname" placeholder="Input Fullname" value="<?php echo (isset($fullname))? $fullname:''; ?>" />
  </div>
  <div class="form-group">
    <label for="email">Email</label>
    <input type="email" class="form-control" id="email" name="email" placeholder="Input Email" value="<?php echo (isset($email))? $email:''; ?>" />
  </div>

  <button type="submit" class="btn btn-default">Save</button>
</form>