注:项目名称由Qxz改为Mage
前面说了我们可以通过页面ID获取数据,对于对SQL的Model操作,最重要的莫过于增删改查了。由于资源配置的失败,导致无法进行EAV的测试。作者以基础模型来例来实现点增删改查。
基本模型操作
所有的模型最终都继承自类“Varien_Object”。这个类属于Magento的系统类库,不属于Magento的核心模块。你可以在以下位置找到这个类
lib/Varien/Object.php
“Varien_Object”也实现了一些PHP的特殊函数,比如神奇的“__call”。你可以对任何一个属性调用“get, set, unset, has”方法(比如我们要调用表内的ID字段)
$blog->getId();
$blog->setId(1);
$blog->unsetId();
if($blog->hasId()){…}
为了有效的利用这些方便的方法,我们在定义数据表列名的时候要用小写,并用下划线作为分隔符,比如“id”。在最近的Magento版本中,这个规则已经被弱化,为了实现PHP的“ArrayAccess”接口
$id=$blog->[‘id’];
$blog->[‘id’]=25;
//etc…
Magento模型的数据保存在“_data”属性中,这个属性是“protected”修饰的。父类“Varian_Object”定义了一些函数用来取出这些数据。
前一篇说模型基础的时候,作者使用了$blog->getData();
当然也可以$blog->getData(‘name’);来获取指定id的name的值
然后说说适配器,也就是实现读写分里
例子中,我们已经可以从数据库中取数据了,但是我们却没有为资源模型设置读写适配器,怎么回事呢?原因很简单,那就是因为Magento会为没有适配器的资源模型启用默认适配器。我们也可以显式的配置默认的适配器
<resources>
<mymodule_write>
<connection>
<use>core_write</use>
</connection>
</mymodule_write>
<mymodule_read>
<connection>
<use>core_read</use>
</connection>
</mymodule_read>
</resources>
#如果有配置资源,也写在<resources></resource>节点里。
我们看到有两个新的标签节点:mymodule_write和mymodule_read一个读,一个写。
我们来给Blog执行控制器增加inster的方法来尝试写入数据库:。
首先说说我们用SQL命令创建的表
包含3个字段
ID(自增)产品品种,name,phone 在这里ID因为是自增的关系,所以不需要进行写入数据:
我们再看看inster的方法:
$blog=Mage::getModel(‘mymodule/blog’); #实例模型
$blog->setName(‘电话号码‘); #name字段的值
$blog->setPhone(‘13823811’); #phone字段的值
$blog->save(); #写入
echo “数据写入完成!”;
#请确保页面是UTF-8格式,否则写入乱码!
这些,对数据的增加我们就有一定的了解了吧。
我们在修改Index控制器的表单,自己创建个表单,然后数据交给Blog控制器的forminster()方法
class Mage_Mymodule_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction() #默认方法
{
$this->loadLayout();
$this->renderLayout();
}
Index控制器里我们直接调用布局了,所以我们直接修改布局吧
跟踪mymodule_index布局文件
<mymodule_index_index>
<reference name=”root”>
<block type=”page/html” name=”root” output=”toHtml” template=”mymodule/index.phtml”/>
</reference>
</mymodule_index_index>
可以看到我们使用的模板是index.phtml,直接在这里加个表单吧(template)目录里
<form action=”<?php echo $this->getUrl(‘mymodule/blog/forminster’); ?>” method=”post”>
<p>名字::<input type=”text” name=”name” /></p>
<p>电话::<input type=”text” name=”phone” /></p>
<input type=”submit” name=”添加” />
</form>
在这里,我们form表单提交的URL已经很明显了
提交到mymodule模块的blog控制器里的forminster方法中
function forminsterAction() #表单POST调用写入数据
{
#在这就不对数据进行是否空值等判断了
$data=$this->getRequest()->getPost(); #获取POST过来的数据
#注意到了这里是数组了哦
#echo $data[‘name’].”</br>”.$data[‘phone’];
$blog=Mage::getModel(‘mymodule/blog’); #实例模型
$blog->setName($data[‘name’]); #name字段的值
$blog->setPhone($data[‘phone’]); #phone字段的值
if($blog->save()) #如果写入成功
{
#调用布局
$this->loadLayout();
$this->renderLayout();
#这时候我们需要给该方法写个布局,local.xml里增加个
/*在这里我们调用的视图里,只是提示写入数据成功并且输入的参数
要么在视图里实例Model,直接视图里操作,不过这就不符合MVC了.
为此我们新创建一个ceshiAction()的方法,下一次会讲解。
*/
}
else
{
echo “error_forminsterAction”;
}
}
这样就可以写入了。当然这是没有进行数据判断的,save()的方法是否安全也要看下核心源码,还有一个是作者的phone字段用的是int(16),测试的时候别写太长或者修改为text吧。
save()用于新增和修改数据
如果我们需要修改
上面加多个
$blog->load(‘主键值’);
所以接下来我们就要修改数据了。前面插入和提取数据我们可以看出问题点:都是对单一的操作。如果要修改数据,那么肯定是要先获取表内指定的数据。
以往的mysql的操作都是读取数据集,在通过fro等方式进行循环输出数据,进行修改。
因为我们的字段只有id(自增、主键),name,phone
所以我们要提取全部的name,phone进行修改,form_insterAction()的方法已经很清楚的告诉我们获取POST数据来写入,上文作者说的提取,是根据指定ID
如果我们在方法里加多个
$data=$this->getRequest()->getPost(); #获取POST过来的数据
#注意到了这里是数组了哦
#echo $data[‘name’].”</br>”.$data[‘phone’];
$blog=Mage::getModel(‘mymodule/blog’); #实例模型
#$blog->load(1); #修改主键为1的
$blog->setName($data[‘name’]); #name字段的值
$blog->setPhone($data[‘phone’]); #phone字段的值
如果我们使用了blog->load(1)的话,就是指定修改主键id=1的了,因此我们需要通过循环提取数据集,POST多个隐藏的主键ID过来(为什么说隐藏,因为ID一般我们都不进行输出的)
到此为止,一个写入数据库的表单操作就这么完成了。
现在还有一个问题:
如果在控制器中执行了SQL的操作,比如文中的添加的name和phone
我想在视图里调用出来,又该如何操作呢?
这几天在进行资源配置安装因为老出错,所以浪费了些时间
需要在视图进行调用的话,就需要使用Block的块功能了,具体的下文分享!
关于作者