Privatemessageモジュールを使用すると、ユーザーはFacebookのように互いにメッセージを送信できます。このページには、TOフィールド、件名、メッセージを含むフォームが表示されます。 TOフィールドは、デフォルトではオートコンプリートフィールドです。ユーザー名を検索すると、名前のみのドロップダウンが表示されます。ドロップダウンにもユーザーのプロフィール写真を表示するようにカスタマイズするにはどうすればよいですか?どこに行ってコードを変更すればよいかわかりません。
開いた privatemsg.module
hook_menu
検索する $items['messages/user-name-autocomplete']
この特定のメニュー項目は、自動補完パスを定義します。
検索する privatemsg_user_name_autocomplete
出力が定義する関数。
この関数を編集します。それで全部です。また、パッチの作成に慣れている場合は、パッチを作成して、他のユーザーがパッチを適用できるようにします。
注:Drupal 7でのみテスト済み、数年後...
privatemsg_autocomplete
ファイルのprivatemsg.pages.inc
に変更を加えて、名前だけでなくカスタムのProfile2画像フィールドを追加できるようにした例を次に示します。
それがどのように機能するか、または失敗する可能性のあるシナリオがあるかどうかはわかりません。コードをオリジナルと比較します。
/**
* Return autocomplete results for usernames.
*
* Prevents usernames from being used and/or suggested twice.
*/
function privatemsg_autocomplete($string) {
$names = array();
// 1: Parse $string and build list of valid user names.
$fragments = explode(',', $string);
foreach ($fragments as $name) {
if ($name = trim($name)) {
$names[$name] = $name;
}
}
// 2: Find the next user name suggestion.
$fragment = array_pop($names);
$matches = array();
if (!empty($fragment)) {
$remaining = 10;
$types = privatemsg_recipient_get_types();
foreach ($types as $name => $type) {
if (isset($type['autocomplete']) && is_callable($type['autocomplete']) && privatemsg_recipient_access($name, 'write')) {
$function = $type['autocomplete'];
$return = $function($fragment, $names, $remaining);
if (is_array($return) && !empty($return)) {
$matches = array_merge($matches, $return);
}
$remaining = 10 - count($matches);
if ($remaining <= 0) {
break;
}
}
}
}
// Allow modules to alter the autocomplete list.
drupal_alter('privatemsg_autocomplete', $matches, $names, $fragment);
// Format the suggestions.
$themed_matches = array();
foreach ($matches as $key => $match) {
$themed_matches[$key] = privatemsg_recipient_format($match, array('plain' => TRUE));
$profile = '';
if (isset($match->uid)) {
$profile = profile2_load_by_user($match->uid);
}
$picture = '';
if(isset($profile['main']->field_profile_photo['und'][0]['uri'])) {
$picture = theme('image_style', array( 'path' => $profile['main']->field_profile_photo['und'][0]['uri'], 'style_name' => 'profile_thumbnail'));
} else {
//I'm using sites/default/files/default_images/profile-default.jpg as the default image
$picture = theme('image_style', array( 'path' => "public://default_images/profile-default.jpg", 'style_name' => 'profile_thumbnail'));
}
$picture_matches[$key] = $picture;
}
// Check if there are any duplicates.
if (count(array_unique($themed_matches)) != count($themed_matches)) {
// Loop over matches, look for duplicates of each one.
foreach ($themed_matches as $themed_match) {
$duplicate_keys = array_keys($themed_matches, $themed_match);
if (count($duplicate_keys) > 1) {
// There are duplicates, make them unique.
foreach ($duplicate_keys as $duplicate_key) {
// Reformat them with unique argument.
$themed_matches[$duplicate_key] = privatemsg_recipient_format($matches[$duplicate_key], array('plain' => TRUE, 'unique' => TRUE));
}
}
}
}
// Prefix the matches and convert them to the correct form for the
// autocomplete.
$prefix = count($names) ? implode(", ", $names) . ", " : '';
$suggestions = array();
foreach ($themed_matches as $key => $match) {
$suggestions[$prefix . $match . ', '] = $picture_matches[$key] . $match;
}
// convert to object to prevent drupal bug, see http://drupal.org/node/175361
drupal_json_output((object)$suggestions);
}