4廣播、電視媒體特性分析_第1頁(yè)
4廣播、電視媒體特性分析_第2頁(yè)
4廣播、電視媒體特性分析_第3頁(yè)
4廣播、電視媒體特性分析_第4頁(yè)
4廣播、電視媒體特性分析_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、深入理解magento -第四章-模型和orm基礎(chǔ)深入理解magento作者:alan storm番羽譯:hailong zhang第四章-模型和orm基礎(chǔ)對(duì)于任何一個(gè)mvc架構(gòu),模型(model)層的實(shí)現(xiàn)都是占據(jù)了很大一部分。對(duì)于magento 來(lái)說(shuō),模型占據(jù)了一個(gè)更加重要的位置,因?yàn)樗30艘徊糠稚虡I(yè)邏輯代碼(可以說(shuō) 它對(duì),也可以說(shuō)它錯(cuò))。這些代碼在其他的mvc框架中往往出現(xiàn)在控制器或者幫助函數(shù)中。傳統(tǒng)的phpmvc架構(gòu)中的模型本來(lái)mvc的定義就不是很清晰,不同的人有不同的看法,而對(duì)于模型的定義爭(zhēng)議就更多了。 在mvc模式被廣泛采用z前,php程序員往往通過(guò)sql語(yǔ)句直接操作數(shù)據(jù)庫(kù)。也

2、有些程 序員通過(guò)一個(gè)sql抽彖層來(lái)操作數(shù)據(jù)庫(kù)(比如adodb)0程序員往往關(guān)注sql語(yǔ)句本身, 而不是和數(shù)據(jù)相關(guān)的對(duì)象。雖然直接操作sql的方式一直被病詬,但是很多php框架還是以sql為中心的。模型層 提供了一系列對(duì)象,抽象/封裝了數(shù)據(jù)操作,但是程序員最終還是需為模型層對(duì)象寫sql 語(yǔ)句操作數(shù)據(jù)庫(kù)。還有一些框架冋避了 sql,使用了對(duì)象關(guān)系映射(object relational mapping, orm)來(lái)解 決這個(gè)問(wèn)題。使用這個(gè)方法的話,程序員不用關(guān)注sql,而只需要和對(duì)象打交道。我們可 以操作一個(gè)對(duì)象的屬性,當(dāng)“save"方法被調(diào)用的時(shí)候,對(duì)象的屬性會(huì)作為數(shù)據(jù)自動(dòng)的被寫 入數(shù)

3、據(jù)庫(kù)。有些orm框架會(huì)根據(jù)數(shù)據(jù)表的信息自動(dòng)推測(cè)對(duì)象的屬性,也有框架要求用戶顯 示的生命對(duì)象屬性和表的關(guān)系。比較有名的orm框架有activerecord等等?!咀g者注: activerecord 源自 ruby on rails,不過(guò)現(xiàn)在 php 也有了 】關(guān)于orm的概念,我就解釋到這里。但是和許多計(jì)算機(jī)領(lǐng)域的其他概念一樣,orm的定 義也越來(lái)越模糊了。我不想在這片文章中討論關(guān)于orm的爭(zhēng)議,所以我說(shuō)的orm就是 那個(gè)最基本的orm概念。magento的模型magento理所當(dāng)然的也追隨潮流應(yīng)用了 orm。雖然magento自帶的zend框架提供了 sql 抽象層,但是在大多數(shù)情況下我們將通

4、過(guò)magento自帶的模型和我們自己的模型來(lái)進(jìn)行數(shù) 據(jù)訪問(wèn)。他和視圖層(view) 樣,magento的模型層也不是簡(jiǎn)單的orm,而是一個(gè)高度 靈活,高度抽象甚至有點(diǎn)令人費(fèi)解。解剖magento的模型大部分的magento模型分為兩類。第一類是基本的activerecord類型,一張表一個(gè)對(duì)彖的 模型。第二類是entity attribute value (eav)模型?!咀g者注:eav翻譯成“實(shí)體屬性值”有 點(diǎn)詞不達(dá)意,還是就叫eav的好magento自己定義了一個(gè)數(shù)據(jù)類型叫做模型集合(model collection)o顧名思義,模型集合就是一個(gè)對(duì)象里面包含了很多模型對(duì)象。magento的

