数据字段中,没有主键字段,(因为不需要),在插入数据的时候,会提示数据无主键,请问rules需要怎么设置才可以不验证主键
Note that an array should be returned even for a table with single primary key.
上面一句是注释, 要求返回数组格式;
另外一个小小建议, 最好还是保留一个主键, 即使不需要;
数据字段中,没有主键字段,(因为不需要),在插入数据的时候,会提示数据无主键,请问rules需要怎么设置才可以不验证主键
Note that an array should be returned even for a table with single primary key.
上面一句是注释, 要求返回数组格式;
另外一个小小建议, 最好还是保留一个主键, 即使不需要;
用YII2做了两个月的项目了,自己也在自己练习,但是还是感觉没有个整体思路。希望大家能够给总结一下,整理出来一个系统的YII2学习计划,最好是能够由易到难,囊括常用YII功能及插件。谢谢!!!
要系统学习,第一阶段是逐字逐句理解指南,能直接看原文更好;
第二阶段看这本书《Web Application Development with Yii 2 and PHP》;
第三阶段github上有不错的开源项目,找些来学习,有不错的设计思想可借鉴;
第四阶段自己设计和积累widget
, extension
,时间长了就能像搭积木那样构建很多类型的应用了。
自己做一个项目,你先想到你需要什么,只要你需要什么你的你就会去找什么,思路清晰了,也就不是问题了,不懂的话还可以多看看手册,
如二楼所言
先看文档做个小东西
自己做个基本的功能,自己慢慢扩展,需要什么,就做什么事,日积月累,你就成功啦。
我写的yii2实战,我觉得蛮好的,大家反馈也挺好的,自荐一下。
大家好
请问如下的需求应该如何使用AccessControl 实现呢?
controller中有三个方法。
用户有2个
需求:
不知道如何实现呢?
我现在使用
beforeaction 来判断rbac的权限,但是 使用了 beforeaction 之后 我设置的VerbFilter 对 delete方法的post过滤就失效了。 注释beforeaction后 是正常的。
这是我现在的 behaviors配置 但是无法实现 2个已登录用户的 权限区别。
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => \yii\filters\AccessControl::className(),
//'only' => ['hello',],
'rules' => [
[
'allow' => false,
'roles' => ['?'],
],
],
],
];
}
手册中 AccessControl类 有方法beforeAction 说明是 在所有的过滤之后 在执行之前的最后一个判断的时间了,我感觉比较适合我现在的情况,但是水平太菜,不知道如何去配置AccessControl类的beforeAction 。
请问该如何使用AccessControl 简洁优雅的实现我的需求呢?
比如当前PHP计算所得周次是第10周,那么HTML的SELECT控件应该默认选择10,且下拉选项还有1-25的值供选。
不知道怎么弄简单点,我现在用很傻的办法, 结合了JQ,有没有简洁点的方法?jQuery("#stpointstemp-week").val('<?=$weekly?>');/*页面载入后设置当前周次*/
<?= $form->field($model, 'week')->dropDownList(['1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','10'=>'10',
'11'=>'11','12'=>'12','13'=>'13','14'=>'14','15'=>'15','16'=>'16','17'=>'17','18'=>'18','19'=>'19','20'=>'20',
'21'=>'21','22'=>'22','23'=>'23','24'=>'24','25'=>'25'
]) ?>
<?php $model->week = $weekly; ?>
在前面加上这句代码 <?php $model->week = $weekly; ?>
radioList 如何添加默认选中呢
$model->loadDefaultValue();//我记得方法的名字是这样,你考虑考虑
写在控制器里面
找问题的 小伙伴少走点弯路
视图里面
默认值分两种:
1)数据库中的定义的default值,
用如下方式
$model->loadDefaultValue();
2)逻辑中定义的default值
用如下方式
$model->status=1;
<?php $model->status = 1; ?>
<?= $form->field($model, ‘status’)->textInput()->radioList( [‘1’=>’显示’,’2’=>’隐藏’] )?>
新人刚做,做好登陆,不知道怎么判断是否登陆,有大神解答下吗…可以的话,尽量详细点,谢谢各位
Yii::$app->user->isGuest 说明未登录
看源码,出厂自带了此功能。
或者用session判断也可以的
我想在iframe页面内写一个点击按钮,触发一个方法 function aa(){alert('213');}
,这个方法在iframe里面,要怎么写啊?
good nice
Yii2创建form表单是个常见的情景,今天偶然的机会看到from表单id的两种写法:
第一种写法:
<?php $form = ActiveForm::begin([
'id'=>'myForm', //设置form表单id
'method'=>'get',
'options' => ['class'=>'form-horizontal']
]);?>
第二种写法:
<?php $form = ActiveForm::begin([
'method'=>'get',
'options' => ['class'=>'form-horizontal','id'=>'myForm'] //id放在属性里
]);?>
两种写法经过的源码有一点点区别,简单的来看下源码:
首先,是ActiveForm::begin()
这个方法,他是在yiisoft\yii2\base\Widget.php
里的begin()
方法
public static function begin($config = [])
{
$config['class'] = get_called_class();
/* @var $widget Widget */
$widget = Yii::createObject($config);
static::$stack[] = $widget;
return $widget;
}
这个方法返回的是ActiveForm(yiisoft\yii2\widgets\ActiveForm)对象,而不是Widget对象,我们打印下返回的$widget对象,看看两种情况这个对象哪里不一样var_dump($widget);
第一种id的表单写法结果是:
object(yii\widgets\ActiveForm)#56 (29) { ["action"]=> string(0) "" ["method"]=> string(3) "get" ["options"]=> array(2) { ["class"]=> string(15) "form-horizontal" ["id"]=> string(6) "myForm" } ["fieldClass"]=> string(23) "yii\widgets\ActiveField" ["fieldConfig"]=> array(0) { } ["encodeErrorSummary"]=> bool(true) ["errorSummaryCssClass"]=> string(13) "error-summary" ["requiredCssClass"]=> string(8) "required" ["errorCssClass"]=> string(9) "has-error" ["successCssClass"]=> string(11) "has-success" ["validatingCssClass"]=> string(10) "validating" ["enableClientValidation"]=> bool(true) ["enableAjaxValidation"]=> bool(false) ["enableClientScript"]=> bool(true) ["validationUrl"]=> NULL ["validateOnSubmit"]=> bool(true) ["validateOnChange"]=> bool(true) ["validateOnBlur"]=> bool(true) ["validateOnType"]=> bool(false) ["validationDelay"]=> int(500) ["ajaxParam"]=> string(4) "ajax" ["ajaxDataType"]=> string(4) "json" ["scrollToError"]=> bool(true) ["attributes"]=> array(0) { } ["_fields":"yii\widgets\ActiveForm":private]=> array(0) { } ["_id":"yii\base\Widget":private]=> string(6) "myForm" ["_view":"yii\base\Widget":private]=> NULL ["_events":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> NULL }
第二种id表单结果:
object(yii\widgets\ActiveForm)#56 (29) { ["action"]=> string(0) "" ["method"]=> string(3) "get" ["options"]=> array(2) { ["class"]=> string(15) "form-horizontal" ["id"]=> string(6) "myForm" } ["fieldClass"]=> string(23) "yii\widgets\ActiveField" ["fieldConfig"]=> array(0) { } ["encodeErrorSummary"]=> bool(true) ["errorSummaryCssClass"]=> string(13) "error-summary" ["requiredCssClass"]=> string(8) "required" ["errorCssClass"]=> string(9) "has-error" ["successCssClass"]=> string(11) "has-success" ["validatingCssClass"]=> string(10) "validating" ["enableClientValidation"]=> bool(true) ["enableAjaxValidation"]=> bool(false) ["enableClientScript"]=> bool(true) ["validationUrl"]=> NULL ["validateOnSubmit"]=> bool(true) ["validateOnChange"]=> bool(true) ["validateOnBlur"]=> bool(true) ["validateOnType"]=> bool(false) ["validationDelay"]=> int(500) ["ajaxParam"]=> string(4) "ajax" ["ajaxDataType"]=> string(4) "json" ["scrollToError"]=> bool(true) ["attributes"]=> array(0) { } ["_fields":"yii\widgets\ActiveForm":private]=> array(0) { } ["_id":"yii\base\Widget":private]=> NULL ["_view":"yii\base\Widget":private]=> NULL ["_events":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> NULL }
可以看出,结果差不多一样,关键看后面几行["_id":"yii\base\Widget":private]
这个对应的值不一样,第一种的值是自己定义的id(myForm),第二种值为空,这里的_id是Widget.php里的一个属性(定义在110行左右)
begin()运行后,是运行init()方法(在yiisoft\yii2\widgets\ActiveForm):
public function init()
{
if (!isset($this->options['id'])) {
$this->options['id'] = $this->getId();
}
echo Html::beginForm($this->action, $this->method, $this->options);
}
这里的if语句不解,$this->options[‘id’])不是两种情况都有值的吗(var_dump($widget);),为什么第2种没运行进来第1种却运行进来了???
问题解决了,之前理解错了一直以为运行完begin后才会运行init的,原来是运行begin的时候会调用init的
如果你在options中没有指定id,那么框架就使用w0,w1,w2…这样的id.
首先你要理解init();在什么时候调用。
是在object创建的时候调用的魔术方法__construct();里面调用到init();
而静态方法的调用不会触发construct();
所以ActiveForm::begin();先执行begin();方法,在begin();方法中调用$widget = Yii::createObject($config);的时候,才触发construct();调用到init();
而$this->options中options的值是在__construct();中Yii::configure($this, $config);方法设置,所以你会发现你方法1中有init();有值而2中没值。
农民和楼上的解释挺好的
大神同学们,经过我的反复折腾,但学习尚浅,问题还是未能解决。特请教!
本地测试均无问题,测试环境是 ubuntu14 + nginx,服务器是 CentOS 5.4。
上传后页面均能使用,但始终没有样式,firebug 报如下错误 "_NetworkError: 404 Not Found - http://***.com/study/web/assets/7feb762a/css/bootstrap.css_"
。
我想到可能是权限问题,修改了 runtime
和 web/assets
权限为 777,依然无效。
开启调试模式也没有报错。
谢谢。
记得这个问题后来参考共享主机一节解决的。
assets 經過 hash 的檔案名稱
確定 環境內有此名稱的 folder 嗎?
(只能逐步慢慢找了)
如题,我module模块下有admin控制器,我该怎么指定底下的IndexController为默认控制器呢?默认的事Default控制器
在 component 可以指定(但我只是過 defaultRoute)
網路上說 也可以用 defaultController
你試試看Module.php
里面,可以自己重写 defaultRoute
和 defaultController
属性。