您在這裡

Drupal中表單調用SQL查詢API操作數據庫表

James Qi 在 2019年3月12日 - 16:04 發表

  這兩年我們新建網站多數都采用了《在Drupal中直接導入、使用數據庫》這篇文章中說的辦法,而沒有用以前新建内容類型、導入到Drupal的Node中的辦法,這對于數據量大、改動不大、讀取多、寫入少的需求很合适。

  偶爾遇到需要修改、删除的事情,我們就是到阿裡雲RDS管理後台,Web界面來操作或者用SQL語句來進行,比以前在Node頁面進行編輯要麻煩,但更改量不大的情況下也可以接受。

  最近要用的一個新站也是用直接建表方式來搭建的,但内容需要人工來修改完善,而且是長久都需要添加、維護信息的,再用以前導入RDS後台就顯得太麻煩了,于是想去找現成的Drupal第三方模塊來解決,找了幾個,發現需要把data導入的table進行entity實體化,那反而搞複雜了。

  後來幹脆決定自己寫表單來操作,但需要解決權限的問題,嘗試在自定義模塊中添加menu項,利用Drupal自有的機制可以解決權限問題,隻讓具有管理員權限的用戶可以訪問。

function my_module_menu() {
  $items= array();
  $items['edit_table'] = array (
    'title'=>t('Edit').' '.t('Table'),
    'page callback'=>'edit_table',
    'access callback' => 'user_access',
    'access arguments'=>array('administer users'),
  );
  $items['edit_table_submit'] = array (
    'title'=>t('Edit').' '.t('Table').' '.t('Submit'),
    'page callback'=>'edit_table_submit',
    'access callback' => 'user_access',
    'access arguments'=>array('administer users'),
  );
  return $items;
}

  menu項添加一個edit table路徑和一個edit table submit路徑,前者用于讀取數據庫表内容和生成相應的表單,後者用于接收處理前者提交來的表單對數據庫表進行修改,這樣就可以實現不進入RDS管理後台就修改數據庫表的功能。簡化後的示範程序如下:

function edit_table() {//讀取數據庫表,生成表單
  $request_uri = $_SERVER['REQUEST_URI'];
  $keyword = substr($request_uri,strpos($request_uri,'/edit_table/')+strlen('/edit_table/'));
  $result = db_select('table_name')
    ->fields('table_name',array(
    'field_1',
    'field_2',
    ...
    'field_n'
    ))
    ->condition('name', $name,'=')
    ->execute()
    ->fetchAssoc();
  $field_1 = $result['field_1'];
  $field_2 = $result['field_2'];
  ...
  $field_n = $result['field_n'];
  $form = "
  <form class='edit_form' action='/edit_table_submit' method='post'>
    <input type='hidden' name='field_1' value='$field_1' />
    <div class='input_wrap'>
      <label>Field 1: </label>
      <input type='text' name='field_1' value='$field_1' disabled='disabled' />
    </div>
    <div class='input_wrap'>
      <label>Field 2: </label>
      <input type='text' name='field_2' value='$field_2' />
    </div>
    ...
    <div class='emoji_input_wrap'>
      <label>Field n: </label>
      <input type='text' name='field_n' value='$field_n' />
    </div>
    <div class='input_wrap submit_wrap'>
      <input type='submit' value='".t('Submit')."' />
    </div>
  </form>
  ";
  $output = str_replace("\n","<br />\n",$form);
  return $output;
}

function edit_table_submit() {//接收表單提交數據,更改數據庫表
  $field_1 = $_POST["field_1"];
  $field_2 = $_POST["field_2"];
  ...
  $field_n = $_POST["field_n"];
  $num_updated = db_update('table_name')
    ->fields(array(
    'field_1' => $field_1,
    'field_2' => $field_2,
    ...
    'field_n' => $field_n,
    ))
    ->condition('name', $name, '=')
    ->execute();
  $output = $num_updated;
  return $output;
}

  使用Drupal在找不到合适第三方模塊的時候,自己來編寫自定義模塊也是一個很好的解決問題辦法✌😀。

回應

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。