我想问,是不是时间字段必须不是required
其实时间一定会被填充的,只不过不需要在rule规则中出现;一旦你时间字段出现在rule的必填规则,那么他会在你进行插入的时候load验证的,然而TimestampBehavior是在验证之后产生的,所以不需要。
TimestampBehavior 在rule之后调用 你如果在之rule required 那么直接报错了。
我想问,是不是时间字段必须不是required
其实时间一定会被填充的,只不过不需要在rule规则中出现;一旦你时间字段出现在rule的必填规则,那么他会在你进行插入的时候load验证的,然而TimestampBehavior是在验证之后产生的,所以不需要。
TimestampBehavior 在rule之后调用 你如果在之rule required 那么直接报错了。
function get_list($cnd = array(), &$count = false)
{
$datas = 'yes';
$count && $count = rand(1, 10000);
return $datas;
}
$count=1;
$data = get_list($cnd,$count);
echo $count;
最后输出的是随机数,整个过程是怎么走的?
进行到&$count = false
这一步的时候$count
是多少
php的引用和c的引用一个意思,内存地址。函数传引用相当于将地址传过去也就是变量本身,而普通传值只是传一个常量值。
再补充点吧。&$count相当于$count的内存地址,函数中传function xxx(&count)那么传过去的是变量count的内存地址,所以在函数中$count = “xxx”会直接改变变量count的值,因为他们都是一个内存地址。
毕竟php是从C来的,楼主对这些概念不清楚。可以看c++指针部分,都是对内存地址的操作。
看在你多悬赏 5 金钱的份上,我说两句。输出随机数就对了,因为你用了 &
,你上面那么多,其实就是这样的。
结果依旧输出随机数。
细细品味,,又长了点知识。。谢谢各位。 之前看这到样写 还有点懵圈 。现在悟了。。记得我刚学php 那会还是理解的。后来,工作上没用到,又给忘了。。
我使用的Yii2 basic 2.0.9。登录使用的基础模板的登录,我修改了models\LoginForm.php
中的login()
,登录的用户资料是从API中请求过来的。因为在site/login()
中登录成功之后var_dump(Yii::$app->user);
,输出的结果有API返回的user资料,调到site/index
之后,再输出var_dump(Yii::$app->user);
输出的结果没有user的资料。百度和谷歌之后,很多登录案例是使用db的。
我的问题是:我应该如何正确保存API返回的用户信息保存到session中,在其它页面var_dump(Yii::$app->user);
输出也能输出用户资料。
models\LoginForm.php
的login()
方法。
/**
* Logs in a user using the provided username and password.
* @return boolean whether the user is logged in successfully
*/
public function login()
{
if ($this->validate()) {
//return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
try{
//GuzzleHttp\Client
$client = new Client(['base_url'=>API_HOST.API_HOST_POSTFIX]);
$response = $client->get('wp-api-registration/v2/registration',[
'query'=>['username'=>$this->username,'password'=>$this->password]
]);
$result = $response->json();
$this->_user = User::getUserIdentity($result);
return Yii::$app->user->login($this->_user);
}catch (RequestException $e){
//当不正确的时候
if ($e->hasResponse() && $e->getCode() == 400) {
$responseBody = json_decode($e->getResponse()->getBody());
if($responseBody->code == 'json_login_error'){
$this->addError('username', '用戶名或者 不正確.');
}
}else{
echo $e->getResponse();
}
}
}
return false;
}
models\User.php
类:
<?php
namespace app\models;
class User extends \yii\base\Object implements \yii\web\IdentityInterface
{
public $id;
public $name;
public $first_name;
public $last_name;
public $email;
public $url;
public $description;
public $link;
public $nickname;
public $slug;
public $registered_date;
public $roles;
public $capabilities;
public $extra_capabilities;
public $username;
public $password;
public $authKey;
public $accessToken;
public static function getUserIdentity($data){
return new static($data);
}
/**
* @inheritdoc
*/
public static function findIdentity($id)
{
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
}
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
}
/**
* @inheritdoc
*/
public function getId()
{
return $this->id;
}
/**
* @inheritdoc
*/
public function getAuthKey()
{
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
}
}
API返回结果是:
{
"id": 1,
"username": "admin",
"name": "admin",
"first_name": "",
"last_name": "",
"email": "test@test.com",
"url": "",
"description": "",
"link": "http://192.168.1.119/wordpress/blog/author/admin/",
"nickname": "admin",
"slug": "admin",
"registered_date": "2016-06-25T02:31:45+00:00",
"roles":
[
"administrator"
],
"capabilities":
{
"switch_themes": true,
"edit_themes": true,
"activate_plugins": true,
"edit_plugins": true,
"edit_users": true,
"edit_files": true,
"manage_options": true,
"moderate_comments": true,
"manage_categories": true,
"manage_links": true,
"upload_files": true,
"import": true,
"unfiltered_html": true,
"edit_posts": true,
"edit_others_posts": true,
"edit_published_posts": true,
"publish_posts": true,
"edit_pages": true,
"read": true,
"level_10": true,
"level_9": true,
"level_8": true,
"level_7": true,
"level_6": true,
"level_5": true,
"level_4": true,
"level_3": true,
"level_2": true,
"level_1": true,
"level_0": true,
"edit_others_pages": true,
"edit_published_pages": true,
"publish_pages": true,
"delete_pages": true,
"delete_others_pages": true,
"delete_published_pages": true,
"delete_posts": true,
"delete_others_posts": true,
"delete_published_posts": true,
"delete_private_posts": true,
"edit_private_posts": true,
"read_private_posts": true,
"delete_private_pages": true,
"edit_private_pages": true,
"read_private_pages": true,
"delete_users": true,
"create_users": true,
"unfiltered_upload": true,
"edit_dashboard": true,
"update_plugins": true,
"delete_plugins": true,
"install_plugins": true,
"update_themes": true,
"install_themes": true,
"update_core": true,
"list_users": true,
"remove_users": true,
"promote_users": true,
"edit_theme_options": true,
"delete_themes": true,
"export": true,
"administrator": true
},
"extra_capabilities":
{
"administrator": true
}
}
你的User需要实现findIdentity($id)
这个函数,返回一个User实例。
Yii里面的登录逻辑是这样的:在密码校验通过后,会调用Yii::$app->getUser->login($identify,$duration)
来保存登录的用户的信息;以便下次访问直接获取用户的信息,不要再次输入密码等信息。
问题1:如何保存用户的信息(/site/login)
当然是保存到session和cookie中,这里和配置信息有关。yii\web\User.php中有两个参数$enableAutoLogin, $enableSession;
$enableSession将用户信息保存在session中, $enableAutoLogin将信息进一步保存到cookie中,参考login的一段代码
问题2, 用户下次访问的时候,如何获取用户的信息(访问/site/index)
既然在问题1中保存到了session/cookie中,那么自然要从这个里面取出来。我们访问用户的信息的时候一般采用的方式是Yii::$app->getUser->getIdentity(),这个函数的功能就是从session/cookie中取出用户的数据并重构identiy实例。其中重构的关键代码如下,里面的 $class::findIdentity($id)使用来重新构建identity实例的,你的User恰好没有实现这个,所以导致啥也没有啊。
登录后,
通过这个就可以获取到你用户模型的id了,然后通过User::findOne($id)就能获得你用户资料了,只是举例,原理就是这样哦~
lz您好,我想问一下,是不是默认保存在cookie里面的,看源代码的话好像都有保存,可是我的session是空的。请问一下它默认的登陆机制是保存在哪的?
linux下已经成功安装composer, 可以使用composer命令。输入命令:composer global require “fxp/composer-asset-plugin:~1.1.1” 安装 Composer asset plugin时失败,失败信息如下图:
linux环境下是否需要执行这条命令,还是说这条命令是在windows环境下执行的,如果linux下也需要执行这条命令,如何正确安装
composer插件?
已经告诉你了,不要用root执行
没找到你要安装的这个包,可以试试吧1.1.1改成2.0.0 如果不行会有提示哪些版本可以用再改一下就行了
完全卸载了composer重来一遍就没问题了。composer global require "fxp/composer-asset-plugin:@dev"
试试看,我也碰到过,就是这么解决的
官方已经升级了,现在是这个了
我是用ajax post表单请求的后台方法入库,_csrf也有,这是我后台接收到的数据
Array
(
[_csrf] => aGZhOHUtM0EMLyVyNHl1ByUENUkQYWQuKgc7eyQdB3AcITFPWGQLKA==
[class_name] => 阿发发送
[class_alias] => 啊打发
[is_show] => 1
[f_id] => 0
[order] => 100
)
我的model rule
public function rules()
{
return [
[['class_name','class_alias'], 'required','message'=>'{attribute}不能为空'],
[['created_at','updated_at'], 'default', 'value' => time()],
[['order'], 'default', 'value' => 100],
[['f_id', 'order', 'created_at', 'updated_at', 'is_show'], 'integer'],
[['class_name', 'class_alias'], 'string', 'max' => 50]
];
}
formname也有,
但是我用dump看总是false,不知道什么原因,能不能看到load model 报的错,求大神解决
我的Form使用了model,Form中的input的name组成模型名称[字段名称]
,普通Form POST提交之后,如:
下面是两个方法,你可以根据自己的情况使用:
可以看一下源码,什么时候load方法会返回false。
https://github.com/CraryPrimitiveMan/yii2-2.0.3-annotated/blob/master/framework/base/Model.php#L840-L858
当不满足$scope === '' && !empty($data)
和isset($data[$scope])
这两个条件的时候会返回false。
这里你没有粘贴调用load时的写法,所以你自己对照一下,应该很快能找到原因
load第二个参数设置为空字符串就可以了
rules方法, 验证规则
我在项目中 发现如果通过 AppAsset方式加载了样式。一些页面要二个js一些有三个js 等 要是全部加载 还会有js冲突 请问如果解决这样的问题,如果说是,每一种都设置一种layout 感觉这样觉得不太合理。如果是把不一样的提出加载到 views层,又觉得那里不对。。感觉上yii2对这种问题应该有更好的办法。。但是这对yii2了解不深,所以上来问下大家。。谢谢。。
你可以在页面头部加载需要的 JS 和 CSS ,不必在AppAsset一下加载所有。
特殊的,在view中加载js或者样式即可:
刚才在本站浏览器弹出一个窗口 VIP 群 是怎么回事
要有一个验证码 xxxx-pear2007 类似的 我点的速度 太快了 没看清楚是什么
咱们社区新开了两个超级群(2000人群),群号 10841303
和 10845211
。
申请加群时,验证消息应填写 id-用户名
,比如:33865-pear2007
。
被挂马了
在中文社区里会看到最后登录后面显示的是刚刚或者几分钟之前或者几小时之前甚至几天、几月之前,怎么实现的?是有插件吗还是自己一点一点判断? @ 巡洋艦㊣
Yii::$app->formatter->asRelativeTime('1447565922'); //N小时前
补充下楼上的,是组件,formatter组件。时间显示其实自己写个判断也行,挺简单的东西。
写一个方法把 最后登录的时间 跟当前登录的时间做比较,显示据上次登录时间差多少
<?= $form->field($model, 'content')->checkboxList(['0'=>'篮球','1'=>'足球','2'=>'羽毛球','3'=>'乒乓球']) ?>
选择多个,但保存时只保存一个,是怎么回事呢?
手动。在保存之前.
重点是如下两行代码$customers =Yii::$app->request->post('Customers');
//转的成字符串1,2,3以逗号分开保存在数据库中,这里可以根据情况自行处理 $hobby = implode(',', $customers['hobby']);
完整如下
不建议用楼上的方法
在模型里 写个beforeSave方法
在beforeSave方法里去分割传过来的checkbox数组
1。这个问题困扰很久了,每次都以特殊处理规避掉问题。
可以看一下下面的引入顺序,引入了第二次jquery的时候yii的gridView就失效了。
2。下面的这些js又依赖于jq 1.10.1 ,且Asset不引人jquery的话 这个Asset只能给带有gridview等插件的页面用,不然就会缺少jquery。这个就很纠结了,这些资源是用于共用页面的 然后受制于非公用页面有没有使用yii 内置的插件。目前能想的方案只能是 不用yii 内置的插件。有什么方式能解决这样的问题么?
自带那个jqeury 我也遇到过冲突的情况,我是在配置里面把他注掉了,然后写不同的公共文件加载jquery等文件。
找到gridview插件中引入js的资源包,把他注释掉就可以了
对,一般都是头部加jquery ,不然下面用它的方法岂不是会报错,我听你意思是gridview里面的插件总是在尾部的最前端注册? 其实加载位置都可以自己调整的,想把拿个JS 放到哪个位置就放到哪。
就算在底部写引入自己的jquery也是可以的
这个就是个例子,我在当然的view页面写的,把当前页面的代码放到头部。
上面都在扯什么乱七八糟的
如果你想用自己的jquery,去除yii自带的JqueryAsset,需要去config/main.php中配置assetManager: