首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 模擬 ASP.NET WebForms 按鈕事件機制:EventHelper 實作

     編輯:PHP 相關知識

PHP 模擬 ASP.NET WebForms 按鈕事件機制

習慣 ASP.NET WebForms 事件驅動開發的工程師,可透過簡單封裝在 PHP 中實現類似 Page_Load、Button_Click 的事件模式,適合邏輯不複雜的頁面快速開發。

頁面代碼 page.php

<?php
require_once '../inc/EventHelper.php';

function Page_Load() {
    echo '每次請求都會執行<br>';
    if (!Page::IsPostBack()) {
        echo '首次載入:載入產品分類<br>';
        if ($_GET['cmd'] == 'edit') {
            echo '編輯模式:載入產品資料<br>';
        }
    }
}

function bAdd_Click() {
    echo "bAdd_Click 執行新增邏輯<br>";
}

function bEdit_Click() {
    echo 'proID=' . $_GET['proID'] . '<br>';
    echo "bEdit_Click 執行修改邏輯<br>";
}

function sdfsdfdsf_Click() {
    echo "其他按鈕事件<br>";
}
?>

<form name="aa" method="post" action="?<?=Comm::GetParam()?>">
    <input type="submit" name="bAdd" value="新增" />
    <input type="submit" name="bEdit" value="修改" />
    <input type="submit" name="sdfsdfdsf" value="其他" />
</form>

核心類別 EventHelper.php

<?php
class Page {
    public static function IsPostBack() {
        global $SYSRunEventName;
        return !empty($SYSRunEventName);
    }

    public static function EventLoad() {
        global $SYSRunEventName;
        $userFuncs = get_defined_functions()['user'];
        $postKeys = array_keys($_POST);

        foreach ($postKeys as $key) {
            $name = strtolower($key);
            foreach ($userFuncs as $func) {
                $funcName = str_ireplace('_click', '', $func);
                if ($name == strtolower($funcName)) {
                    $SYSRunEventName = $func;
                    break 2;
                }
            }
        }

        if (function_exists('Page_Load')) Page_Load();

        if (Page::IsPostBack()) {
            $SYSRunEventName(); // 呼叫對應的 *_Click 函數
        }
    }
}

class Comm {
    public static function GetParam($params = array(), $cmd = 'addoverride') {
        $all = array();
        if ($cmd == 'addoverride') {
            foreach (array_keys($params) as $k) {
                if (!isset($all[$k])) $all[$k] = $params[$k];
            }
        } elseif ($cmd == 'del') {
            foreach ($params as $k) unset($_GET[$k]);
        }
        foreach (array_keys($_GET) as $k) {
            if (!isset($all[$k])) $all[$k] = $_GET[$k];
        }
        $p = '';
        foreach (array_keys($all) as $k) $p .= $k . '=' . $all[$k] . '&';
        return rtrim($p, '&');
    }
}

Page::EventLoad();
?>

運作原理

  1. 表單送出時,按下的 submit 按鈕 name 會出現在 $_POST 中。
  2. EventLoad() 掃描 $_POST 鍵名,比對所有使用者定義函數(移除 _click 後綴)。
  3. 找到對應函數名存入全域 $SYSRunEventName。
  4. 執行 Page_Load(),再呼叫 $SYSRunEventName() 執行具體事件函數。
  5. Comm::GetParam() 保留 GET 參數並合併額外參數,方便分頁、編輯模式保持網址狀態。

注意事項

  • 安全性:未過濾函數名稱,生產環境需加白名單機制。
  • 僅適合簡單頁面,複雜專案建議採用 MVC 框架。
  • 核心利用 function_exists、get_defined_functions 反射機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved