yii2的下载安装

使用下载好的文件配置高级模板,在配置文件配置好数据库和gii

在common模板配置db:

在backend模板配置gii:

配置nginx服务器访问backend和frontend:

server {
root C:/Users/liudaoqiang/project/manhua_yii2/frontend/web/;
index index.php index.html;
server_name dev.manhua_yii2_frontend.com;
# set $yii_bootstrap "index.html";
set $yii_bootstrap "index.php";

charset utf-8;

location / {
index $yii_bootstrap;
try_files $uri $uri/ $yii_bootstrap?$args;
if (!-e $request_filename) {
rewrite (.*) /index.php/$1;
}
}

location ~ ^/(protected|framework|nbproject|themes/\w+/views) {
deny all;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}

location ~ .*\.(js|css)?$ {
expires 7d;
}

#avoid processing of calls to unexisting static files by yii
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {

fastcgi_split_path_info ^(.+\.php)(.*)$;

#let yii catch the calls to unexising PHP files
set $fsn /$yii_bootstrap;
if (-f $document_root$fastcgi_script_name){
set $fsn $fastcgi_script_name;
}

#fastcgi_next_upstream error timeout invalid_header http_500 http_503 http_404;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fsn;

#PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fsn;

}

location ~ /\.ht {
deny all;
}
}

server {
root C:/Users/liudaoqiang/project/manhua_yii2/backend/web/;
index index.php index.html;
server_name dev.manhua_yii2_backend.com;
# set $yii_bootstrap "index.html";
set $yii_bootstrap "index.php";

charset utf-8;

location / {
index $yii_bootstrap;
try_files $uri $uri/ $yii_bootstrap?$args;
if (!-e $request_filename) {
rewrite (.*) /index.php/$1;
}
}

location ~ ^/(protected|framework|nbproject|themes/\w+/views) {
deny all;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}

location ~ .*\.(js|css)?$ {
expires 7d;
}

#avoid processing of calls to unexisting static files by yii
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {

fastcgi_split_path_info ^(.+\.php)(.*)$;

#let yii catch the calls to unexising PHP files
set $fsn /$yii_bootstrap;
if (-f $document_root$fastcgi_script_name){
set $fsn $fastcgi_script_name;
}

#fastcgi_next_upstream error timeout invalid_header http_500 http_503 http_404;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fsn;

#PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fsn;

}

location ~ /\.ht {
deny all;
}
}

配置hosts文件:

127.0.0.1 dev.manhua_yii2_backend.com
127.0.0.1 dev.manhua_yii2_frontend.com

访问dev.manhua_yii2_backend.com和dev.manhua_yii2_frontend.com

2. Yii2的登录

首先应该有后台用户相关的数据表:

发现在console/migrations中有一个关于创建user数据表的迁移文件,对该文件进行修改,并插入一个默认的可登录用户:

指定php yii migrate生成数据表

这样创建了user数据表并插入了一个username为admin, password为123456的后台管理员

访问site/login可以登录成功,访问site/login可以登出

3. 访问后台的任何页面都必须登录

则执行任何的后台页面访问都要验证是否登录,没有登录则跳转到登录页面;已经登录才执行访问页面的操作:

在backend/components创建AdminController, 并让所有的后台控制器都继承AdminController

则访问任何页面都要验证是否登录

4.页面action的权限控制方法之使用Behavior

例:

注意:底层原理依然是使用beforeAction的机制来实现的

以下是yii\filter\AccessControl类, 该类中在beforeAction中验证了有否具有相应的权限

<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/

namespace yii\filters;

use Yii;
use yii\base\Action;
use yii\base\ActionFilter;
use yii\di\Instance;
use yii\web\User;
use yii\web\ForbiddenHttpException;

/**
* AccessControl provides simple access control based on a set of rules.
*
* AccessControl is an action filter. It will check its [[rules]] to find
* the first rule that matches the current context variables (such as user IP address, user role).
* The matching rule will dictate whether to allow or deny the access to the requested controller
* action. If no rule matches, the access will be denied.
*
* To use AccessControl, declare it in the `behaviors()` method of your controller class.
* For example, the following declarations will allow authenticated users to access the "create"
* and "update" actions and deny all other users from accessing these two actions.
*
* ```php
* public function behaviors()
* {
* return [
* 'access' => [
* 'class' => \yii\filters\AccessControl::className(),
* 'only' => ['create', 'update'],
* 'rules' => [
* // deny all POST requests
* [
* 'allow' => false,
* 'verbs' => ['POST']
* ],
* // allow authenticated users
* [
* 'allow' => true,
* 'roles' => ['@'],
* ],
* // everything else is denied
* ],
* ],
* ];
* }
* ```
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class AccessControl extends ActionFilter
{
/**
* @var User|array|string the user object representing the authentication status or the ID of the user application component.
* Starting from version 2.0.2, this can also be a configuration array for creating the object.
*/
public $user = 'user';
/**
* @var callable a callback that will be called if the access should be denied
* to the current user. If not set, [[denyAccess()]] will be called.
*
* The signature of the callback should be as follows:
*
* ```php
* function ($rule, $action)
* ```
*
* where `$rule` is the rule that denies the user, and `$action` is the current [[Action|action]] object.
* `$rule` can be `null` if access is denied because none of the rules matched.
*/
public $denyCallback;
/**
* @var array the default configuration of access rules. Individual rule configurations
* specified via [[rules]] will take precedence when the same property of the rule is configured.
*/
public $ruleConfig = ['class' => 'yii\filters\AccessRule'];
/**
* @var array a list of access rule objects or configuration arrays for creating the rule objects.
* If a rule is specified via a configuration array, it will be merged with [[ruleConfig]] first
* before it is used for creating the rule object.
* @see ruleConfig
*/
public $rules = [];

/**
* Initializes the [[rules]] array by instantiating rule objects from configurations.
*/
public function init()
{
parent::init();
$this->user = Instance::ensure($this->user, User::className());
foreach ($this->rules as $i => $rule) {
if (is_array($rule)) {
$this->rules[$i] = Yii::createObject(array_merge($this->ruleConfig, $rule));
}
}
}

/**
* This method is invoked right before an action is to be executed (after all possible filters.)
* You may override this method to do last-minute preparation for the action.
* @param Action $action the action to be executed.
* @return boolean whether the action should continue to be executed.
*/
public function beforeAction($action)
{
$user = $this->user;
$request = Yii::$app->getRequest();
/* @var $rule AccessRule */
foreach ($this->rules as $rule) {
if ($allow = $rule->allows($action, $user, $request)) {
return true;
} elseif ($allow === false) {
if (isset($rule->denyCallback)) {
call_user_func($rule->denyCallback, $rule, $action);
} elseif ($this->denyCallback !== null) {
call_user_func($this->denyCallback, $rule, $action);
} else {
$this->denyAccess($user);
}
return false;
}
}
if ($this->denyCallback !== null) {
call_user_func($this->denyCallback, null, $action);
} else {
$this->denyAccess($user);
}
return false;
}

/**
* Denies the access of the user.
* The default implementation will redirect the user to the login page if he is a guest;
* if the user is already logged, a 403 HTTP exception will be thrown.
* @param User $user the current user
* @throws ForbiddenHttpException if the user is already logged in.
*/
protected function denyAccess($user)
{
if ($user->getIsGuest()) {
$user->loginRequired();
} else {
throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
}
}
}

yii\filter\VerbFilter类依然是使用beforeAction的机制:

代码如下

<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/

namespace yii\filters;

use Yii;
use yii\base\ActionEvent;
use yii\base\Behavior;
use yii\web\Controller;
use yii\web\MethodNotAllowedHttpException;

/**
* VerbFilter is an action filter that filters by HTTP request methods.
*
* It allows to define allowed HTTP request methods for each action and will throw
* an HTTP 405 error when the method is not allowed.
*
* To use VerbFilter, declare it in the `behaviors()` method of your controller class.
* For example, the following declarations will define a typical set of allowed
* request methods for REST CRUD actions.
*
* ```php
* public function behaviors()
* {
* return [
* 'verbs' => [
* 'class' => \yii\filters\VerbFilter::className(),
* 'actions' => [
* 'index' => ['get'],
* 'view' => ['get'],
* 'create' => ['get', 'post'],
* 'update' => ['get', 'put', 'post'],
* 'delete' => ['post', 'delete'],
* ],
* ],
* ];
* }
* ```
*
* @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7
* @author Carsten Brandt <mail@cebe.cc>
* @since 2.0
*/
class VerbFilter extends Behavior
{
/**
* @var array this property defines the allowed request methods for each action.
* For each action that should only support limited set of request methods
* you add an entry with the action id as array key and an array of
* allowed methods (e.g. GET, HEAD, PUT) as the value.
* If an action is not listed all request methods are considered allowed.
*
* You can use `'*'` to stand for all actions. When an action is explicitly
* specified, it takes precedence over the specification given by `'*'`.
*
* For example,
*
* ```php
* [
* 'create' => ['get', 'post'],
* 'update' => ['get', 'put', 'post'],
* 'delete' => ['post', 'delete'],
* '*' => ['get'],
* ]
* ```
*/
public $actions = [];

/**
* Declares event handlers for the [[owner]]'s events.
* @return array events (array keys) and the corresponding event handler methods (array values).
*/
public function events()
{
return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
}

/**
* @param ActionEvent $event
* @return boolean
* @throws MethodNotAllowedHttpException when the request method is not allowed.
*/
public function beforeAction($event)
{
$action = $event->action->id;
if (isset($this->actions[$action])) {
$verbs = $this->actions[$action];
} elseif (isset($this->actions['*'])) {
$verbs = $this->actions['*'];
} else {
return $event->isValid;
}

$verb = Yii::$app->getRequest()->getMethod();
$allowed = array_map('strtoupper', $verbs);
if (!in_array($verb, $allowed)) {
$event->isValid = false;
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7
Yii::$app->getResponse()->getHeaders()->set('Allow', implode(', ', $allowed));
throw new MethodNotAllowedHttpException('Method Not Allowed. This url can only handle the following request methods: ' . implode(', ', $allowed) . '.');
}

return $event->isValid;
}
}

5.初始化选择yii2的环境local/dev/test/prod

原理:

运行php init 通过用户的选择环境

查找用户的选择的环境,异常则退出

计算出将要复制的文件配置,跳过配置中需要skip的文件配置

设置文件的属性

代码如下:

