首页 数据库 mysql教程 Magento 1.8 Development 第六章:数据库和模块

Magento 1.8 Development 第六章:数据库和模块

Jun 07, 2016 pm 03:36 PM
magento 数据库

在这一章,我们将学习一下内容: 注册资源模型 注册资源连接 安装和升级脚本 创建一个单一的表模型 使用Magento Collection来查询数据 介绍 在上一章,我们学习了怎么Magento数据库是怎么工作的,我们如何连接数据库并且如何跟数据库交互。 在这一章, 我们

在这一章,我们将学习一下内容:

       注册资源模型

       注册资源连接

      安装和升级脚本

      创建一个单一的表模型

      使用Magento Collection来查询数据

介绍

在上一章,我们学习了怎么Magento数据库是怎么工作的,我们如何连接数据库并且如何跟数据库交互。

在这一章,我们将把我们上一章学习的知识去执行一些更实际的任务。我们将让我们第4章创建的模块与数据库的交互。

我们将创建Magento模块和一个与之交互的数据表


注册资源模型

我们要做的第一步就是注册资源模型,编写资源模型来与数据库进行业务逻辑的交互。

准备工作

我们必须在config.xml 文件中添加另外的配置块.打开 app/code/local/Packt/Helloworld/etc/config.xml 文件

怎么做

下面一步步来分析怎么在Packt_Helloworld模块中来注册资源模型

<global>
	<blocks>
		<helloworld>
			<class>Packt_Helloworld_Block</class>
		</helloworld>
	</blocks>
	<helpers>
		<helloworld>
			<class>Packt_Helloworld_Helper</class>
		</helloworld>
	</helpers>
	<models>
		<helloworld>
			<class>Packt_Helloworld_Model</class>
		</helloworld>
		<helloworld_resource>
			<class>Packt_Helloworld_Model_Resource</class>
		</helloworld_resource>
	</models>
</global>
登录后复制

3、创建文件夹 app/code/local/Packt/Helloworld/Model/Resource

        <models>
		<helloworld>
			<class>Packt_Helloworld_Model</class>
		</helloworld>
		<helloworld_resource>
			<class>Packt_Helloworld_Model_Resource</class>
		</helloworld_resource>
	</models>
登录后复制


5、使用wiz命令行工具测试你的配置

wiz devel-models | grep helloworld

你现在将看到如下输出:

Magento 1.8 Development  第六章:数据库和模块

上面的命令将显示所有与helloworld想匹配的注册的模块。

它是如何工作的

这个Magento模型使用了业务逻辑,例如,通过一个观察者模式包含的函数可以调用事件或者定时任务。

一个Magento对象能够代表一个实体,比如一个产品、客户和分类。这个模型代表一个实体通过继承Mage_Core_Abstract类。这个类有使用资源模型的逻辑。例如,save()函数在这个类里面已经定义好了。

当你在Mage_Core_Model_Abstract类中看到save()函数,你会看到它调用了getResource()函数,这个getResource()函数将返回一个资源模型的实体。

资源模型使用实体与数据库交互,Magento特定的业务逻辑都是通过这个实体来调用和操作。

如果你想获得一个资源模型实例,你可以使用Mage::getResourceModel()或者Mage::getResourcdeSingleton()方法去获得一个类的实例,我们可以通过Magento类名的的一个参数获得。


注册资源连接

在这一节,我们将在这个模块中配置read和write适配器。这些适配器在模型中用于连接数据库。

准备

下面我们将一步一步在Packt_Helloworld模块中创建read和write连接:

<resources>
	<helloworld_read>
		<connection>
			<use>core_read</use>
		</connection>
	</helloworld_read>
</resources>
登录后复制

<resources>
	<helloworld_write>
		<connection>
			<use>core_write</use>
		</connection>
	</helloworld_write>
	<helloworld_read>
		<connection>
			<use>core_read</use>
		</connection>
	</helloworld_read>
</resources>
登录后复制
3、完成上面步骤之后在后头清空cache

它是如何工作的

每一个模型在Magento中都分派了read和write适配器,默认的read适配器是core_read,默认的write适配器是core_write。

通常情况下,在Magento数据库中的表在models均使用core_read和core_write适配器进行操作。


更多...