5、創(chuàng)造 者varien團(tuán)隊(duì)實(shí)現(xiàn)了 php類庫(kù)的標(biāo)準(zhǔn)接口,“itenitoraggregate", "countable"。這樣模型集 合就能調(diào)用這些方法,這也是模型集合和數(shù)組的區(qū)別。magento的模型并不直接訪問(wèn)數(shù)據(jù)庫(kù)。每一個(gè)模型都有一個(gè)資源模型(resource model),每 一個(gè)資源模型擁有兩個(gè)適配器(adapter), 個(gè)讀,一個(gè)寫。這樣的話邏輯模型和數(shù)據(jù)庫(kù)訪 問(wèn)就分開了,所以從理論上講更改底層數(shù)據(jù)庫(kù)只需要重寫適配器就可以了,所有上層代碼 都不需要更改。創(chuàng)建一個(gè)基本模型【譯者注:從這一章開始我用我自己的例子替換了 alan的例子】繼續(xù)我們hello wo

6、rld的例 子。在 hello world 模塊屮創(chuàng)建 blogcontroller.php 如下class zhlmmc_hehoworld_blogcontroner extends mage_core_controller_front_action public function indexaction()echo 'hello blog'訪問(wèn)以下url/magento/helloworld/blog 你應(yīng)該看到"hello blog”輸出。創(chuàng)建數(shù)據(jù)表我們可以通過(guò)magento自帶的方法創(chuàng)建或者修改數(shù)據(jù)庫(kù),但是為了不引入過(guò)多新內(nèi)容,

7、我 們暫且手工創(chuàng)建一張表。在你的數(shù)據(jù)庫(kù)屮執(zhí)行以下語(yǔ)句create table、blog_posts' ('blogpost_id' int(ll) not null auto_increment,'title' text,'post' text,'date' datetime default null,'limestamp' timestamp not null default current_timestamp,primary key ('blogpost_id');insert into

8、 'blog_posts' values (l;my new title':this is a blog post,*2009-07-01 00:00:0072009-07-02 23:12:30');這里我們創(chuàng)建了一張名為“blog_posts”的表,并填充了一條數(shù)據(jù)。創(chuàng)建模型要設(shè)置一個(gè)模型一共有以下四個(gè)步驟1啟用模型2啟用資源模型3在資源模型中添加實(shí)體(entity)。對(duì)于簡(jiǎn)單的模型來(lái)說(shuō),實(shí)體就是數(shù)據(jù)表的名字4 為資源模型設(shè)置讀、寫適配器在進(jìn)行這些步驟之前,我們先來(lái)看假設(shè)這些步驟已經(jīng)做完了,我們?cè)趺从靡粋€(gè)模型。在 magento中,我們用以下的方式來(lái)實(shí)例化一

9、個(gè)模型$model = mage:getmodel('helloworld/blogpost');和我們以前講過(guò)的“mage:gethelper()"的原理類似,這里magento也是通過(guò)全局配置去查找 模型的類名。模型的類名和我們以前講過(guò)的塊類名一樣,都是分組類名。這里參數(shù)的前半 部分“helloworkt是組名(gro叩name),后半部分“blogpost”是半類名(class name)【譯者 注:我將"class name"翻譯成半類名是為了和類名區(qū)分開來(lái)】。具體步驟如下5 從全局配置 “/global/models/group_name

10、/class” 獲得基本類名 <<zhlmmc_helloworld_moder,6 檢查全局配置47global/models/group_name/rewrite/class_name,是否設(shè)置,如 果有那么這個(gè)節(jié)點(diǎn)的值將被作為類名實(shí)例化7否則,最終的類名將是基本類名加上半類名,也就是 uzhlmmc_helloworld_model_blogposf,啟用模型修改模塊的config.xml<global><!-.-><models><helloworld><class>zhlmmc_helloworld_modei&

11、lt;/class><!-need to create our own resource, can't justuse core_mysql4-><resourcemodel>helloworld_mysql4</resourcemodel></helloworld></models><!-.-></global>標(biāo)簽<helloworld />就是組名,也應(yīng)該和模塊名一致。<class />標(biāo)簽的內(nèi)容是基木類名,所 有helloworld模塊的模型都用這個(gè)基本類名,命名方