#!/usr/bin/env php
<?php
/**
* Yii Application Initialization Tool
*
* In order to run in non-interactive mode:
*
* init --env=Development --overwrite=n
*
* @author Alexander Makarov <sam@rmcreative.ru>
*
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/

if (!extension_loaded('openssl')) {
die('The OpenSSL PHP extension is required by Yii2.');
}

$params = getParams();
$root = str_replace('\\', '/', __DIR__);
$envs = require("$root/environments/index.php");
$envNames = array_keys($envs);

echo "Yii Application Initialization Tool v1.0\n\n";

$envName = null;
if (empty($params['env']) || $params['env'] === '1') {
echo "Which environment do you want the application to be initialized in?\n\n";
foreach ($envNames as $i => $name) {
echo " [$i] $name\n";
}
echo "\n Your choice [0-" . (count($envs) - 1) . ', or "q" to quit] ';
$answer = trim(fgets(STDIN));

if (!ctype_digit($answer) || !in_array($answer, range(0, count($envs) - 1))) {
echo "\n Quit initialization.\n";
exit(0);
}

if (isset($envNames[$answer])) {
$envName = $envNames[$answer];
}
} else {
$envName = $params['env'];
}

if (!in_array($envName, $envNames)) {
$envsList = implode(', ', $envNames);
echo "\n $envName is not a valid environment. Try one of the following: $envsList. \n";
exit(2);
}

$env = $envs[$envName];

if (empty($params['env'])) {
echo "\n Initialize the application under '{$envNames[$answer]}' environment? [yes|no] ";
$answer = trim(fgets(STDIN));
if (strncasecmp($answer, 'y', 1)) {
echo "\n Quit initialization.\n";
exit(0);
}
}

echo "\n Start initialization ...\n\n";
$files = getFileList("$root/environments/{$env['path']}");
if (isset($env['skipFiles'])) {
$skipFiles = $env['skipFiles'];
array_walk($skipFiles, function(&$value) use($env, $root) { $value = "$root/$value"; });
$files = array_diff($files, array_intersect_key($env['skipFiles'], array_filter($skipFiles, 'file_exists')));
}
$all = false;
foreach ($files as $file) {
if (!copyFile($root, "environments/{$env['path']}/$file", $file, $all, $params)) {
break;
}
}

$callbacks = ['setCookieValidationKey', 'setWritable', 'setExecutable', 'createSymlink'];
foreach ($callbacks as $callback) {
if (!empty($env[$callback])) {
$callback($root, $env[$callback]);
}
}

echo "\n ... initialization completed.\n\n";

function getFileList($root, $basePath = '')
{
$files = [];
$handle = opendir($root);
while (($path = readdir($handle)) !== false) {
if ($path === '.git' || $path === '.svn' || $path === '.' || $path === '..') {
continue;
}
$fullPath = "$root/$path";
$relativePath = $basePath === '' ? $path : "$basePath/$path";
if (is_dir($fullPath)) {
$files = array_merge($files, getFileList($fullPath, $relativePath));
} else {
$files[] = $relativePath;
}
}
closedir($handle);
return $files;
}

function copyFile($root, $source, $target, &$all, $params)
{
if (!is_file($root . '/' . $source)) {
echo " skip $target ($source not exist)\n";
return true;
}
if (is_file($root . '/' . $target)) {
if (file_get_contents($root . '/' . $source) === file_get_contents($root . '/' . $target)) {
echo " unchanged $target\n";
return true;
}
if ($all) {
echo " overwrite $target\n";
} else {
echo " exist $target\n";
echo " ...overwrite? [Yes|No|All|Quit] ";

$answer = !empty($params['overwrite']) ? $params['overwrite'] : trim(fgets(STDIN));
if (!strncasecmp($answer, 'q', 1)) {
return false;
} else {
if (!strncasecmp($answer, 'y', 1)) {
echo " overwrite $target\n";
} else {
if (!strncasecmp($answer, 'a', 1)) {
echo " overwrite $target\n";
$all = true;
} else {
echo " skip $target\n";
return true;
}
}
}
}
file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));
return true;
}
echo " generate $target\n";
@mkdir(dirname($root . '/' . $target), 0777, true);
file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source));
return true;
}

function getParams()
{
$rawParams = [];
if (isset($_SERVER['argv'])) {
$rawParams = $_SERVER['argv'];
array_shift($rawParams);
}

$params = [];
foreach ($rawParams as $param) {
if (preg_match('/^--(\w+)(=(.*))?$/', $param, $matches)) {
$name = $matches[1];
$params[$name] = isset($matches[3]) ? $matches[3] : true;
} else {
$params[] = $param;
}
}
return $params;
}

function setWritable($root, $paths)
{
foreach ($paths as $writable) {
if (is_dir("$root/$writable")) {
echo " chmod 0777 $writable\n";
@chmod("$root/$writable", 0777);
} else {
echo "\n Error. Directory $writable does not exist. \n";
}
}
}

function setExecutable($root, $paths)
{
foreach ($paths as $executable) {
echo " chmod 0755 $executable\n";
@chmod("$root/$executable", 0755);
}
}

function setCookieValidationKey($root, $paths)
{
foreach ($paths as $file) {
echo " generate cookie validation key in $file\n";
$file = $root . '/' . $file;
$length = 32;
$bytes = openssl_random_pseudo_bytes($length);
$key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.');
$content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file));
file_put_contents($file, $content);
}
}

function createSymlink($root, $links) {
foreach ($links as $link => $target) {
echo " symlink " . $root . "/" . $target . " " . $root . "/" . $link . "\n";
//first removing folders to avoid errors if the folder already exists
@rmdir($root . "/" . $link);
@symlink($root . "/" . $target, $root . "/" . $link);
}
}

6. yii2的扩展插件的下载安装

首先在http://www.yiiframework.com/extensions/搜索想要的插件

开始下载安装,例如下载安装yii2-btn-copy-html-block

在yii2的项目根目录下执行:

php composer.phar require --prefer-dist mackrais/yii2-btn-copy-html-block "dev-master"

提示需要token:

按照提示例如去https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+DESKTOP-9V73O7O+2017-09-05+1144创建token

然后系统后自动下载插件并安装

7.使用Yii2开发web站点feature

步骤:

1.使用git创建新的branch

git branch feature_wms_check

2.使用php yii migrate/create create_table_tablename创建数据库迁移

php yii migrate/create create_table_wms_check

例如:

<?php

use yii\db\Schema;
use jamband\schemadump\Migration;

class m170927_084004_create_table_wms_check extends Migration
{
    const TABLE_NAME = '{{%wms_check}}';
    public function safeUp()
    {
        $tableOptions = null;
        if ($this->db->driverName === 'mysql') {
            $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB COMMENT=\'库存盘点表\'';
        }

        $this->createTable(self::TABLE_NAME, [
            'id' => $this->primaryKey() . ' AUTO_INCREMENT  COMMENT \'自增ID\'',
            'wms_check_code' => $this->string(32) . ' COMMENT \'库存盘点编号\'',

            'common_producer_info_id' => $this->integer(8) . ' COMMENT \'加工基地编号\'',
            'common_producer_info_name' => $this->string(50) . ' COMMENT \'加工基地名称\'',

            'common_producer_herb_type' => $this->smallInteger(1) . ' COMMENT \'物料类型1是原料2是成品\'',

            'wms_check_user_id' => $this->integer(8) . ' COMMENT \'库存盘点人ID\'',
            'wms_check_user_name' => $this->string(32) . ' COMMENT \'库存盘点人姓名\'',
            'wms_check_user_phone' => $this->string(20) . ' COMMENT \'库存盘点人电话\'',

            'wms_check_redo_user_id' => $this->integer(8) . ' COMMENT \'库存盘点复核人ID\'',
            'wms_check_redo_user_name' => $this->string(32) . ' COMMENT \'库存盘点复核人姓名\'',
            'wms_check_redo_user_phone' => $this->string(20) . ' COMMENT \'库存盘点复核人电话\'',

            'wms_check_year' => $this->smallInteger(6) . ' COMMENT \'库存盘点年份\'',
            'wms_check_month' => $this->smallInteger(6) . ' COMMENT \'库存盘点月份\'',

            'wms_check_at' => $this->integer(10) . ' COMMENT \'库存盘点日期\'',

            'wms_check_note' => $this->text() . ' COMMENT \'库存盘点备注\'',

            'created_at' => $this->integer(10) . ' COMMENT \'创建时间\'',
            'updated_at' => $this->integer(10) . ' COMMENT \'编辑时间\'',
            'is_del' => $this->boolean()->defaultValue(0) . ' COMMENT \'是否逻辑删除\'',
        ], $tableOptions);

        $this->createIndex('wms_check_code',self::TABLE_NAME,'wms_check_code');
        $this->createIndex('common_producer_info_id',self::TABLE_NAME,'common_producer_info_id');
        $this->createIndex('wms_check_year',self::TABLE_NAME,'wms_check_year');
        $this->createIndex('wms_check_month',self::TABLE_NAME,'wms_check_month');
    }

    public function safeDown()
    {
        $this->dropTable(self::TABLE_NAME);
    }
}

3.使用php yii migrate回车后yes运行数据库迁移脚本

php yii migrate

4.使用gii生成ActiveRecord模型

生成的模型代码如下:

<?php

namespace common\models;

use Yii;

/**
 * This is the model class for table "{{%wms_check}}".
 *
 * @property integer $id
 * @property string $wms_check_code
 * @property integer $common_producer_info_id
 * @property string $common_producer_info_name
 * @property integer $common_producer_herb_type
 * @property integer $wms_check_user_id
 * @property string $wms_check_user_name
 * @property string $wms_check_user_phone
 * @property integer $wms_check_redo_user_id
 * @property string $wms_check_redo_user_name
 * @property string $wms_check_redo_user_phone
 * @property integer $wms_check_year
 * @property integer $wms_check_month
 * @property integer $wms_check_at
 * @property string $wms_check_note
 * @property integer $created_at
 * @property integer $updated_at
 * @property integer $is_del
 */
