标签归档 Magento 开发

通过清心醉

Magento 开发实例四(模型Model)通过表单添加数据

:项目名称由Qxz改为Mage

前面说了我们可以通过页面ID获取数据,对于对SQLModel操作,最重要的莫过于增删改查了。由于资源配置的失败,导致无法进行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版本中,这个规则已经被弱化,为了实现PHPArrayAccess”接口

$id=$blog->[‘id’];

$blog->[‘id’]=25;

//etc…

 

 

Magento模型的数据保存在_data”属性中,这个属性是protected”修饰的。父类Varian_Object”定义了一些函数用来取出这些数据。

 

前一篇说模型基础的时候,作者使用了$blog->getData();

当然也可以$blog->getData(‘name’);来获取指定idname的值

 

然后说说适配器,也就是实现读写分里

 

例子中,我们已经可以从数据库中取数据了,但是我们却没有为资源模型设置读写适配器,怎么回事呢?原因很简单,那就是因为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_writemymodule_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(自增、主键),namephone

所以我们要提取全部的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的操作,比如文中的添加的namephone

 

我想在视图里调用出来,又该如何操作呢?

 

这几天在进行资源配置安装因为老出错,所以浪费了些时间

 

需要在视图进行调用的话,就需要使用Block的块功能了,具体的下文分享!