12、式如下package name_module name_model<resourcemodel />標(biāo)簽指明了這個(gè)模塊的模型要用哪個(gè)資源模型。這個(gè)標(biāo)簽的內(nèi)容是組名 加上“mysql4”我們將在后面詳細(xì)介紹資源模型?,F(xiàn)在讓我們來(lái)實(shí)例化一個(gè)模型看看,修改indexaction方法public function indexaction() sblogpost = mage:getmodel('helloworld/blogposf);echo get_class($blogpost);清空magento緩存,刷新頁(yè)面,你應(yīng)該看到一個(gè)類似這樣的異常(請(qǐng)先打開magento的旺 發(fā)模

13、式)include(zhlmmchelloworldmodelblogpost.php)<ahref='function.include,>function.include</a>: failed to open stream: no such file or directory原因很簡(jiǎn)單,就是magento嘗試去實(shí)例化<<zhlmmc_helloworld_model_blogpost,但是它 在helloworld模塊的文件夾里面找不到這個(gè)類。所以我們現(xiàn)在來(lái)創(chuàng)建這個(gè)類file: app/code/local/zhlmmc/helloworld/m

14、odel/blogpost.php class zhlmmc_helloworld_model_blogpost extends mage_core_model_abstractprotected function _construct()$this->_init('helloworld/blogpost');刷新頁(yè)面,你應(yīng)該看到頁(yè)面上顯示<4zhlmmc_helloworld_model_blogposr°所有的模型都 必須繼承"magc_corc_modcl_absu*acr類。這個(gè)抽象類強(qiáng)制你實(shí)現(xiàn)一個(gè)方法“_constnjcf'(注

15、 意:這個(gè)不是php的構(gòu)造行數(shù)“_consmic(”)。這個(gè)方法應(yīng)該調(diào)用父類已經(jīng)定義好的 方法,參數(shù)是資源模型的uri,也就是我們要告訴模型使用哪個(gè)資源模型。我們將在解釋 資源模型的吋候再解釋這個(gè)url啟用資源模型并添加實(shí)體好了,我們?cè)O(shè)置好了模型,下面我們要為模型設(shè)置資源模型。資源模型才是真正和數(shù)據(jù)庫(kù)對(duì) 話的組件。在模型的配置中,有一段這樣的代碼<resourcemodel>helloworld_mysql4</resourcemodel><resourcemodel />的值將被用來(lái)實(shí)例化資源模型。我們不需要顯式的調(diào)用資源模型,但是 當(dāng)一個(gè)模型需要訪問(wèn)數(shù)據(jù)

16、庫(kù)的吋候,magento會(huì)自動(dòng)實(shí)例化一個(gè)資源模型來(lái)使用。mage:getresourcemodelchehoworld/blogposf);這里tthelloworld/blogposf,就是我們給模型的傳入的參數(shù)?!癶elloworld”是組名, "blogpost"是模 型的半類名 o<4mage:getresourcemodef,方法將以"helloworld/blogpost*'為 uri 在全局配置屮找至lj<resourcemodel>標(biāo)簽的值,在這里是“hellowoi'ld_mysql4”。然j3 magento

17、會(huì)用uri“hellowohd_mysql4/blogpost"去實(shí)例化資源模型類。實(shí)例化的過(guò)程和我們前血講的 模型的實(shí)例化是一樣的,所以我們也需要在config.xml中添加資源模型的聲明<global><!-.-><models><!-.-><hellowoiid_mysql4><ciass>zhlmmc_helloworld_model_resource_mysql4</class> </helloworld_mysq 14></models></global>

18、;這里我們可以看到,資源模型的聲明也是放在<models />下面的。有點(diǎn)搞,但是也不必深究 了,magento就這么定義的。<class />標(biāo)簽的值是所有資源模型類的基本類名,命名方式如 下packagename_modulename_model_resource_mysql4好了,我們已經(jīng)配置了資源模型,我們來(lái)試試裝載一些數(shù)據(jù)。修改indexaction 下 public function indexaction() $params = $this->getrequest()->getparams();$blogpost = mage:getmodel

19、chelloworld/blogposf);echo(hloading the blogpost with an id ofh.sparamst'id1.f,<br/>n);$blogpost->load($params,id,);$data = $blogpost->getdata();var_dump($data);清空magento緩存,訪問(wèn)下而的頁(yè)面http:/l /magento/helloworld/blog/index/id/l你應(yīng)該看到一個(gè)類似下面這樣的異常include(zhlmmchelloworldmodelresource

20、mysql4blogpost.php) function.include: failed to open stream: no such file or directory我想你看到這里也明白了,我們要為模型添加一個(gè)資源類,添加如下文件file: app/code/local/zhlmmc/helloworld/model/resource/mysql4/blogpost.phpclasszhlmmc_hehoworld_model_resource_mysql4_biogpostextendsmage_core_model_mysql4_abstractprotected function