class WmsCheck extends \common\models\Base
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%wms_check}}';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['common_producer_info_id', 'common_producer_herb_type', 'wms_check_user_id', 'wms_check_redo_user_id', 'wms_check_year', 'wms_check_month', 'created_at', 'updated_at', 'is_del'], 'integer'],
            [['wms_check_at', 'wms_check_note'], 'string'],
            [['wms_check_code', 'wms_check_user_name', 'wms_check_redo_user_name'], 'string', 'max' => 32],
            [['common_producer_info_name'], 'string', 'max' => 50],
            [['wms_check_user_phone', 'wms_check_redo_user_phone'], 'string', 'max' => 20],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => '自增ID',
            'wms_check_code' => '库存盘点编号',
            'common_producer_info_id' => '加工基地编号',
            'common_producer_info_name' => '加工基地名称',
            'common_producer_herb_type' => '物料类型1是原料2是成品',
            'wms_check_user_id' => '库存盘点人ID',
            'wms_check_user_name' => '库存盘点人姓名',
            'wms_check_user_phone' => '库存盘点人电话',
            'wms_check_redo_user_id' => '库存盘点复核人ID',
            'wms_check_redo_user_name' => '库存盘点复核人姓名',
            'wms_check_redo_user_phone' => '库存盘点复核人电话',
            'wms_check_year' => '库存盘点年份',
            'wms_check_month' => '库存盘点月份',
            'wms_check_at' => '库存盘点日期',
            'wms_check_note' => '库存盘点备注',
            'created_at' => '创建时间',
            'updated_at' => '编辑时间',
            'is_del' => '是否逻辑删除',
        ];
    }
}

5. 使用gii生成CRUD代码并对代码进行开发

部分代码如下:

backend/controllers/WmsCheckController.php

<?php

namespace backend\controllers;

use Yii;

use yii\base\ErrorException;
use yii\base\Exception;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

use backend\models\WmsCheckSearch;
use core\models\WmsCheck;
use core\models\WmsCheckDetail;
use common\models\Base;

/**
 * WmsCheckController implements the CRUD actions for WmsCheck model.
 */
class WmsCheckController extends Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all WmsCheck models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new WmsCheckSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single WmsCheck model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        $model = $this->findModel($id);
        $detailList = $model->wmsCheckDetails;
        return $this->render('view', [
            'model' => $model,
            'detailList'=>$detailList,
        ]);
    }

    /**
     * Creates a new WmsCheck model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new WmsCheck();
        //获取加工基地ID
        $common_producer_info_id = \core\models\Division::getTopDivisionId(Yii::$app->user->identity->division_id,true);
        //获取该基地的库存详情
        $stock_list = \core\models\WmsInfo::getStockDetailBaseInfoListGroupByMaterial($common_producer_info_id);
        //根据基地ID生成库存盘点清单编号
        $wms_check_code = \common\models\Base::generateCode('KCPD', $common_producer_info_id, $model, 'id');
        $model->wms_check_code = $wms_check_code;
        $model->common_producer_info_id = $common_producer_info_id;
        if ($model->load(Yii::$app->request->post())) {
            $transaction = Yii::$app->db->beginTransaction();
            try{
                //根据基地ID获取基地详情信息
                $common_producer_info_name = \core\models\Division::getDivisionName($model->common_producer_info_id);
                //根据用户ID获取用户的基本信息
                $userCheck = \core\models\User::getUser($model->wms_check_user_id);
                $userRedo = \core\models\User::getUser($model->wms_check_redo_user_id);

                $model->common_producer_info_id = $common_producer_info_id;
                $model->common_producer_info_name = $common_producer_info_name;

                if (empty($userCheck)){
                    $model->wms_check_user_name = '';
                    $model->wms_check_user_phone = '';
                }else{
                    $model->wms_check_user_name = $userCheck->name;
                    $model->wms_check_user_phone = $userCheck->phone;
                }

                if (empty($userRedo)){
                    $model->wms_check_redo_user_name = '';
                    $model->wms_check_redo_user_phone = '';
                }else{
                    $model->wms_check_redo_user_name = $userRedo->name;
                    $model->wms_check_redo_user_phone = $userRedo->phone;
                }

                $model->wms_check_year = intval($model->wms_check_year);
                $model->wms_check_month = intval($model->wms_check_month);

                $model->wms_check_at = strval(strtotime($model->wms_check_at));
                $model->wms_check_note = htmlspecialchars(addslashes($model->wms_check_note));

                $model->created_at = time();
                $model->updated_at = time();
                $model->is_del = 0;
                if(false == $model->save()){
                    throw new ErrorException('保存库存盘点失败');
                }

                foreach ($stock_list as $stock){
                    $_detail = new WmsCheckDetail();
                    $_detail->wms_check_id = $model->id;
                    $_detail->wms_check_code = $model->wms_check_code;
                    $_detail->common_producer_info_id = $model->common_producer_info_id;
                    $_detail->common_producer_info_name = $model->common_producer_info_name;
                    $_detail->common_producer_herb_type = $model->common_producer_herb_type;

                    $_detail->common_producer_herb_info_id = $stock['common_producer_herb_info_id'];
                    $_detail->common_producer_herb_info_name = $stock['common_producer_herb_info_name'];

                    $_detail->common_producer_herb_grade_info_id = $stock['common_producer_herb_grade_info_id'];
                    $_detail->common_producer_herb_grade_info_name = $stock['common_producer_herb_grade_name'];
                    $_detail->common_producer_herb_grade_info_spec_name = $stock['common_producer_herb_grade_info_spec_name'];

                    $_detail->wms_check_detail_unit_price = NULL;

                    $_detail->wms_check_detail_info_package_num = NULL;
                    $_detail->wms_check_detail_info_weight = NULL;
                    $_detail->wms_check_detail_info_sum_price = NULL;

                    $_detail->wms_check_detail_check_package_num = NULL;
                    $_detail->wms_check_detail_check_weight = NULL;
                    $_detail->wms_check_detail_check_sum_price = NULL;

                    $_detail->wms_check_detail_diff_weight = NULL;
                    $_detail->wms_check_detail_diff_sum_price = NULL;
                    $_detail->wms_check_detail_diff_note = NULL;

                    $_detail->created_at = time();
                    $_detail->updated_at = time();
                    $_detail->is_del = 0;

                    if(false == $_detail->save()){
                        throw new ErrorException('保存库存盘点详情失败');
                    }
                }
                $transaction->commit();
                return $this->redirect(['index']);
            }catch (ErrorException $e){

                $transaction->rollBack();
                return $this->redirect(['create'], [
                    'model' => $model,
                    'stock_list'=>$stock_list,
                ]);
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'stock_list'=>$stock_list,
            ]);
        }
    }

    /**
     * Updates an existing WmsCheck model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        if ($model->load(Yii::$app->request->post())) {
            $detail_list_data = Yii::$app->request->post();
            $detail_id_list = $detail_list_data['WmsCheckDetail']['id'];
            $transaction = Yii::$app->db->beginTransaction();
            try {
                $model->updated_at = time();
                if (false == $model->save()){
                    throw new Exception('库存盘点基本信息编辑失败');
                }
                foreach ($detail_id_list as $key => $detail_id) {
                    $_detail = WmsCheckDetail::findOne(['id' => $detail_id]);

                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_unit_price'][$key])){
                        $_detail->wms_check_detail_unit_price = Base::moneyBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_unit_price'][$key]);
                    }

                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_info_package_num'][$key])){
                        $_detail->wms_check_detail_info_package_num = $detail_list_data['WmsCheckDetail']['wms_check_detail_info_package_num'][$key];
                    }
                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_info_weight'][$key])){
                        $_detail->wms_check_detail_info_weight = Base::weightBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_info_weight'][$key]);
                    }
                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_info_sum_price'][$key])){
                        $_detail->wms_check_detail_info_sum_price = Base::moneyBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_info_sum_price'][$key]);
                    }

                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_check_package_num'][$key])){
                        $_detail->wms_check_detail_check_package_num = $detail_list_data['WmsCheckDetail']['wms_check_detail_check_package_num'][$key];
                    }
                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_check_weight'][$key])){
                        $_detail->wms_check_detail_check_weight = Base::weightBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_check_weight'][$key]);
                    }
                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_check_sum_price'][$key])){
                        $_detail->wms_check_detail_check_sum_price = Base::moneyBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_check_sum_price'][$key]);
                    }

                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_diff_weight'][$key])){
                        $_detail->wms_check_detail_diff_weight = Base::weightBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_diff_weight'][$key]);
                    }
                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_diff_sum_price'][$key])){
                        $_detail->wms_check_detail_diff_sum_price = Base::moneyBcmul($detail_list_data['WmsCheckDetail']['wms_check_detail_diff_sum_price'][$key]);
                    }
                    if (isset($detail_list_data['WmsCheckDetail']['wms_check_detail_diff_note'][$key])){
                        $_detail->wms_check_detail_diff_note = $detail_list_data['WmsCheckDetail']['wms_check_detail_diff_note'][$key];
                    }

                    $_detail->updated_at = time();
                    if (false == $_detail->save()) {
                        throw new Exception('库存盘点详情信息编辑失败');
                    }
                }
                $transaction->commit();
            }catch (Exception $e){
                $transaction->rollBack();
                $detailList = $model->wmsCheckDetails;
                return $this->render('update', [
                    'model' => $model,
                    'detailList'=>$detailList,
                ]);
            }
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            $detailList = $model->wmsCheckDetails;
            return $this->render('update', [
                'model' => $model,
                'detailList'=>$detailList,
            ]);
        }
    }

    public function actionPrint($id)
    {
        $this->layout = false;
        $model = $this->findModel($id);
        $detailList = $model->wmsCheckDetails;
        $content = $this->render('print', [
            'model' => $model,
            'detailList'=>$detailList,
        ]);

        (new \TCPDF('P', 'mm', array(210, 297), true, 'UTF-8', false))->html('wms-check-sheet.pdf', $content, 10);
    }

    /**
     * Finds the WmsCheck model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return WmsCheck the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = WmsCheck::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

backend/models/WmsCheckSearch.php

<?php

namespace backend\models;

use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use core\models\WmsCheck;

/**
 * WmsCheckSearch represents the model behind the search form about `core\models\WmsCheck`.
 */
