您在這裡

大家好! 我想請問 註冊介面 的問題!

nobody1225's 的頭像
nobody1225 在 2007-03-23 (週五) 20:30 發表

大家好!
有幾個問題想問
1.
我想重做註冊介面
------------------------------
-    帳號         -
-    密碼         -
-    圖書証號碼      -
------------------------------
範例 https://www.aadl.org/user/register

請問 要修改哪個 hook 或 改哪個模組呢?

2.
請問 我要寫哪個 hook 或 改哪個模組 才能抓到 由使用者輸入圖書証號碼的值呢(例如 $libid ) (因為我想用這圖書證號碼連結圖書館的資料庫)

謝謝大家進來看我的問題
謝謝

這很有意思!

你是要這樣嗎?
1. 讓使用者在註冊時,自己輸入圖書證號碼。
2. 這個號碼會與原有的圖書證資料庫作比對,有此號碼才可以註冊。
3. 可以透過原有圖書館系統的API,把該使用者的相關資料顯示在 Drupal 裡。

若是這樣,如何判定使用者與圖書證號碼是相符的? 我輸入別人的號碼也行?

最近朋友介紹了開源碼的圖書館系統 Koha,還有之前試用過的 anobii,自己有在想,能用 Drupal 作個圖書交換社群網站/library bank 嗎?

您好!
我已經可以做出可以判定圖書證號碼是相符的了。
根據 這位高手 的檔案 (III-PatronAPI) (抱歉!不做連結,是怕對作者不敬)
http://www.blyberg.net/files/
我們學校是採用 III/Millenium 的圖書管理系統
剛好這位高手也是
但因為讀者API這個產品要價不斐
所以我們學校沒買
因此我修改它的程式來配合我們學校
說明一下讀者API,它可以抓出讀者的資訊(姓名,電話,住址等)
還可以用它來做認證(當recode=0,表示帳號密碼正確)

我修改的第一個版本是在 登入介面
--------------------------------
- 帳號=>圖書証號
- 密碼=>圖書証密碼
--------------------------------
採用 hook_auth
做完發現
1.可以直接登入
2.在圖書管理系統上修改密碼時,drupal也會自動更改密碼

3.drupal帳號卻變成 圖書証號@localhost
所以這不是我想要的
因為
1.讀者登入還要輸入那麼長的帳號,肯定會被罵死
2.帳號變那麼長,版型都被搞壞了

如有更好的解決方法請說喔!

以下是我修改的第二版本 註冊介面
-------------------------------------------
- 帳號
- 密碼 =>圖書館的密碼
- 圖書證號碼
-------------------------------------------
採用 http://drupal.org/node/85861 這個方法
其採用 hook_user
在作的時候發現
1.
我得增加一個圖書證號碼
謝謝joetsuihk的回覆
我從使用者管理=>使用者資訊增加一個 profile_LibID 欄位
然後在自己修改的模組用 $LibID = $edit['profile_LibID']; 去抓它
用$password = $edit['pass']; 抓密碼欄位
2.
drupal註冊時沒密碼欄位
所以安裝 http://drupaltaiwan.org/module/logintoboggan
來顯示密碼欄位
做完發現
1.可以驗證讀者沒錯
2.帳號可隨其所好(不知道是好還是不好,因為這樣就兩個帳號了(一個圖書館,一個drupal))

3.在圖書管理系統上修改密碼時,drupal不會修改密碼
所以現在又卡住了
請問大家 現在我要修改哪個 hook
才能使在圖書管理系統上修改密碼時,drupal也會自動更改密碼呢?

如有更好的解決方法請說喔!

我是想用
圖書証號 當 drupal帳號
圖書証密碼 當 drupal密碼
這我可以寫出來
但我不想圖書証號被人看到
所以就要將版型上的 username 改成 暱稱
這樣就很麻煩
請問我如果不想修改版型
可以修改哪個模組或hook來達成呢
謝謝大家看完我的問題
如需程式碼,我再PO上(我修改它人的模組,PO在這會不會有問題阿)。