你可以注册和配置一个特殊的数据库模型来连接其他的数据库,如果你打开下面的URL,你可以得到一个好的教你怎么做的教程:
http://www.solvingmagento.com/accessing-an-external-database-fromyour-magento-module/

sql安装和升级的脚本

如果你的模块使用的是自定义的数据库表,你需要在你的产品服务器上做一些改变。Magento会自动根据安装或更新脚本执行SQL。

在这里,我们将要扩展Packt_Helloworld模块的install脚本.这个install脚本将把属性添加到所有的产品中。

准备

在这里,我们将在模块的数据库文件夹中工作。从Packt_Helloworld模块中打开我们的数据库文件夹来写代码。

怎么做

下面将逐步描述在我们模块中创建安装脚本的过程:

<helloworld_setup>
	<setup>
		<module>Packt_Helloworld</module>
		<class>Mage_Eav_Model_Entity_Setup</class>
	</setup>
	<connection>
		<use>core_setup</use>
	</connection>
</helloworld_setup>
登录后复制
上面的代码将初始化一个名称为helloworld_setup的过程

2、在安装脚本中创建文件夹,这个文件夹名称在app/code/local/Packt/Helloworld/sql/helloworld_setup.

3、创建安装脚本,安装脚本的名称规则为install-<version_number_config_xml>.php.在我们的项目,这个脚本的名称是install-0.0.1.php.

4、添加下面的内容到文件中测试执行过程:

die('test');

5、在前台页面清除缓存和刷新页面,你将在页面看到test.

tips:一个安装或者升级脚本时会在安装时运行一次。这里的版本号每次都将注册设置到数据表core_resource中。当你想再次测试时运行脚本。你能够删除或者改变版本。

6、添加下面的内容到你的安装脚本,这里会安装一个属性到所有的可用产品中.

&lt;?php
$installer = $this;
$installer-&gt;startSetup();
	$installer-&gt;addAttribute('catalog_product', 'helloworld_label',
	array(
		'group' =&gt; 'Helloworld',
		'type' =&gt; 'varchar',
		'label' =&gt; 'Helloworld label',
		'input' =&gt; 'text',
		'global' =&gt; Mage_Catalog_Model_Resource_Eav_
		Attribute::SCOPE_STORE,
		'visible' =&gt; true,
		'required' =&gt; false,
		'searchable' =&gt; false,
		'filterable' =&gt; false,
		'comparable' =&gt; false,
		'visible_on_front' =&gt; true,
		'unique' =&gt; false,
		'apply_to' =&gt; 'simple,configurable,virtual,
		bundle,downloadable',
		'is_configurable' =&gt; false
	)
);
$installer-&gt;endSetup();
登录后复制

上面的代码将创建helloworld_label产品属性,这个属性将应用到所有的产品中。这个属性将在后台的在Helloworld选项卡的group选项中显示。

7、清理缓存和刷新页面,这个安装脚本将自动的运行。

8、到后台打开一个产品去检查属性是否在产品中添加,你将看到一个Helloworld选项卡的属性,它类似于下面的截图:


Magento 1.8 Development  第六章:数据库和模块

9、当你的安装脚本执行了,你能在Magento的core_resource表中看到你的设置。所有的模块和版本号都在这个表中,所以Magento知道安装或者升级脚本有没有执行。

它是怎么工作的...

你想在工作中改变一些你的数据结构使用安装脚本是有用的,可能是下面的一些目的:

    从你的开发/测试环境到你的生成环境使你的站点容易的开发

    力所能及的修复数据库

    对数据库修改的概述

$this对象在这个类的安装脚本中有声明,我们是在config.xml里面注册定义的。在这个项目里面,它是Mage_Eav_Model_Entity_Setup类,这个类主要用于你想去添加EAV属性到实体中,例如在这里的产品或者分类。主要的所有设置类都继承默认的设置类,在这里是,Mage_Core_Model_Resource_Setup.

如果你想在你的安装脚本中做很多的事情,你可以创建你自己的设置类,这将从普通的设置类中扩展。

在安装程序文件中这个类中声明的函数可以调用这个$this.

在模型中创建一个平面表

在这里,我们将扩展我们的模块和平面数据库表,我们将创建一个升级脚本和创建一个表的指令。当这个表创建,我们将通过添加所需的Magento模型、资源模型和集合来完成设置,我们将在Magento ORM中创建一个自定义Magento实体和所有的特性