class WmsCheckSearch extends WmsCheck
{
    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = WmsCheck::find();

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        $division_id = \core\models\Division::getTopDivisionId(Yii::$app->user->identity->division_id,true);
        if (!empty($division_id)) {
            $this->common_producer_info_id = $division_id;
        }

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'common_producer_herb_type'=>$this->common_producer_herb_type,
            'common_producer_info_id' => $this->common_producer_info_id,
            'wms_check_year' => $this->wms_check_year,
            'wms_check_month' => $this->wms_check_month,
            'wms_check_user_id' => $this->wms_check_user_id,
            'wms_check_redo_user_id' => $this->wms_check_redo_user_id,
            'wms_check_at' => $this->wms_check_at,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
            'is_del' => $this->is_del,
        ]);

        $query->andFilterWhere(['like', 'wms_check_code', $this->wms_check_code])
            ->andFilterWhere(['like', 'common_producer_info_name', $this->common_producer_info_name])
            ->andFilterWhere(['like', 'wms_check_user_name', $this->wms_check_user_name])
            ->andFilterWhere(['like', 'wms_check_user_phone', $this->wms_check_user_phone])
            ->andFilterWhere(['like', 'wms_check_redo_user_name', $this->wms_check_redo_user_name])
            ->andFilterWhere(['like', 'wms_check_redo_user_phone', $this->wms_check_redo_user_phone])
            ->andFilterWhere(['like', 'wms_check_note', $this->wms_check_note]);

        return $dataProvider;
    }
}

  

backend/views/wms-check/index.php

<?php

use yii\helpers\Html;
use kartik\grid\GridView;

$this->registerCssFile("css/css.css", ['depends' => ['dmstr\web\AdminLteAsset']]);
$this->title = Yii::t('app', '库存盘点清单');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="wms-check-index">
    <?php  echo $this->render('_search', ['model' => $searchModel]); ?>
    <div class="header">
        <div class="title">
            列表 <?= !empty($searchModel->common_producer_info_name) ? '(' . $searchModel->common_producer_info_name . ')' : ''; ?></div>
        <ul class="button_list">
            <li>
                <a class="a_color" href="<?= \yii\helpers\Url::to(['create']) ?>">
                    <i class="fa fa-plus" style="margin-right: 5px;"></i>新建</a>
            </li>
            <li>
                <a class="a_color" href="javascript:void(0)" onclick="(document.getElementById('search').style.display=='block')?
                (document.getElementById('search').style.display='none')&&(this.text='筛选'):(document.getElementById('search').style.display='block')&&(this.text='关闭筛选'); ">关闭筛选</a>
            </li>
        </ul>
    </div>
    <div class="clearfix"></div>
    <?= GridView::widget([
        'tableOptions' => ['class' => 'table table-striped'],
        'layout' => "{items}{summary}{pager}",
        'pjax'=>true,
        'striped'=>false,
        'hover'=>true,
        'showPageSummary' => false,
        'dataProvider' => $dataProvider,
        'columns' => [
            'wms_check_code',
            'common_producer_info_name',
             [
                 'label'=>'物料类型',
                 'value'=>function($model){
                     return $model->common_producer_herb_type == 1 ? '原料' : '成品';
                 }
             ],
            [
                'label'=>'年月',
                'value'=>function($model){
                    return $model->wms_check_year.'-'.$model->wms_check_month;
                }
            ],
             'wms_check_user_name',
             'wms_check_user_phone',
            'wms_check_redo_user_name',
            'wms_check_redo_user_phone',
            [
                'label'=>'盘库日期',
                'value'=>function($model){
                    return date('Y-m-d', $model->wms_check_at);
                }
            ],
            [
                'class' => 'kartik\grid\ActionColumn',
                'template' => '<li>{view}</li><li>{print}</li><li>{update}</li>',
                'header'=>'操作',
                'dropdown' => true,
                'dropdownOptions' => ['class' => 'pull-right'],
                'dropdownButton' => ['label' => '菜单','class'=>'btn btn-success'],
                'buttons' => [
                    'view' => function ($url, $model, $key) {
                        return Html::a('查看', ['view', 'id' => $key], ['class' => '']);
                    },
                    'print' => function ($url, $model, $key) {
                        return Html::a('打印', ['print', 'id' => $key], ['class' => '']);
                    },
                    'update' => function ($url, $model, $key) {
                        return Html::a('编辑', ['update', 'id' => $key], ['class' => '']);
                    },
                ]
            ],
        ],
    ]); ?>
