亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3583 | 回復: 13
打印 上一主題 下一主題

高手解答:網(wǎng)頁是怎么被抽象成多個層的? [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-09-22 17:35 |只看該作者 |倒序瀏覽
一個網(wǎng)站,這么多網(wǎng)頁,大家是怎么來抽象出共性的呢?
mvc之類的是主要是講模式,而很少怎么來抽象。

高手能否詳解一下怎么來抽象呢?當然也可以配合模式。

論壇徽章:
0
2 [報告]
發(fā)表于 2008-09-22 17:38 |只看該作者
這個應該算是寫php代碼之前要定的大方向吧。

沒有方向,很暈啊。

論壇徽章:
0
3 [報告]
發(fā)表于 2008-09-22 17:50 |只看該作者
http://www.phppatterns.com/docs/ ... er_pattern#the_view

這篇文章講了部分view的抽象,先做個標記。

論壇徽章:
0
4 [報告]
發(fā)表于 2008-09-22 19:32 |只看該作者
路過

論壇徽章:
0
5 [報告]
發(fā)表于 2008-09-23 10:35 |只看該作者
樓主干嘛呢?
研究神學

論壇徽章:
0
6 [報告]
發(fā)表于 2008-09-23 11:29 |只看該作者
沒有啊。
我想這樣總是會為開發(fā)帶來方便。

可能是我的話沒有說清楚。

論壇徽章:
0
7 [報告]
發(fā)表于 2008-09-23 11:50 |只看該作者
或者這么說吧:

視圖類具體怎么寫比較可行?

論壇徽章:
0
8 [報告]
發(fā)表于 2008-09-23 16:20 |只看該作者
PHP的View層設計思路(一)收藏
一個頁面,該怎樣組織才最合理?
    首先就XHTML頁面來說,都是由一個個的框組成的。有些框只在某個特定的頁面有,
也有些框是在不同的頁面間共享的。最后,有一個大框,把所有的小框包圍起來,這個
大框就是<body></body>標簽。再加上<head></head>段里的一些聲明、CSS鏈接和JS鏈
接,一個頁面就形成了。
    每個框在包含它的容器框中都需要定位,如自然定位,相對定位,絕對定位,浮
動,等等。同時每個框也需要有自身的修飾,如寬度、高度、背景、字體等等。在這種
模型中,CSS屬性實際上已經(jīng)被區(qū)分成了互相分離的兩部分:定位和自身的修飾。這實際
上是組合模式(Composite Pattern)的一種實現(xiàn),UML圖為:


    很多View層設計方案都沒有結合CSS一起討論。然而如果采用上述方案,那么CSS就
應該是跟每個Block對象一一對應的。比如下面這個頁面Block組織:
<body id="main">
    <div id="container_one">
        <div id="content_one">hello</div>
    </div>
    <div id="container_two">
        <div id="content_two">world</div>
    </div>
</body>
就需要main、container_one、content_one、container_two、content_two共五個CSS
文件(這里暫時先不考慮CSS文件對Web服務器性能的影響)。為什么要分開成五個CSS
文件?這是因為除<body>外的其它Block是需要在不同的<body>間復用的。要復用就必
然要松散耦合,所以每個實現(xiàn)上的Leaf Block(注意這是實現(xiàn)上的,不是UML圖中的,
因為實現(xiàn)中一個Container Block也可以被當成一個Leaf Block使用,比如你可以把
container_two和其下的content_two合并起來當成一個整體,所謂的對象組合)都需要
一個單獨的模板文件和一個單獨的CSS。再舉JS里的對象動態(tài)綁定做例子,就很容易理
解這種綁定。文件組織看起來大致如下,注意我沒有區(qū)分各文件的邏輯層次,在現(xiàn)實框
架中肯定需要按照邏輯劃分到不同的模塊的,我只是給個例子說明下思路:
template文件:
    main.container
    container_one.container
    container_two.container
    content_one.leaf
    content_two.leaf
css文件:
    main.css
    container_one.css
    container_two.css
    content_one.css
    content_two.css
    如此一來,只需要設計一個View類,讓它依此規(guī)則渲染對應的模板即可。下一篇
文章就給出該View類的一個樣例實現(xiàn)。

<2007.07.25注:>附樣例代碼:

class view {
    public function __construct($layout) {
        $this->layout = $layout;
        $this->layout_target = dirname(self::$target) . '/' . $this->layout;
    }
    public function set_title($title) {
        $this->title = $title;
    }
    public function set_keywords($keywords) {
        $this->keywords = $keywords;
    }
    public function set($key, $value) {
        $this->vars[$key] = $value;
    }
    public function render($_block_token, $_block_name = '') {
        if ($_block_name === '') {
            $_block_name = $_block_token;
        }
        $_folder = $this->layout_target;
        $_go_upper_time = 3;
        extract($this->vars, EXTR_SKIP);
        ob_start();
        for ($_i = 0; $_i < $_go_upper_time; ++$_i) {
            $_block_file = self::$block_root . '/' . $_folder . '/' . $_block_name . '.tpl';
            if (!is_readable($_block_file)) {
                $_folder = dirname($_folder);
            } else {
                require $_block_file;
                $this->csses[$_block_token] = $_folder . '/' . $_block_name . '.css';
                break;
            }
        }
        if ($_folder === '.') {
            $_block_file = self::$block_root . '/' . $_block_name . '.tpl';
            if (!is_readable($_block_file)) {
                hc_api_error("Cannot find block file '{$_block_name}' for block token '{$_block_token}'");
            }
            require $_block_file;
            $this->csses[$_block_token] = $_block_name . '.css';
        }
        $this->blocks[$_block_token] = ob_get_clean();
        $this->vars = array();
    }
    public function show() {
        $blocks = $this->blocks;
        ob_start();
        require self::$layout_root . '/' . $this->layout_target . '.lyt';
        ob_end_flush();
    }
    private function render_head() {
        echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n";
        echo '<html xmlns="http://www.w3.org/1999/xhtml">' . "\n";
        echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' . "\n";
        if ($this->keywords === '') {
            $keywords = config::get('system.keywords');
            echo '<meta name="keywords" content="' . $keywords . '" />' . "\n";
        } else {
            echo '<meta name="keywords" content="' . $this->keywords . '" />' . "\n";
        }
        echo '<title>' . $this->title . '</title>' . "\n";
        echo '<link rel="stylesheet" href="css/css.css" type="text/css" media="all" />' . "\n";
        echo '<link rel="stylesheet" href="css/layout/' . $this->layout_target . '.css" type="text/css" media="all" />' . "\n";
        foreach ($this->csses as $css) {
            echo '<link rel="stylesheet" href="css/block/' . $css . '" type="text/css" media="all" />' . "\n";
        }
        echo '<script type="text/javascript" src="js/jquery.js"></script>' . "\n";
    }
    private $layout        = '';
    private $layout_target = '';
    private $title         = '';
    private $keywords      = '';
    private $vars          = array();
    private $blocks        = array();
    private $csses         = array();

    public static function set_target($target) {
        self::$target = $target;
    }
    public static function set_layout_root($layout_root) {
        self::$layout_root = $layout_root;
    }
    public static function set_block_root($block_root) {
        self::$block_root = $block_root;
    }
    private static $target      = '';
    private static $layout_root = '';
    private static $block_root  = '';
}

一些初始化代碼暫略(這部分代碼是我目前應用中抽取出來的,所以不能直接使用),簡單用例代碼為:

$view = new view('index'); // 指定layout為index布局模板
$view->set_title('標題');
$view->set('name', 'diogin'); //指定一個變量
$view->render('header'); // 嵌入header塊
$view->render('navigator'); // 嵌入navigator塊
$view->render('content'); // 嵌入content塊
$view->render('footer'); // 嵌入footer塊
$view->show(); // 渲染出整個頁面

以上只是一個思路,供大家參考,呵呵。


來源:http://blog.csdn.net/Diogin/archive/2007/06/06/1640214.aspx

[ 本帖最后由 oled 于 2008-9-23 16:22 編輯 ]

論壇徽章:
0
9 [報告]
發(fā)表于 2008-09-23 16:26 |只看該作者
找到一個還不錯的,先貼過來放樓上再說。

論壇徽章:
0
10 [報告]
發(fā)表于 2008-09-24 10:34 |只看該作者
又一例子,至少可以提供一種思路吧。
先貼過來吧,不要怪我亂啊。

來源:http://www.baixi.org/bbs/viewthread.php?tid=7272

創(chuàng)建程序視圖類:page.class.php
引用:
<?php
/*
ID: page.class.php, Last update: 2008/08/26, Author: Leon Lin(QQ:82756)
類名:GreatePage(創(chuàng)建程序視圖類)
主方法:DisplayHeader、IsLogin、DisplayFooter
*/
class CreatePage
{
#主菜單數(shù)組
public $menu;
#子菜單
public $subMenu;
#主菜單當前位置
public $parentLocation;
#子菜單當前位置
public $subLocation;
#功能菜單當前位置
public $functionLocation;
#訪問權限
public $purview;

//構造函數(shù)
public function __construct()
{
  session_start();
}

//頂部內容
public function DisplayHeader()
{
  echo '
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <meta http-equiv="Content-Type" c/>
  <meta name="keywords" c />
  <meta name="description" c />
  <meta name="generator" c />
  <meta name="author" c />
  <meta name="copyright" c />
  <meta name="robots" c>
  <title>'.$this->parentLocation.' - '.$this->subLocation.' - '.$this->functionLocation.' - '.WEBSITE_NAME.'</title>
  <link href="css/default.css" rel="stylesheet" type="text/css" />
  <script type="text/javascript">
        function displaySubMenu(li) {
   var subMenu = li.getElementsByTagName("ul")[0];
   subMenu.style.display = "block";
        }
        function hideSubMenu(li) {
   var subMenu = li.getElementsByTagName("ul")[0];
   subMenu.style.display = "none";
        }
     </script>
  </head>
  <body >
  <div class="parent">
   <div class="logo">'.SOFT_NAME.'<sup style="font-size:10px; font-weight:normal">TM</sup></div>
   <div class="menu">
   <ul>
   ';
   #一級菜單
   for($one=0; $one<count($this->menu); $one++)
   {
    #菜單權限分配
    $onecheck = explode(',', $this->menu[$one][2]);
    if ( isset($_SESSION[SOFT_KEY.'UserLevel']) && in_array($_SESSION[SOFT_KEY.'UserLevel'], $onecheck) )
    {
     echo '<li  >';
     if ($this->parentLocation==$this->menu[$one][0])
      echo "<a href=\"?action=".$this->menu[$one][1]."\" class=\"over\">".$this->menu[$one][0]."</a>";
     else
      echo "<a href=\"?action=".$this->menu[$one][1]."\">".$this->menu[$one][0]."</a>";
     #二級菜單
     if (count($this->menu[$one][3])>0)
     {
      echo '<ul>';
      for($two=0; $two<count($this->menu[$one][3]); $two++)
      {
       #菜單權限分配
       $twocheck = explode(',', $this->menu[$one][3][$two][2]);
       if ( isset($_SESSION[SOFT_KEY.'UserLevel']) && in_array($_SESSION[SOFT_KEY.'UserLevel'], $twocheck) )
       {
        echo "<li><a href=\"?action=".$this->menu[$one][3][$two][1]."\">".$this->menu[$one][3][$two][0]."</a></li>";
       }
      }
      echo '</ul>';
     }
     echo '</li>';
    }
   }
   echo '
   </ul>
   </div>
  </div>
  ';
   echo '
   <div class="sub">
    <div class="floatleft">
   ';
   foreach($this->subMenu as $name=>$module)
   {
    if ($this->functionLocation==$name)
    {
     echo "<a href=\"?action=$module\" class=\"over\">$name</a>";
    }else{
     echo "<a href=\"?action=$module\">$name</a>";
    }
   }
   echo '
    </div>
    <div class="floatright" style="padding-right:10px; color:#999999">當前位置:'.$this->parentLocation.' > '.$this->subLocation.' > '.$this->functionLocation.'</div>
   </div>
   ';
  echo '
  <div class="content">
  ';
}

//底部主內容
public function DisplayFooter()
{
  echo '
  </div>
  <div class="copyright">
   <div class="floatleft">&copy;'.date("Y").' '.WEBSITE_COPYRIGHT_COMPANY.' 版權所有</div>
   <div class="floatright">Coded by Leon Lin</div>
  </div>
  </body>
  </html>
  ';
}

//登錄后提示字幕
private function DisplayTip()
{
  if (isset($_SESSION[SOFT_KEY.'UserID'])&&isset($_SESSION[SOFT_KEY.'UserLevel'])&&isset($_SESSION[SOFT_KEY.'Fullname']))
  {
   return '您好 '.$_SESSION[SOFT_KEY.'Fullname'].',歡迎登錄'.WEBSITE_NAME.'!';
  }
}

//身份驗證
public function IsLogin()
{
  if (!isset($_SESSION[SOFT_KEY.'UserID'])||!isset($_SESSION[SOFT_KEY.'UserLevel'])||!isset($_SESSION[SOFT_KEY.'Fullname'])) header("Location:index.php?action=logout");
  #自定義訪問權限驗證
  if (!empty($this->purview))
  {
   $purview = explode(',', $this->purview);
   if ( !in_array($_SESSION[SOFT_KEY.'UserLevel'], $purview) )
   {
    Warning("抱謙:權限不足!");
   }
  }
}
}
?>
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP