這個問題更多與我希望在「SCALE」方面實現的過程/邏輯相關,而不是如何編寫程式碼。
在WordPress中,我有幾個以HTML形式加載的表單,當用戶創建一個自定義文章(對於不熟悉CMS的人來說,實際上是一個新的數據庫條目)來記錄一個新的“事件”時載入。我不想手動映射所有內容,因為這是使用update_post_meta()
來設定資料庫條目/文章的名稱和值- 所以當提交表單時,我使用php循環foreach ($_POST as $ name => $value) {
來填入此事件的所有資料庫表。
這個方法很好,但是現在,如果用戶保存表單並稍後回來編輯它,我希望如果存在值,像這樣回顯:
<label for="reported_by">报告人(全名)</label> <?php $reported_by = get_post_meta($incident_id, 'reported_by', true); ?> <input type="text" name="reported_by" value="<?php echo $reported_by; ?>">
同樣,這個方法也很好,但是我在這個頁面上有近500個字段,所以為每個字段手動設置唯一變量(在這種情況下是$reported_by
)將花費我很長時間,基本上會增加程式碼庫近50%,使其難以維護且效率低。
對於如何解決這個問題有什麼想法嗎?可以理解的是,我可以透過php建立表單並在HTML中回顯,但這也感覺像是一個非常手動的過程。 PHP是伺服器端的,所以我不能輕鬆地在客戶端取得標籤/輸入的名稱值,除非使用AJAX,但我覺得這也會變得相當手動。
所以無論如何,我都面臨著很多重複勞動,除非有一種方法可以使這個過程更容易擴展到所有500個字段,而不需要我手動設定變數名稱。
謝謝您的時間!
P粉3080890802023-09-11 11:38:54
首先要注意的是,你其實並不需要為每個表單輸入項目建立一個不同命名的局部變數。也就是說,不需要這樣寫:
<label for="reported_by">报告人(全名)</label> <?php $reported_by = get_post_meta($incident_id, 'reported_by', true); ?> <input type="text" name="reported_by" value="<?php echo $reported_by; ?>">
你可以這樣寫:
<label for="reported_by">报告人(全名)</label> <?php $current_value = get_post_meta($incident_id, 'reported_by', true); ?> <input type="text" name="reported_by" value="<?php echo $current_value; ?>">
為什麼這樣有幫助呢?因為現在只有兩個與此輸入項目相關的內容:
這兩個都只是字串,所以很容易提取到PHP變數:
<?php $field_name = 'reported_by'; $label = '报告人(全名)'; ?> <label for="<?php echo $field_name; ?>"><?php echo htmlspecialchars($label); ?></label> <?php $current_value = get_post_meta($incident_id, $field_name, true); ?> <input type="text" name="<?php echo $field_name; ?>" value="<?php echo $current_value; ?>">
這些看起來很像參數,所以讓我們把它變成一個函數,同時記得也傳入$incident_id
:
<?php function display_input($incident_id, $field_name, $label) { ?> <label for="<?php echo $field_name; ?>"><?php echo htmlspecialchars($label); ?></label> <?php $current_value = get_post_meta($incident_id, $field_name, true); ?> <input type="text" name="<?php echo $field_name; ?>" value="<?php echo $current_value; ?>"> <?php } display_input($incident_id, 'reported_by', '报告人(全名)');
現在,你只需要呼叫display_input
函數500次就可以顯示500個輸入項目。為了避免這樣,可以使用一個陣列和foreach
迴圈:
$fields = [ 'reported_by' => '报告人(全名)', ]; foreach ( $fields as $field_name => $label ) { display_input($incident_id, $field_name, $label); }
然後,你可以從設定檔或資料庫表中取得數組,而不是硬編碼。你已經自動化了重複的部分(渲染HTML的細節),只剩下「有趣」的部分:定義要顯示的欄位清單。
如果某些欄位需要稍微不同,你可以為函數(和配置陣列)添加一些額外選項,但只要變化不多,程式碼應該保持相當簡單明了。