</div>

backend/views/wms-check/search.php

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model backend\models\WmsCheckSearch */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="wms-check-search" id="search" style="display: block;">

    <?php $form = ActiveForm::begin([
        'action' => ['index'],
        'method' => 'get',
    ]); ?>
    <div class="row">
        <div class="col-md-3">
            <?= $form->field($model, 'common_producer_info_id', [
                'template' => "{input}",
            ])->label("基地名称")->widget(\kartik\select2\Select2::classname(), [
                'name' => 'common_producer_info_id',
                'hideSearch' => false,
                'data' => \yii\helpers\ArrayHelper::map(core\models\CommonProducerInfo::getCommonProducerInfoList(), 'division_id', 'common_producer_info_name'),
                'options' => ['placeholder' => '请选择基地','disabled'=>true],
                'pluginOptions' => [
                    'maximumInputLength' => 100,
                    'allowClear' => true,
                ]
            ]);
            ?>
        </div>
        <div class="col-md-3">
            <?= $form->field($model, 'common_producer_herb_type', [
                'template' => "{input}",
            ])->label("物料类型")->widget(\kartik\select2\Select2::classname(), [
                'name' => 'common_producer_herb_type',
                'hideSearch' => false,
                'data' => \yii\helpers\ArrayHelper::map(core\models\WmsStockDetailInfo::wmsMaterialTypeOptions(), 'id', 'text'),
                'options' => ['placeholder' => '请选择物料类型'],
                'pluginOptions' => [
                    'maximumInputLength' => 100,
                    'allowClear' => true,
                ]
            ]);
            ?>
        </div>
        <div class="col-md-3">
            <?= $form->field($model, 'wms_check_year',[
                'template' => "{input}",
            ])->label('年份')->widget(\kartik\datetime\DateTimePicker::classname(), [
                'options' => [
                    'placeholder' => '选择年份',
                    'value' =>$model->wms_check_year
                ],
                'readonly' => false,
                'pluginOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy',
                    'minView' => 4,
                    'maxView' => 4,
                    'viewSelect' => '4',
                    'startView' => '4'
                ]
            ])
            ?>
        </div>
        <div class="col-md-3">
            <?= $form->field($model, 'wms_check_month',[
                'template' => "{input}",
            ])->label('月份')->widget(\kartik\datetime\DateTimePicker::classname(), [
                'options' => [
                    'placeholder' => '选择月份',
                    'value' => $model->wms_check_month
                ],
                'readonly' => false,
                'pluginOptions' => [
                    'autoclose' => true,
                    'format' => 'mm',
                    'minView' => 3,
                    'maxView' => 4,
                    'viewSelect' => '4',
                    'startView' => '3'
                ]
            ])
            ?>
        </div>

        <div class="col-md-3">
            <?= Html::submitButton(Yii::t('app', '搜索'), ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
    <?php ActiveForm::end(); ?>

</div>

backend/views/wms-check/view.php

<?php

use yii\helpers\Html;
use yii\widgets\DetailView;

$this->title = '库存盘点清单';
$this->params['breadcrumbs'][] = ['label' => '库存盘点清单', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
$this->params['action_type'] = "查看";

$this->registerCssFile("css/css.css",['depends' => ['dmstr\web\AdminLteAsset']]);
$this->registerCssFile(Yii::$app->urlManager->baseUrl .'/css/default_view_page.css');

?>
<div class="wms-check-view hg_default-view">
    <table class="table table-bordered" style="table-layout:fixed;">
        <tr style="background-color: #F1F1F1;">
            <td colspan="12" class="type_title title_create">查看
                <ul class="nav pull-right">
                    <?= Html::a('返回', ['index'], ['class' => 'default_title-btn']) ?>
                </ul>
            </td>
        </tr>
        <tr>
            <td colspan="12" class="type_title">基本信息</td>
        </tr>
        <tr>
            <td colspan="1" class="item-label">
                <label class="control-label">申请编号</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->wms_check_code; ?>
            </td>
            <td colspan="1" class="item-label">
                <label class="control-label">加工基地</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->common_producer_info_name; ?>
            </td>
            <td colspan="1" class="item-label">
                <label class="control-label">年份</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->wms_check_year; ?>
            </td>
            <td colspan="1" class="item-label">
                <label class="control-label">月份</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->wms_check_month; ?>
            </td>
        </tr>
        <tr>
            <td colspan="1" class="item-label">
                <label class="control-label">物料类型</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->common_producer_herb_type == 1 ? '原料' : '成品'; ?>
            </td>
            <td colspan="1" class="item-label">
                <label class="control-label">盘点人</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->wms_check_user_name; ?>
            </td>
            <td colspan="1" class="item-label">
                <label class="control-label">复核人</label>
            </td>
            <td colspan="2" class="item-value">
                <?= $model->wms_check_redo_user_name; ?>
            </td>
            <td colspan="1" class="item-label">
                <label class="control-label">盘点日期</label>
            </td>
            <td colspan="2" class="item-value">
                <?= date('Y年m月d日', $model->wms_check_at); ?>
            </td>
        </tr>
        <tr>
            <td colspan="1" class="item-label">
                <label class="control-label">备注</label>
            </td>
            <td colspan="11" class="item-value">
                <?= $model->wms_check_note; ?>
            </td>
        </tr>

        <tr><td colspan="12" class="type_title">库存清单</td></tr>
        <tr>
            <td colspan="1" class="item-label"><label class="control-label">存货类别</label></td>
            <td colspan="1" class="item-label"><label class="control-label">存货名称</label></td>
            <td colspan="1" class="item-label"><label class="control-label">等级</label></td>
            <td colspan="1" class="item-label"><label class="control-label">规格</label></td>
            <td colspan="1" class="item-label"><label class="control-label">单价(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">账面重量(KG)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">账面金额(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点重量(KG)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点金额(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点重量差异(KG)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点金额差异(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点差异说明</label></td>
        </tr>
        <?php foreach ($detailList as $detail){ ?>
            <tr>
                <td colspan="1"><?= $detail->common_producer_herb_type == 1 ? '原料':'成品' ?></td>
                <td colspan="1"><?= $detail->common_producer_herb_info_name ?></td>
                <td colspan="1"><?= $detail->common_producer_herb_grade_info_name ?></td>
                <td colspan="1"><?= $detail->common_producer_herb_grade_info_spec_name ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_unit_price) ? '' : \common\models\Base::moneyBcdiv($detail->wms_check_detail_unit_price) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_info_weight) ? '' : \common\models\Base::weightBcdiv($detail->wms_check_detail_info_weight) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_info_sum_price) ? '' : \common\models\Base::moneyBcdiv($detail->wms_check_detail_info_sum_price) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_check_weight) ? '' : \common\models\Base::weightBcdiv($detail->wms_check_detail_check_weight) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_check_sum_price) ? '' : \common\models\Base::moneyBcdiv($detail->wms_check_detail_check_sum_price) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_diff_weight) ? '' : \common\models\Base::weightBcdiv($detail->wms_check_detail_diff_weight) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_diff_sum_price) ? '' : \common\models\Base::moneyBcdiv($detail->wms_check_detail_diff_sum_price) ?></td>
                <td colspan="1"><?= empty($detail->wms_check_detail_diff_note) ? '' : $detail->wms_check_detail_diff_note ?></td>
            </tr>
        <?php } ?>
    </table>
