用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3604|回复: 6
收起左侧

[讨论/交流] 請問一下多視圖組成的方法 ( multi view )

[复制链接]
发表于 2010-6-14 18:14:34 | 显示全部楼层 |阅读模式
請問一下多視圖的組成

有三個視圖
news_view.php
hot_view.php
main_view.php

看了論壇 2008 時的另一篇文章
http://codeigniter.org.cn/forums/thread-376-1-1.html
有前輩建議可以整合到同一個視圖
建立一個 view.php 一次呼叫這三個視圖

但這三個 view 都必須要靠運算給他不同的 資料才有辦法顯示
如:
$this->load->view("news_view"  , $news_array);
$this->load->view("hot_view"  , $hot_array);
$this->load->view("main_view"  , $main_array);

如果都放在 view.php 裡面
就必須要有邏輯運算產生資料  $news_array , $hot_array , $main_array
感覺將邏輯運算產生資料的程式碼寫在 view 裡面不是很好 , 好像應該寫在 cotroller 之類

2008 的文章回覆中有一個另外的建議 , 是以函式去呼叫資料
$this->load->view("news_view"  , getnews );
$this->load->view("hot_view"  , gethot );
$this->load->view("main_view"  , getmain );

看到這邊有疑問產生
1. 那這樣是要把 getnews , gethot  , getmain 放在某一個 helper 然後 view 再去 load->helper 進來是嗎?
2. 而且這些函式的回傳值必須是 array 或是 object 是嗎?
3. 如果是要讓日後好維護 , 還是要直接寫在 controller 就好?
发表于 2010-6-15 02:38:10 | 显示全部楼层
 楼主| 发表于 2010-6-15 11:33:33 | 显示全部楼层
回复 2# Hex

嗯 ~  看來這是目前最好的解法了,寫的真好
而且我使用 1.72 版本,可以正常呼叫

在最外部的 view 呼叫其他 module 進來

<?php $this->load->module('folder/test/home_made'); ?>
<?php $this->load->module('test2/home_made'); ?>

我覺得以這樣的程式架構下
開發時就把各功能都做成 module

最外全局的 MVC 就只是負責把各功能的 module 安排定位
而且還可以防止別人在外部直接URL訪問到包好的 module

感覺好像是多了一個 C + V 的上層結構
全局C -> 全局V ( 自有MVC )

不知道是不是可以這樣去應用 ?
发表于 2010-6-15 14:23:25 | 显示全部楼层
实际上 module 可以理解成“控件”的概念(不知道台湾是不是叫做控件,呵呵)
就是一个 module 有自己的 mvc,可以自成体系,呵呵。

PS: 我加了个简单的繁简转换,不知道你那里能不能使用?
 楼主| 发表于 2010-6-15 16:00:42 | 显示全部楼层
回复 4# Hex

呵呵  我也不知道台灣叫什麼
應該就是叫做模組吧
就一個模子裡面有很多東西像拼圖一樣拼起來

可能名字不太一樣
但中國字有好處都可以會意

我沒有看到簡轉繁的工具 ??
請問放在哪裡呢 ?

不過我看簡體越來越習慣了
以前好像很容易亂碼
現在很多人用 utf-8 編碼看起來都正常


另外
我看了 MY_Loder.php
第98行

        $class_name = str_replace(' ', '_', ucwords(str_replace('/', ' ', $path.$module.' '.$c))) . '_module';

class 的命名規則是
資料夾名_檔案名_module

這裡的命名規則跟原本的不太一樣
請問有什麼隱藏的秘密嗎?


哈哈  
因為我想說一開始經驗不好
可能不會知道某些程式其實適合當模組
所以會先寫在一般的 mvc
之後發現可以拿來當模組時
再把它直接剪下到 module 資料夾裏

不過這樣的話
我必須要回頭打開全部的檔案改所有的 class 名字

不知道如果我把
        $class_name = str_replace(' ', '_', ucwords(str_replace('/', ' ', $path.$module.' '.$c))) . '_module';
偷懶改成
        $class_name = $controller;

這樣雖然看起來好像不用重新命名
但不知道會不會對模組造成意外的錯誤 ?
发表于 2010-6-15 23:41:29 | 显示全部楼层
module 的名字是我规定的,没什么特殊的,只是为了不重名,因为 php 的类名都在全局名字空间下。
两个不同目录下的同名 module 如果不加目录前缀,就无法命名了,当然,你可以按照你自己的规范命名,呵呵。

PS: 你用的什么浏览器?繁简转换就在每层楼的上边。
 楼主| 发表于 2010-6-17 11:28:16 | 显示全部楼层
回复 6# Hex

了解了
原來是 namespace 的問題
不可以重複宣告 同樣的 class 名稱


我現在還沒有很懂 CI
我先跟著規則走就好了
等到比較懂了有需要的時候再看看要怎麼修改

接觸到現在都還在看手冊跟文件
沒有實際下去寫程式
等到看完要開始寫時
應該還有重重的考驗等著我...


我用 Firefox
我看到了,之前沒有注意到
簡繁的JS 點下去就自動變換簡體繁體了
還真好用阿

本版积分规则