這一陣子斷斷續續都在幫系上的學長修改系上的期刊系統。 我們是使用ojs 這套開放原始碼的系統,我看學長用起來功能還頗為完善,不過中文語系尚未完全翻譯完畢,算是較為可惜的地方。
不過外國人所寫的系統有個問題就是他們的全名排列方式跟我們的不一樣,學長希望我改一下這個問題。我跟學長討論了一下之後,決定採用判斷姓名的utf8編碼是否落於中文的範圍,如果是就把排列順序倒過來這種方式來做。
不過後來真的改到吐血,經常一找就是一個晚上。為什麼呢? 因為ojs程式碼的一致性不太好,舉例來說:
使用者的全名透過 User.inc.php裡面 的getFullName(582行) 函式回傳,這段的程式碼長這樣:
function getFullName($lastFirst = false) {
if ($lastFirst) {
return $this->getData('lastName') . ', ' . $this->getData('firstName') . ($this->getData('middleName') != '' ? ' ' . $this->getData('middleName') : '');
} else {
return $this->getData('firstName') . ' ' . ($this->getData('middleName') != '' ? $this->getData('middleName') . ' ' : '') . $this->getData('lastName');
}
}
看起來相當合理,但是Editor & Reviewer 的姓名卻不是放在相同階層的class中。這兩者都是放在DAO 等級的類別中,以Editor 為例 就放在 EditAssignmentDAO中把資料塞進類別變數的函式_returnEditAssignmentFromRow中:
function &_returnEditAssignmentFromRow(&$row) {
$editAssignment = &new EditAssignment();
$editAssignment->setEditId($row['edit_id']);
$editAssignment->setArticleId($row['article_id']);
$editAssignment->setEditorId($row['editor_id']);
$editAssignment->setCanReview($row['can_review']);
$editAssignment->setCanEdit($row['can_edit']);
$editAssignment->setEditorFullName($row['first_name'].‘ ‘.$row['last_name']);
$editAssignment->setEditorFirstName($row['first_name']);
$editAssignment->setEditorLastName($row['last_name']);
$editAssignment->setEditorInitials($row['initials']);
$editAssignment->setEditorEmail($row['email']);
$editAssignment->setIsEditor($row['editor_role_id']==ROLE_ID_EDITOR?1:0);
$editAssignment->setDateUnderway($this->datetimeFromDB($row['date_underway']));
$editAssignment->setDateNotified($this->datetimeFromDB($row['date_notified']));
HookRegistry::call(‘EditAssignmentDAO::_returnEditAssignmentFromRow’, array(&$editAssignment, &$row));
return $editAssignment;
}
請注意第八行的地方…
你說找到頭昏是不是正常現象…. 所以我覺得程式的一致性邏輯很重要,怎樣奇怪都沒關係,你要把全名的組合函式放到DAO層級或是到 Model 層級都沒關係,重點是要一致阿!!!!