</div>

backend/views/wms-check/create.php

<?php

use yii\helpers\Html;

$this->registerCssFile("css/css.css",['depends' => ['dmstr\web\AdminLteAsset']]);
$this->title = Yii::t('app', '库存盘点清单');
$this->params['breadcrumbs'][] = ['label' => '库存盘点清单', 'url' => ['index']];
$this->params['breadcrumbs'][] = "新建";

?>
<div class="wms-check-create">

    <?= $this->render('_form', [
        'model' => $model,
        'stock_list'=>$stock_list,
    ]) ?>

</div>

backend/views/wms-check/update.php

<?php

use yii\helpers\Html;

$this->registerCssFile("css/css.css",['depends' => ['dmstr\web\AdminLteAsset']]);
$this->title = Yii::t('app', '库存盘点清单');
$this->params['breadcrumbs'][] = ['label' => '库存盘点清单', 'url' => ['index']];
$this->params['breadcrumbs'][] = "编辑";
?>
<div class="wms-check-update">

    <?= $this->render('_form', [
        'model' => $model,
        'detailList'=>$detailList,
    ]) ?>

</div>

  

backend/views/wms-check/_form.php

<?php
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\helpers\Url;
use kartik\widgets\ActiveForm;
use kartik\widgets\Select2;

$this->registerCssFile(Yii::$app->urlManager->baseUrl .'/css/default_form_page.css');
?>

<div class="wms-check-form default_page-form">
    <?php $form = ActiveForm::begin([
        'options'=>['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => '{input}{error}',
            'options' => ['class' => 'form-field'],
        ],
    ]); ?>
    <table class="table table-bordered">
        <tr style="background-color: #F1F1F1;">
            <td colspan="12" class="type_title title_create"><?php echo $model->isNewRecord ? Yii::t('app', '新建') : Yii::t('app', '编辑') ?>
                <ul class="nav pull-right">
                    <?= Html::submitButton('保存', ['class' => 'btn btn-success-nav']) ?>
                    <?= Html::a('返回', ['index'], ['class' => 'divider-vertical']) ?>
                </ul>
            </td>
        </tr>
        <tr>
            <td colspan="12" class="type_title">基本信息</td>
        </tr>
        <tr>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_code">申请编号</label>
            </td>
            <td colspan="2">
                <?php
                echo $form->field($model, 'wms_check_code')->textInput(['readonly' => true])
                ?>
            </td>
            <td class="item-label">
                <label class="control-label" for="wmscheck-common_producer_info_id">加工基地</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'common_producer_info_id')->widget(\kartik\select2\Select2::className(), [
                    'data' => \yii\helpers\ArrayHelper::map(core\models\CommonProducerInfo::getCommonProducerInfoList(),'division_id','common_producer_info_name'),
                    'options' => ['placeholder' => '请选择加工基地', 'disabled'=>true],
                    'hideSearch' => true,
                    'pluginOptions' => ['allowClear' => true, ],
                    'pluginEvents' => [
                        "select2:select" => 'function() {
                            var url = "' . Url::to(["user/get-common-producer-people-info-list"]) . '";
                            var common_producer_info_id = $(this).val();
                            var This = $(this);
                            $.get(url, {"common_producer_info_id":common_producer_info_id}, function (data) {
                                html = \'<option value="">选择盘库人</option>\';
                                $(data.results).each(function(i, item){
                                    tempOption = \'<option value="_userid_">_username_</option>\';
                                    html += tempOption.replace(/_userid_/g, item.id).replace(/_username_/g, item.text);
                                });
                                $("#wmscheck-wms_check_user_id").html(html);
                            }, "json");
                        }',
                    ]
                ])
                ?>
            </td>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_at">年份</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'wms_check_year')->widget(\kartik\datetime\DateTimePicker::classname(), [
                    'options' => [
                        'placeholder' => '选择年份',
                        'value' =>$model->wms_check_year
                    ],
                    'readonly' => false,
                    'pluginOptions' => [
                        'autoclose' => true,
                        'format' => 'yyyy',
                        'minView' => 4,
                        'maxView' => 4,
                        'viewSelect' => '4',
                        'startView' => '4'
                    ]
                ])
                ?>
            </td>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_at">月份</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'wms_check_month')->widget(\kartik\datetime\DateTimePicker::classname(), [
                    'options' => [
                        'placeholder' => '选择月份',
                        'value' => $model->wms_check_month
                    ],
                    'readonly' => false,
                    'pluginOptions' => [
                        'autoclose' => true,
                        'format' => 'mm',
                        'minView' => 3,
                        'maxView' => 4,
                        'viewSelect' => '4',
                        'startView' => '3'
                    ]
                ])
                ?>
            </td>
        </tr>
        <tr>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_herb_type">物料类型</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'common_producer_herb_type')->widget(Select2::className(), [
                    'data' => [1=>'原料', 2=>'成品'],
                    'options' => [
                        'placeholder' => '请选择物料类型',
                    ],
                    'pluginOptions' => ['allowClear' => true],
                ])
                ?>
            </td>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_user_id">盘库人</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'wms_check_user_id')->widget(Select2::className(), [
                    'data' => \core\models\User::getUserOptionsByConversionBaseId(\core\models\Division::getTopDivisionId(Yii::$app->user->identity->division_id,true)),
                    'options' => [
                        'placeholder' => '请选择盘库人',
                    ],
                    'pluginOptions' => ['allowClear' => true],
                ])
                ?>
            </td>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_redo_user_id">复核人</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'wms_check_redo_user_id')->widget(Select2::className(), [
                    'data' => \core\models\User::getUserOptionsByConversionBaseId(\core\models\Division::getTopDivisionId(Yii::$app->user->identity->division_id,true)),
                    'options' => [
                        'placeholder' => '请选择复核人',
                    ],
                    'pluginOptions' => ['allowClear' => true],
                ])
                ?>
            </td>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_at">盘库日期</label>
            </td>
            <td colspan="2">
                <?= $form->field($model, 'wms_check_at')->widget(\kartik\datetime\DateTimePicker::classname(), [
                    'options' => [
                        'placeholder' => '盘库日期',
                        'value' => ($model->wms_check_at != null) ? date("Y-m-d", $model->wms_check_at) : ''
                    ],
                    'readonly' => false,
                    'pluginOptions' => [
                        'autoclose' => true,
                        'format' => 'yyyy-mm-dd',
                        'minView' => 4,
                        'maxView' => 4,
                    ]
                ])
                ?>
            </td>
        </tr>
        <tr>
            <td class="item-label">
                <label class="control-label" for="wmscheck-wms_check_note">备注</label>
            </td>
            <td colspan="11" class="note">
                <?= $form->field($model, 'wms_check_note')->textarea(['maxlength' => true]) ?>
            </td>
        </tr>
        <tr>
            <td colspan="12" class="type_title">库存清单</td>
        </tr>

        <tr>
            <td colspan="1" class="item-label"><label class="control-label">存货类别</label></td>
            <td colspan="1" class="item-label"><label class="control-label">存货名称</label></td>
            <td colspan="1" class="item-label"><label class="control-label">等级</label></td>
            <td colspan="1" class="item-label"><label class="control-label">规格</label></td>
            <td colspan="1" class="item-label"><label class="control-label">单价(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">账面重量(KG)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">账面金额(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点重量(KG)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点金额(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点重量差异(KG)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点金额差异(元)</label></td>
            <td colspan="1" class="item-label"><label class="control-label">盘点差异说明</label></td>
        </tr>
        <?php if($model->isNewRecord){ ?>
        <?php foreach ($stock_list as $stock){ ?>
        <tr>
            <td colspan="1"><?= $stock['common_producer_material_type_info_id'] == 1 ? '原料' : '成品' ?></td>
            <td colspan="1"><?= $stock['common_producer_herb_info_name'] ?></td>
            <td colspan="1"><?= $stock['common_producer_herb_grade_name'] ?></td>
            <td colspan="1"><?= $stock['common_producer_herb_grade_info_spec_name'] ?></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
            <td colspan="1"></td>
        </tr>
        <?php } ?>
        <?php } ?>
        <?php if(!$model->isNewRecord && isset($detailList)){ ?>
            <?php foreach ($detailList as $detail){ ?>
                <tr>
                    <td colspan="1" style="display: none;"><input type="hidden" name="WmsCheckDetail[id][]" value="<?= $detail->id ?>"></td>
                    <td colspan="1"><?= $detail->common_producer_herb_type == 1 ? '原料':'成品' ?></td>
                    <td colspan="1"><?= $detail->common_producer_info_name ?></td>
                    <td colspan="1"><?= $detail->common_producer_herb_grade_info_name ?></td>
                    <td colspan="1"><?= $detail->common_producer_herb_grade_info_spec_name ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_unit_price[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0', 'value'=>\common\models\Base::moneyBcdiv($detail->wms_check_detail_unit_price)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_info_weight[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0', 'value'=>\common\models\Base::weightBcdiv($detail->wms_check_detail_info_weight)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_info_sum_price[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0','value'=>\common\models\Base::moneyBcdiv($detail->wms_check_detail_info_sum_price)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_check_weight[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0', 'value'=>\common\models\Base::weightBcdiv($detail->wms_check_detail_check_weight)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_check_sum_price[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0','value'=>\common\models\Base::moneyBcdiv($detail->wms_check_detail_check_sum_price)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_diff_weight[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0', 'value'=>\common\models\Base::weightBcdiv($detail->wms_check_detail_diff_weight)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_diff_sum_price[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0','value'=>\common\models\Base::moneyBcdiv($detail->wms_check_detail_diff_sum_price)]); ?></td>
                    <td colspan="1"><?= $form->field($detail, 'wms_check_detail_diff_note[]')->textInput(['type' => 'number', 'step' => '0.01', 'min' => '0', 'value'=>$detail->wms_check_detail_diff_note]); ?></td>
                </tr>
            <?php } ?>
        <?php } ?>
        <tr>
            <td colspan="12" class="type_title">
                <div class="button-group">
                    <?= Html::submitButton('保存', ['class' => 'btn btn-success btn-size']) ?>
                    <?= Html::a('返回', ['index'], ['class' => 'btn btn-default btn-size']) ?>
                </div>
            </td>
        </tr>
    </table>
    <?php ActiveForm::end(); ?>
</div>

  

Yii2的使用的更多相关文章

  1. Yii2的深入学习--行为Behavior

    我们先来看下行为在 Yii2 中的使用,如下内容摘自 Yii2中文文档 行为是 [[yii\base\Behavior]] 或其子类的实例.行为,也称为 mixins,可以无须改变类继承关系即可增强一 ...

  2. 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述

    上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...

  3. 网站实现微信登录之嵌入二维码——基于yii2开发的描述

    之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...

  4. yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习

    对于一个有登录限制(权限限制)的网站,用户输入身份验证信息以后,验证成功后跳转到登录前的页面是一项很人性化的功能.那么获取登录前的页面地址就很关键,今天在做一个yii2项目的登录调试时发现了一些很有意 ...

  5. 记一次nginx部署yii2项目时502 bad gateway错误的排查

    周六闲来无事,就试着安装和部署下yii2,安装过程没什么问题,但部署到nginx上时遇到了502 bad gatewary问题,折腾了半天才搞定.这个问题是我以前在部署yii2时没有遇到过的,因此记在 ...

  6. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  7. yii2 RESTful api的详细使用

    作者:白狼 出处:http://www.manks.top/yii2-restful-api.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  8. yii2 ActiveRecord多表关联以及多表关联搜索的实现

    作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明 ...

  9. yii2权限控制rbac之rule详细讲解

    作者:白狼 出处:http://www.manks.top/yii2_rbac_rule.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...

  10. yii2组件之多图上传插件FileInput的详细使用

    作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...

随机推荐

  1. hyperledger中文文档学习-4-构建第一个fabric网络

    接下来的操作都将在hyperledge环境安装构建的虚拟机的环境下进行 参考https://hyperledgercn.github.io/hyperledgerDocs/build_network_ ...

  2. Java多线程(十)——线程优先级和守护线程

    一.线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon( ...

  3. log4net配置文件

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...

  4. samba故障:protocol negotiation failed: NT_STATUS_IO_TIMEOUT

    windows下无法访问samba共享目录,若无任何提示则需要到linux服务器上访问samba共享,看下是否有问题提示 故障解决过程:(保证网络通畅) 1.查看samba服务器是否正常,smb服务器 ...

  5. C# Type.GetType 返回NULL 问题解决记录

    Type.GetType("OP.Client.Html.Resources.KenFengFormMethod"); 从Dll里面获取KenFengFormMethod这个会返回 ...

  6. Omi v1.0震撼发布 - 开放现代的Web组件化框架

    原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...

  7. Python_每日习题_0007_copy

    题目:将一个列表的数据复制到另一个列表中. 程序分析:使用列表[:],拿不准可以调用copy模块 import copy a = [,,,,['a','b']] b = a #赋值 c = a[:] ...

  8. H5 34-背景图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. set和multiset的用法

    set #include<iostream> #include<algorithm> #include<cstdio> #include<string.h&g ...

  10. numpy中random的使用

    import numpy as np a=np.random.random()#用于生成一个0到1的随机浮点数: 0 <= n < 1.0print(a)0.772000903322952 ...