准备

在这里,我们将要编码和数据库,打开你的IDE在模块文件夹和访问你的数据库客户端。

怎么做...

下面的步骤是创建一个数据表应用到相关联的Magento模型:

1、在app/code/local/Packt/Helloworld/etc/config.xml中配置表名。

&lt;helloworld_resource&gt;
	&lt;class&gt;Packt_Helloworld_Model_Resource&lt;/class&gt;
	&lt;entities&gt;
		&lt;subscription&gt;
			&lt;table&gt;helloworld_subscription&lt;/table&gt;
		&lt;/subscription&gt;
	&lt;/entities&gt;
&lt;/helloworld_resource&gt;
登录后复制

上面的代码将定义引用helloworld_subscription表的实体

3、创建升级脚本文件app/code/local/Packt/Helloworld/sql/helloworld_setup/upgrade-0.0.1-0.0.2.php

4、添加下面的代码到升级脚本文件,这个代码是创建表及其一些字段的命令

&lt;?php
$installer = $this;
$installer-&gt;startSetup();
$table = $installer-&gt;getConnection()-&gt;newTable($installer-&gt;getTable('helloworld/subscription'))-&gt;addColumn('subscription_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
	'identity' =&gt; true,
	'unsigned' =&gt; true,
	'nullable' =&gt; false,
	'primary' =&gt; true,
	), 'Subscription id')-&gt;addColumn('created_at', Varien_Db_Ddl_Table::
	TYPE_TIMESTAMP, null, array(
	'nullable' =&gt; false,
	), 'Created at')-&gt;addColumn('updated_at', Varien_Db_Ddl_Table::
	TYPE_TIMESTAMP, null, array(
	'nullable' =&gt; false,
	), 'Updated at')-&gt;addColumn('firstname', Varien_Db_Ddl_Table::TYPE_TEXT,64, array(
	'nullable' =&gt; false,
	), 'First name')
	-&gt;addColumn('lastname', Varien_Db_Ddl_Table::TYPE_TEXT,
	64, array(
	'nullable' =&gt; false,
	), 'Last name')
	-&gt;addColumn('email', Varien_Db_Ddl_Table::TYPE_TEXT,
	64, array(
	'nullable' =&gt; false,
	), 'Email address')
	-&gt;addColumn('status', Varien_Db_Ddl_Table::TYPE_TEXT,
	32, array('nullable' =&gt; false,'default' =&gt; 'pending',), 'Status')-&gt;addColumn('message', Varien_Db_Ddl_Table::TYPE_TEXT,'64k', array('unsigned' =&gt; true,'nullable' =&gt; false,), 'Subscription notes')-&gt;addIndex($installer-&gt;getIdxName('helloworld/subscription',array('email')),array('email'))-&gt;setComment('Helloworld subscriptions');
$installer-&gt;getConnection()-&gt;createTable($table);
$installer-&gt;endSetup();
登录后复制

5、清理缓存刷新前台页面,当你刷新你的数据库客户端的表时,你将看到helloworld_subscription表在列表中.
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言如何实现数据库的增删改查操作? Go语言如何实现数据库的增删改查操作? Mar 27, 2024 pm 09:39 PM

Go语言如何实现数据库的增删改查操作?

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

在PHP中使用MySQLi建立数据库连接的详尽教程

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片

Hibernate 如何实现多态映射? Hibernate 如何实现多态映射? Apr 17, 2024 pm 12:09 PM

Hibernate 如何实现多态映射?

MySQL与PL/SQL的异同比较 MySQL与PL/SQL的异同比较 Mar 16, 2024 am 11:15 AM

MySQL与PL/SQL的异同比较

深入解析HTML如何读取数据库 深入解析HTML如何读取数据库 Apr 09, 2024 pm 12:36 PM

深入解析HTML如何读取数据库

MySQL数据库管理系统的基本原理解析 MySQL数据库管理系统的基本原理解析 Mar 25, 2024 pm 12:42 PM

MySQL数据库管理系统的基本原理解析

PHP处理数据库中文乱码的技巧与实践 PHP处理数据库中文乱码的技巧与实践 Mar 27, 2024 pm 05:21 PM

PHP处理数据库中文乱码的技巧与实践

See all articles