Yii2的使用
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的使用的更多相关文章
- Yii2的深入学习--行为Behavior
我们先来看下行为在 Yii2 中的使用,如下内容摘自 Yii2中文文档 行为是 [[yii\base\Behavior]] 或其子类的实例.行为,也称为 mixins,可以无须改变类继承关系即可增强一 ...
- 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述
上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...
- 网站实现微信登录之嵌入二维码——基于yii2开发的描述
之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...
- yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习
对于一个有登录限制(权限限制)的网站,用户输入身份验证信息以后,验证成功后跳转到登录前的页面是一项很人性化的功能.那么获取登录前的页面地址就很关键,今天在做一个yii2项目的登录调试时发现了一些很有意 ...
- 记一次nginx部署yii2项目时502 bad gateway错误的排查
周六闲来无事,就试着安装和部署下yii2,安装过程没什么问题,但部署到nginx上时遇到了502 bad gatewary问题,折腾了半天才搞定.这个问题是我以前在部署yii2时没有遇到过的,因此记在 ...
- yii2的权限管理系统RBAC简单介绍
这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...
- yii2 RESTful api的详细使用
作者:白狼 出处:http://www.manks.top/yii2-restful-api.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- yii2 ActiveRecord多表关联以及多表关联搜索的实现
作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明 ...
- yii2权限控制rbac之rule详细讲解
作者:白狼 出处:http://www.manks.top/yii2_rbac_rule.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- yii2组件之多图上传插件FileInput的详细使用
作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...
随机推荐
- js如何获取跨域iframe 里面content
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 其中src可能存在跨域. 现有的获取方式 var test = document. ...
- 【vue】vue +element 搭建项目,要求既支持pc端又支持移动端
使用场景:有适配pc端改为适配pc端和移动端,使用2套css 代码实现App.vue created: function () { if(document.documentElement.client ...
- hyperledger中文文档学习-1-词汇表
参考:https://hyperledgercn.github.io/hyperledgerDocs/glossary/ Chaincode - 链码,即智能合约 链码是一个运行在账本上的软件,它可以 ...
- oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
问题产生的操作步骤及详细说明: 1)操作的数据库是oracle 11g,先通过命令将用户GAS_NEW的数据导出,命令语句如下: expdp GAS_NEW/GAS_NEW@ORCL schemas= ...
- Item 18: 使用srd::unique_ptr来管理独占所有权的资源
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 当你需要一个智能指针的时候,std::unique_ptr通常是最 ...
- flask实现子域名
什么是子域名? 子域名,类似于xxx.douban.com的形式,如book.douban.com,music.douban.com,movie.douban.com等 用flask怎么实现子域名? ...
- Python_老男孩练习题1
get有陷阱:value 5.以下打印的内容是:—————— —————— —————— [10, 'a'] [123] [10, 'a'] #方法一: 将list 转为 set #l ...
- SVN插件和Tomcat插件地址
SVN插件: http://subclipse.tigris.org/update_1.8.x Tomcat插件: http://tomcatplugin.sf.net/update 备注:如果svn ...
- Django 中的 cookie 和 session
一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...
- 第四章 MyBatis-SQL映射文件
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 SQL映射文件的几个顶级元素(按照定义的顺序) mapper - namespace cache - 配置 ...