發現到一個模組 Authorship Module
它可以讓您將 帳號 改成 你想要的暱稱 (只要有在設定=>內容類型的都可以,之外的好像不行)
1.安裝完時,先到profile建立一個欄位(例profile_name)
2.再到文章類型那,你就會發現多一個 The profile variable name used to store the real name 欄位
3.填入剛剛的 profile_name,啟用下面的 Enable authorship module functionality
ps

4.根據它的readme,要讓使用者也有這樣的功能,它必需開啟使用者的authorship 模組權限
這樣就可以建立文章試試看了
我試完的結果,感覺怪怪的,但它確實可以幫您將帳號名稱更改成你想要的暱稱,不用動到版型
謝謝大家,如果這樣解釋可以的話,我再貼到模組介紹

您好!
如果是 user/*
請問要修改哪呢?

現在想做的是
讀者用圖書館的証號、密碼,直接登入drupal
不需在drupal註冊
登入介面
----------------
- 帳號
- 密碼
----------------
登入之後,將顯示帳號的地方,全改成使用者暱稱
所以在 user/* 出現的帳號名稱,也要更改

現在在找一個問題
如果帳號使用別的資料庫的話
帳號會變成 username@localhost
如果我要改成輸入 username 就能讓使用者登入呢
請問要改哪個模組或hook呢(因為我不知道要下什麼關鍵字去找,我現在是用login去找)
謝謝大家!

user module

user_load()
user_authenticate()

"用圖書館的証號、密碼,直接登入drupal"
應該改好user_authenticate() , return 正確的 $user 就可以了
$user 可以在 user_authenticate() 中用 print_r($user) 獲得詳細資料
如果改到這個程度的話
hook 只要將第一次登入的使用者加到table(當成register)
用圖書館的証號 當uid (要給其他module 使用的, 如記錄留言)
應該沒有問題

Joetsui's blog

看了好久,還是搞不懂!
對不起!讓我問一下!
我知道 hook 可以用模組覆寫 (模組_auth)
那像這種呢?
user_authenticate()
可以在自己增加的模組上覆寫嗎?如果可以如何使用呢?

我有找到這篇文章
http://drupal.org/node/27972
但我不知道如何覆寫
我就直接去修改原本的user.module
但時常被我搞壞,呵呵
我用這篇文章 是可以不用加 @host
但密碼輸入錯誤時會有BUG
所以目前在修改
謝謝大家的回應

Drupal的hook本身已經可以達到很多彈性的需求
http://drupal.org/project/alt_login 做了很好的登入更改
完全不需要動到core的user.module

<?php
function alt_login_form_alter($form_id, &$form) {
switch ($form_id) {
case 'user_login':
case 'user_login_block':
// This validation happens before the main login validation. <======
// 這裡就是更改認證程序的方式
$form['name']['#validate'] = array('_alt_login_login_validate' => array());
break;
case 'user_register':
if (variable_get('alt_login_user_registration', 1)) {
// 這裡提供另一個文字欄位填寫暱稱
$form['alt_login'] = array('#type' => 'textfield',
'#title' => t('Alternate Login'),
'#maxlength' => 56,
'#description' => t('If you wish to provide another valid login name, enter it here: only letters, numbers and spaces are allowed.'),
);
// Put the form field in the account fieldset if it exists.
if (isset($form['account'])) {
$form['account']['alt_login'] = $form['alt_login'];
unset($form['alt_login']);
}
}
break;
}

// 因此使用者無論新增、修改、刪除資料時,都會存取到另外的認證資料庫(table)
function alt_login_user($type, &$edit, &$user, $category = NULL) {

if ($type == 'delete') {
return _alt_login_delete($user->uid);
}
if ($type == 'validate') {
return _alt_login_validate($user->uid, $edit);
}
if ($category == 'account' && $type == 'update') {
return _alt_login_update($user->uid, $edit);
}
if ($type == 'insert') {
return _alt_login_register_submit($user->uid, $edit);
}
if ($category == 'account' && $type == 'form') {
return _alt_login_form($user);
}
}
?>

--
from open mind to open source~

總算解決了
我用一個很蠢的方法
http://drupal.org/project/Modules/category/74 的模組全部下載
在搜尋裡面有沒有使用 user_save 這個方法
最後在 http://drupal.org/project/ldap_integration 發現
PO給大家作參考

登入介面
-----------------------
帳號 =>借書證編號
密碼 =>借書證密碼
-----------------------

有附上檔案 5.0版
因為不能上傳RAR檔
所以我把副檔名改成jpeg
請將它改成RAR就行了
謝謝大家
<?php
function iii_authen_login_validate($form_id, $form_values) {
global $user;

if (isset($form_values['name'])) {
if (user_is_blocked($form_values['name'])) {
// blocked in user administration
form_set_error('login', t('The username %name has been blocked.', array('%name' => theme('placeholder', $form_values['name']))));
}
else if (drupal_is_denied('user', $form_values['name'])) {
// denied by access controls
form_set_error('login', t('The name %name is a reserved username.', array('%name' => theme('placeholder', $form_values['name']))));
}
else if ($form_values['pass']) {
// === HACK STARTS ===
// --- New code starts
//抓取登入介面的帳號密碼
$user = _iii_authen_user_authenticate($form_values['name'], trim($form_values['pass']));
// --- New code ends
// --- Drupal's original code starts
// $user = user_authenticate($form_values['name'], trim($form_values['pass']));
// --- Drupal's original code ends
// === HACK ENDS ===

if (!$user->uid) {
form_set_error('login', t('Sorry. Unrecognized username or password.') .' '. l(t('Have you forgotten your password?'), 'user/password'));
watchdog('user', t('Login attempt failed for %user: %error.', array('%user' => theme('placeholder', $form_values['name']))));
}
}
}
}

function _iii_authen_user_authenticate($name, $pass) {
global $user;
//判斷是否為最高權限者
$_result = db_query("SELECT uid FROM {users} WHERE name = '%s'", $name);
if (($_user = db_fetch_object($_result)) && ($_user->uid == 1)) {
$user = user_authenticate($name, $pass);
}
//判斷是否為本圖書館借書證
if (poor_iii_check_validation($name,$pass))
{
//如有 @ 則登入失敗,因為 hook_auth 的關係
//hook_auth 在4.7版只能使用 帳號@localhost登入
//但在5.0版可以使用 帳號,帳號@,帳號@localhost
//在這只想讓讀者使用帳號就可登入,所以採用這種方式
if (!strstr($name, '@'))
{
$account = user_load(array('name' => $name));
$tmp_user->name = $name;
if (!isset($account->uid))
{
$user = user_save('', array('name' => $name, 'pass' => $pass, 'status' => 1));
watchdog('user', t('New external user: %user using module %module.', array('%user' => theme('placeholder', $name), '%module' => theme('placeholder', 'ldapauth'))), WATCHDOG_NOTICE, l(t('edit'), 'user/'. $user->uid .'/edit'));
}
else
{
$user = $account;
}
}
}
return $user;
}

/**
* poor_iii_check
* 原作者 http://drupalib.interoperating.info/node/5
*/
function poor_iii_check_validation($id,$pin) {
$iii_server = "140.127.53.11";
$iii_PatronApi_url = "http://$iii_server/patroninfo*cht?code=$id&pin=$pin";

// Get contents of III response (i.e., patron record)
$iii_rec = file_get_contents($iii_PatronApi_url);

// Get HTTP status code
list($version, $status_code, $msg) = explode(' ', $http_response_header[0], 3);

if ($status_code == '200') {
// Look for $iii_rec_patron_name_pattern in the returned III patron record, return TRUE if found
if (preg_match("/You are logged into/i", $iii_rec)) {
return TRUE;
}
else {
return FALSE;
}
}
else {
$error_string = "Server returned $status_code: $msg";
watchdog('user', t('Problem with III authentication service: %error_string', array('%error_string' => theme('placeholder', $error_string))));
}
}
?>