21、_construct()$this->_initchelloworld/blogpost blogpost_ict);這里“_inf方法的笫一個(gè)參數(shù)這個(gè)資源模型將要使用的數(shù)據(jù)表的ur1,第二個(gè)參數(shù)是數(shù)據(jù) 表中的列名。這個(gè)列的內(nèi)容必須唯一,往往是數(shù)據(jù)表的主鍵。為資源模型添加實(shí)體刷新頁(yè)面,你是不是得到下面的異常?can't retrieve entity config: helloworld/blogpost那是因?yàn)槲覀兊馁Y源文件現(xiàn)在還是一個(gè)空殼,并沒有和數(shù)據(jù)庫(kù)聯(lián)系起來(lái)?,F(xiàn)在我們來(lái)把資 源模型和我們的表聯(lián)系起來(lái),修改config.xml如下<global><!-.-

22、><models>v!一><helloworld_mysql4><class>zhlmmc_helloworld_modelresource_mysql4</class> <entities><blogpost><table>blog_posts</table></blogpost></entities></helloworld_mysql4></models></global>我們前面設(shè)置了資源模型使用的數(shù)據(jù)表的uri是“he

23、lloworld/blogpost",那么magento會(huì)把 “helloworld”作為組 名,“blogpost”作為實(shí)體名,也就是<blogpost>e在magento的簡(jiǎn)單模型 中(也就是繼承mage_core_model_mysql4_abstract的模型),一個(gè)實(shí)體對(duì)應(yīng)一張數(shù)據(jù)表。 我們的數(shù)據(jù)表是“blog_posts”,所以這 里vtable/>標(biāo)簽的內(nèi)容就是“blog_po$ts”。清空magento緩存,再次刷新頁(yè)面,你應(yīng)該看到以下內(nèi)容loading the blogpost with an id of 1array(5) nblogpost_i

24、d"=> string(l) "t* htitle"=> string(12) "my new title" npostm=> string(19) "this is a blog post*1 ndaten=> string(19) "2009-07-01 00:00:00n htimestampu=> string(19) "2009-07-02 23:12:30” 設(shè)置讀寫適配器在上面的例子屮,我們已經(jīng)可以從數(shù)據(jù)庫(kù)中取數(shù)據(jù)了,但是我們卻沒有為資源模型設(shè)置讀寫 適配器,怎么回事呢?

25、原因很簡(jiǎn)單,那就是因?yàn)閙agento會(huì) 為沒有適配器的資源模型啟用 默認(rèn)適配器。我們也可以顯式的配置默認(rèn)的適配器<global><!-.-><resources><helloworld_write><connection><use>default_write</use></connection></helloworld_write><hel loworld_read><connection><use>default_read</use>&l

26、t;/connection></helloworld_read></resources></global>在<resources/>標(biāo)簽下面有兩個(gè)部分,一個(gè)讀,一個(gè)寫。標(biāo)簽名字中的“hellwoiid"是我們定 義的組名【譯者注:在資源模型的"jnifpxi數(shù)中傳入的 數(shù)據(jù)表的uri <4helloworld/blogposf, 的前半部分就是適配器名字的前半部分】。從這里我們也可以看出來(lái)一個(gè)資源組對(duì)應(yīng)一對(duì)適 配器。清空magento緩存,刷新瀏覽器,你應(yīng)該看到和剛才相同的頁(yè)而?!咀g者注:如果你 去全局配置中找&q

27、uot;corejcead”你會(huì)發(fā)現(xiàn)udefault_read'然后是"default_setup”<default_setup><connection><model>mysql4</model><initstatements>set names utf8</initstatements><type>pdo_mysql</type><host>localhost</host> <username>root</usemame><p

28、assword>admin</password><dbname>zend-magento</dbname><active> 1 </active>v/conn ecti on></default_setup>這才是最終和數(shù)據(jù)庫(kù)連接的詳細(xì)信息。如果你再往下深究,你會(huì)發(fā)現(xiàn)全局配置有這么一段<resource><connection><types><pdo_mysql><class>mage_core_model_resource_type_db_pdo_m

29、ysql</class></pdo_mysql></types></connection></resource>所以,“mage_core_model_resource_type_db_pdo_mysql"才是最終連接數(shù)據(jù)庫(kù)的類。如果 我們更換數(shù)據(jù)庫(kù)的話,我們要重寫一個(gè)相似的類來(lái)連接別的數(shù)據(jù)庫(kù)?;灸P筒僮魉械哪P妥罱K都繼承自類“varien_object"。這個(gè)類屬于magento的系統(tǒng)類庫(kù),不屬于 magento的核心模塊。你可以在以下位置找到這個(gè)類lib/varien/object.phpmagento模型

