在PHP的Yii框架的使用一些错误的解决方法和建议
在1中引入js和CSS文件。Yii。
让我们从最简单的问题开始。这不是问题,它只是一个语法,我们假设js和受保护的文件放在js文件夹的同一层,CSS和受保护的文件放在CSS文件夹的同一层,好的,这是规范…我们可以在相应的视图界面中按照下面的文字编写,参数css和js函数是不一样的。哦...(这是因为一个小时之前)。
注册js文件的第二个参数是JS的位置,可选三:cclientscript::在cclientscript头部pos_head::在cclientscript开始对身体pos_begin::在身体的末端pos_end,没有特殊要求不填…注册CSS文件的第二个参数是介质,而且对这里的学生感兴趣,现在默认是好的…
JS如jQuery,registercorescript的使用不会导致莫名其妙的错误…
文件
Yii::APP()->注册-> registerscriptfile(Yii应用程序::()-> URL地址。' / / project1 js js,cclientscript::pos_head);
css文件
Yii::APP()->注册-> registercssfile(Yii应用程序::()-> URL地址。' / / CSS的CSS项目。);
jQuery文件
Yii::APP()->注册-> registercorescript('jquery);
2。一isnewrecord修复
Yii模型的isnewrecord属性是非常有用的,可以在一个基于该属性的分情况讨论。然而,如果我们开始交易机制或其他情况下,数据的插入和回滚。当时,有数据库中没有记录,但isnewrecord是假,即它不是一个新的记录。解决的办法是使用主键访问数据库以确定它是否是一个新的记录或没有,在我们使用这个属性,我们应该处理它的下面。下面的模型后,和主键ID:
如果(!元模型-> isnewrecord)
{
db_exist美元=后::模型()-> findbypk(元模型-> ID);
如果($ db_exist = null)
为模型-> isnewrecord =真;
}
3。Yii产生隐藏的输入字段
虽然很容易编写一个输入字段(不显示:无),有时不能通过Yii的形式编码格式支持。不管怎样,只要一句话。
HiddenField(元模型,'name');>
isnewrecord)echo $形式->隐藏域(元模型,'path,阵列('size= > 60,'maxlength= > 128,'id' = > 'path1 '));
4。一代的下拉菜单
很多时候我们在形式上需要一个下拉菜单,和Chtml的列表数据是很好的在这个时候。如果在我们的数据库中只有很少的领域是可能的,如0和1,可以写在下面:
echo $表-> DropDownList(元模型,'is_marry,阵列(0= >‘没有',‘= >)));
在这个时候,你看到的是是否下拉菜单中,选择是的时候,这场被提交,现场是1,没有0。当然,往往不仅简单,我们可以添加一个功能模型来生成下拉菜单的数组,然后把它称之为观。这个函数可以写入数据本身或在数据库中找到。使用下面列表数据,具体的意思是,在模型的ID作为键,名称值。
以模型形式写的**
公共功能getuseroptions()
{
模型:模型:美元=用户()->所有();
模型:模型:美元=用户()-> findallbyattributes(阵列('is_regeister'=>1));
返回chtml::列表数据(合模型,'id','name');
}
在视图中编写的接口
echo $表-> DropDownList(元模型,'user_id ',用户::模型()-> getuseroptions()));
5。一打开交易机制
当您保存对数据库记录的同时,你可能需要打开交易机制,一开一个交易机制,它是很容易的,只要三句就够了。
开放事务机制。
美元交易= Yii应用::()->数据库->开始();
尝试
{
提交的成功
$事务>提交();
}
catch(例外E)
{
$事务>回滚();
}
像这样更完整:
如果($ _post { 'modela})
{
开放事务机制。
美元交易= Yii应用::()->数据库->开始();
尝试
{
*这里省略了一堆逻辑。
元模型->保存();
60美元->保存();
提交的成功
$事务>提交();
美元->重定向(阵列(','id' = > $模型-> ID));
}
catch(例外E)
{
$事务>回滚();
}
}
但我一般都会像下面这样,我的经验有什么好处…
如果($ _post { 'modela})
{
开放事务机制。
美元交易= Yii应用::()->数据库->开始();
尝试
{
$验证=真;
*这里省略了一堆逻辑。
有效期=美元美元模型->保存();
验证$ =有效的$验证;
在这里继续逻辑省略号
有效= $ 60美元->保存();
验证$ =有效的$验证;
提交的成功
如果(验证)
{
$事务>提交();
美元->重定向(阵列(','id' = > $模型-> ID));
}
其他的
{
成功不是回滚。
$事务>回滚();
}
}
catch(例外E)
{
$事务>回滚();
}
}
6。关联表查询同一字段错误。
有时我们构建两个表,但是这两个表具有相同的字段。当我们寻求与cdbcriteria相关的查询,如果没有额外的设置,会出现查询错误,这可能意味着MySQL语句模糊。在这个时候,我们建立了一个别名在主桌,然后检查相关领域和添加名字的线。
例如,两个模型、一个帖子和一个用户都有一个ID,我们可以写如下:
标准=新cdbcriteria美元;
标准;
$标准-> =阵列(用户的);
$标准->比较('post。ID,$ POST -> ID,真的);
元:=;
7。文件上传
这不一,基本上是原生的HTML和PHP,懒得分,就把它放在这里。
以下是HTML,对您自己的URL、ID和名称的操作是由您自己定义的。
文件上传
这是服务器端接收和保存文件的代码,文件最后保存在所附文件夹的文件夹中:
如果(isset($ _files { 'file1 ' }))
{
xlsfile美元美元'file1_files { } =;
tmp_name美元美元'tmp_namexlsfile { } =;
获取文件名
file_name美元= basename($ xlsfile_name);
如果($ xlsfile {错误} > 0)
{
文件上传错误!请再试一次。;
出口;
}
其他的
{
如果(file_exists ( / / 附TMP。$ file_name))
文件已经存在!这一次不会被保存!;
其他的
{
如果(!is_dir(连接 / / tmp))
{
创建一个新文件夹,默认权限为777,真正的意思是您可以通过递归创建。
如果(!mkdir(连接 / / TMP
{
找不到附加的文件夹,并创建一个失败!;
出口;
}
}
此函数仅用于移动文件上传文件。
move_uploaded_file($ tmp_name,连接 / / 差。file_name美元);
}
}
}
以下是当前日期的文件夹,将现有文件从old_file路径/文件相同的连接将这里命名
创建一个文件夹
日期=日期('y-m-d美元,时间());
美元str_replace日期=(-,$日);
$;
如果(!is_dir($dir))
{
如果(!mkdir($迪尔,0777,真的))
{
退出(无法创建文件夹!);
}
}
移动文件
file_name美元= basename($ old_file);
为完成=重命名(old_file美元美元美元,迪尔。file_name);
如果(!为完成)
{
退出(无法移动文件!);
}
8.yii场景和安全领域
看看当前的模型场景:
var_dump(元模型->情景);
查看现场的安全领域,安全领域意味着数据不会被过滤掉的Yii当用户提交它。发现有些网站上提交的东西都是他们中的一些人,并花了很长时间才知道的,部分是在现场现场过滤。
ARR为美元美元模型-> getsafeattributenames(元模型->情景);
var_dump($ ARR);
强制分配避免了规则过滤field.setattributes被迫取消一安全过滤,只要二参数分配错误的。但这只能是有效的模型。如果要筛选已定义的所有字段,则需要定义场景,然后在规则中指定安全字段。
如果(isset($ _get { 'po ' }))
元模型-> setattributes($ _get { 'post},假);
检查日期格式合法性
有时我们需要检查用户填写的日期是否合法,我们可以使用以下功能。
功能checkdatetime(美元美元中,格式=当前H:我:)
{
$时间= strtotime(合中);
checkdate美元(美元=日期格式,为时间);
返回的checkdate = = $中;
}
Yii绘制多模型
我相信新手会觉得奇怪。在_form形式绘制一个模型,然后提交给控制器保存数据。如果我们想渲染多个模型,我们该怎么做
接下来,我们假设有两个模型类,即人和地址分别。我们要做的就是在一个人_form渲染几个地址模式,这意味着一个人可以有几个地址。基本的想法很简单,就是你定义的渲染模型的控制器,然后将其发送给视图界面,最后收到数据后在控制器的主要问题。是写法律,我相信以下都是可以理解的,和有问题的童鞋留言。
在控制器中。
新的人;
地址模式 / * $地址存储阵列,把你做的。
地址=阵列(美元);
如果(isset($ _post { 'person ' }))
{
元模型->属性= $ _post { 'person};
*这里省略了一堆逻辑。
foreach($ _post { 'addr'} one_addr美元)
{
$地址=新地址();
$地址->属性= $ one_addr;
*这里省略了另一堆逻辑。
}
}
美元->渲染('创建的阵列(
模型= $模型,
地址= > $地址,
));
在视图中。
可以输出多个模型
Num =数美元($地址);
($ i = 0;$ i;
{
echo $表-> labelex($地址{我},{ { $我} }邮编);
echo $表-> TextField($地址{我},{ { $我} }邮编
…;
}
也可以通过数字指定模型*的输出。
echo $表-> labelex($地址{ 0 },{ 0 }邮编);
echo $表-> TextField($地址{ 0 },{ 0 }邮编