30、的數(shù)據(jù)保存在“_data”屈性中,這個(gè)屬性是“protected”修飾的。父類 t4varian_objecf,定義了一些函數(shù)用來(lái) 取出這些數(shù)據(jù)。我們上面的例子用了<4getdata",這個(gè) 方法返回一個(gè)數(shù)組,數(shù)組的元素是“key/value”對(duì)。【譯者注:其實(shí)就是數(shù)據(jù)表中一行的數(shù)據(jù), “key"就是列名,“value”就是值】我們可以傳入一個(gè)參數(shù)獲取某個(gè)具體的“key”的值。$model->getdata();$model->getdata(,title');還有一個(gè)方法"getorigdata-,這個(gè)方法會(huì)返回模型第一次被賦予的值?!?/p>

31、譯者注:因?yàn)槟?型在初始化以后,值可以被修改,這個(gè)方法就是拿到那個(gè)最原始的值】$model->getorigdata();$model->getorigdata('title,);ttvarien_objecf,也實(shí)現(xiàn)了一些php的特殊兩數(shù),比如神奇的你可以對(duì)任何一個(gè)屈 性調(diào)用"get, set, unset, has*方法$model->gelblogpostid();$model->setblogpostid(25);$model->unsetblogpostid();if($model->hasblogpostid().這里的方法名中

32、的屬性名字符合“camelcase”命名規(guī)則【譯者注:簡(jiǎn)單的說(shuō)就是java的命 名規(guī)則,每個(gè)單詞的第一個(gè)字母大寫,第一個(gè)字母可以大寫也可以小寫】。為了有效的利用 這些方便的方法,我們?cè)诙x數(shù)據(jù)表列名的吋候要用小寫,并用下劃線作為分隔符,比如 “blogpost_id"。在最近的magento版本+1,這個(gè)規(guī)則已經(jīng)被弱化,為了實(shí)現(xiàn)php的 "airay access"接 口$id = $model->,blogpost_id'$model->,blogpost_id' = 25;/etc.也就是說(shuō),你會(huì)在magento中同時(shí)看到這兩種技巧

33、的使用。magento中的crud操作 magento 模型通過(guò)“l(fā)oad, save, delete"三個(gè)方法來(lái)支持基本的 create, read, update 和 delete 操作。我們?cè)谏厦嬉呀?jīng)使用過(guò)“l(fā)oad”方法了。這個(gè)方法的參數(shù) 就是要裝在的數(shù)據(jù)記錄的“id”。$blogpost->load(i);“save”方法j以用來(lái)創(chuàng)建新數(shù)據(jù)或者修改己有數(shù)據(jù)。我們?cè)赽logcontroller.php中添加如下 方法public function createnewpostaction() $blogpost = mageiigetmodekelloworld/blog

34、post1);$blogpost->settitle('code post!*);$blogpost->setpost(!this post was created from code!1);$blogpost->save();echo 'post created1;訪問(wèn)以下url/magento/helloworld/blog/createnewpost現(xiàn)在你數(shù)據(jù)表中應(yīng)該有兩條數(shù)據(jù)了。下面來(lái)修改一條數(shù)據(jù)public function editfirstpostaction() $blogpost = magegetmodelch

35、elloworld/blogpost1);$blogpost->load( 1);$blogpost->settitle(hthe first post!1');$blogpost->save();echo 'post edited1;最后,我們來(lái)刪除一條數(shù)據(jù)public function deletefirstpostaction() sblogpost = mage:getmodel(,helloworld/blogpost,);$blogpost->load( 1);$blogpost->delete();echo 'post rem

36、oved1;模型集合上面的例子我們只是演示了對(duì)單個(gè)數(shù)據(jù)操作,現(xiàn)在我們來(lái)看看如何同時(shí)操作多條記錄。我們 上面已經(jīng)講過(guò),每個(gè)magento的模型都有一個(gè)獨(dú)特的模型集合。這些模型集合實(shí)現(xiàn)了 php 的"iteratoraggregate"和"countable”接口,也就是他們可以作為“count”函數(shù)的參數(shù),并 且可 以在“for each%吾句中使用?,F(xiàn)在讓我們來(lái)看看如何使用模型集合,在blog控制器中添加如下方法public function showahblogpostsaction() sposts = mage:getmodel(,helloworld/blogpost')->getcollection();foreach($posts as $blog_post)echo ,<h3>'.$blog_post->gettitle().'</h3>,;echo nl2br($blog_post->getpost();訪問(wèn)如下ur

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論