私のセットアップ:Drupal 7ですが、デフォルトのユーザープロファイル写真を使用していません。代わりに、ユーザープロファイルに添付されているカスタム画像フィールドprofile_pictureがあります。ユーザーが登録すると、性別を選択する必要があります(男性/女性/言わないでください)。
各ユーザーが性別に選択した値に基づいて、このprofile_pictureフィールドに別のデフォルト画像を割り当てたいと思います。ルールでデータ値の設定を使用してみましたが、これらの3つの特定の写真(性別の選択ごとに1つ)をオプションにする方法がわかりません。
それが役立つ場合、各ユーザーは自分の性別に基づく役割も持っています。私はこのためにルールを使用することを約束していません。プロフィールのフィールドの値に基づいて画像を確実に設定できる任意のソリューションを受け入れます。ユーザーが性別を変更する機会はないため、これは一度だけ設定する必要があります。
編集:ユーザーは後でこれを独自のカスタムプロフィール写真に置き換えることができるため、これを画像フィールドとして保持する必要があります。
簡単な方法としては、性別フィールド自体のテーマを変更して、値に基づいて画像を表示する方法があります。たとえば、male
を表示する代わりに、パスsites/default/files/male.png
の画像を表示します。
D6では、これはCCKのcontent-field.tpl.php
をテーマディレクトリにコピーしてからcontent-field-field_gender.tpl.php
を作成し、そこに何かを表示することを意味します。
print theme('image', 'sites/default/files/' . $item['view'] . '.png')
...print $item['view']
だけではありません。
D7の簡単な説明 here は、テーマのディレクトリでフィールドのfield.tpl.php
をfield--gender--profile.tpl.php
にコピーすることが、そこに基本的な開始点であり、$ itemをrender()する代わりに、何かを行うことを示唆していますその値と似ています。
次に、どちらのバージョンでも、male.png
、female.png
、unknown.png
という名前の3つの画像(または、性別フィールドの値に基づくファイル)がファイルディレクトリにあることを確認してください。
このアプローチでは、ユーザーごとにアップロードして保存したファイルではなく、処理するファイルが3つだけになります。別の副次的な利点は、ユーザーのブラウザーによって簡単にキャッシュされることです。
添加:
コメントやその他の回答からの新しい情報に基づいて、user-picture.tpl.php
テンプレートで次のようなことを行うことができます。
if (!empty($account->field_profile_picture[LANGUAGE_NONE][0]['fid'])) {
// Load the file
$file = file_load($account->field_profile_picture[LANGUAGE_NONE][0]['fid']);
// Note the style name is "profile_picture" as explained in your question,
// not "profile_pic" which was in your original code
echo theme('image_style', array('style_name' => 'profile_picture', 'path' => $file->uri));
} else {
$file_path = 'sites/default/files/' . $account->field_gender[LANGUAGE_NONE][0]['value'] . '.png';
echo theme('image_style', array('style_name' => 'profile_picture', 'path' => $file_path));
}
ここで、新しいものはelse ....
です。D7でsites/default/files
が間違っている場合、私のD6ismを許してください。ただし、基本的には、システムでmale.png
、female.png
およびunknown.png
そして、profile_pictureフィールドが設定されていない場合にそれらを表示します。
1つの方法は、ユーザー登録フォームのカスタム送信ハンドラーを追加することです。
function yourmodule_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'user_register_form') {
$form['#submit'][] = 'mycustom_user_profile_form_submit';
}
}
次に、以下のようにプログラムでprofile_pictureフィールドに値を割り当てます。
function mycustom_user_profile_form_submit($form, &$form_state) {
if ($form ['field_gender']['und']['#value'] == "Male") {
$image_path = 'public://pictures/male.jpg';
} else if ($form ['field_gender']['und']['#value'] == "Female") {
$image_path = 'public://pictures/female.jpg';
} else if ($form ['field_gender']['und']['#value'] == "Prefer not to say") {
$image_path = 'public://pictures/other.jpg';
}
$result = db_query("SELECT f.fid FROM {file_managed} f WHERE f.uri = :uri", array(':uri' => $image_path));
$record = $result->fetchObject();
$image_info = image_get_info($image_path);
$fid = 0;
$account = user_load($form_state['values']['uid']);
//check if file is already in file_managed table
if ($record) {
$fid = $record->fid;
} else {
//create new file
$file = new StdClass();
$file->uid = $account->uid;
$file->uri = $image_path;
$file->filemime = $image_info['mime_type'];
$file->status = 0;
$file->filesize = $image_info['file_size'];
file_save($file);
$fid = $file->fid;
}
//create file array
$file_array = array();
$file_array['fid'] = $fid;
$file_array['display'] = 1;
$file_array['height'] = $image_info['height'];
$file_array['weight'] = $image_info['width'];
$account->field_profile_picture['und'][0] = $file_array;
user_save($account);
}
hook_field_attach_submit() をとして使用できますこのフックは、フィールドモジュールが操作を実行した後に呼び出されます。
完全に実装されたコードは次のとおりです
/**
* Implements hook_field_attach_submit().
*/
function MODULE_NAME_field_attach_submit($entity_type, $entity, $form, &$form_state) {
// First find the image fields. This proces is much more complicated than
// it probably should be.
// 1. Grab the name of the entity bundle
// 2. Grab the list of fields for the given entity type and bundle
// 3. Loop through all fields in that type and bundle and get the image
// fields names.
$entity_info = entity_get_info($entity_type);
// User entity doesn't have a bundle. So you just pass the type into the
// bundle field.
if (empty($entity_info['entity keys']['bundle'])) {
$field_instances_info = field_info_instances($entity_type, $entity_type);
}
else {
$field_instances_info = field_info_instances($entity_type, $entity->{$entity_info['entity keys']['bundle']});
}
$image_fields = array();
foreach ($field_instances_info as $field_name => $field_instance_info) {
if($field_name == 'field_profile_picture') {
$field_info = field_info_field($field_name);
$image_fields[$field_name] = $field_instance_info['settings'];
$image_fields[$field_name]['uri_scheme'] = $field_info['settings']['uri_scheme'];
$image_fields[$field_name]['empty'] = ($form[$field_name]['und'][0]['#value']['fid'] > 0)? FALSE:TRUE;
$image_fields[$field_name]['default_images_path'] = "default_images";
$image_fields[$field_name]['gender'] = $form['field_gender']['und']['#value'];
}
}
// The list of image fields is now available. If the instance setting of that
// field has random_default set and the image field is empty choose a random
// file of the supported file type in the directory.
foreach ($image_fields as $field_name => $field_instance_info) {
if ($field_instance_info['empty']) {
if($field_instance_info['gender'] == 'Male') {
$file_selection = cf_get_image_info("public://default_images/avatar-male.jpg");
}
else {
$file_selection = cf_get_image_info("public://default_images/avatar-female.jpg");
}
// 2. Check if a file id exists for it
$result = db_select('file_managed', 'fm')
->fields('fm', array('fid'))
->condition('fm.uri', $file_selection['uri'])
->execute()
// Fetch as array
->fetchAll(PDO::FETCH_ASSOC);
// 3. If it does not create a new one
if (empty($result)) {
GLOBAL $user;
$file = new stdClass();
$file->uid = $user->uid;
$file->filename = $file_selection['filename'];
$file->uri = $file_selection['uri'];
$file->filemime = file_get_mimetype($file_selection['uri'], $mapping = NULL);
$file->status = 1;
file_save($file);
}
else {
$file = file_load($result[0]['fid']);
}
// Add a fake file usage to prevent files pulled form the random directory
// from being deleted when they are no longer referenced.
$usage = file_usage_list($file);
if (!isset($usage['profile_default_image'])) {
file_usage_add($file, 'profile_default_image', 'profile_default_image', 0);
}
// 4. Identify this file for the field
$entity->{$field_name}['und'][0] = (array) $file;
}
}
}
function cf_get_image_info($path) {
$image1 = image_get_info($path);
$image2 = pathinfo($path);
$image_info = array_merge($image1, $image2);
$image_info['uri'] = $path;
return $image_info;
}
別の解決策:(プロファイル2を使用して)テーマフォルダーにuser-picture.tpl.phpを作成し、次のコードを試してください。
<?php if ($user_picture) {?>
<div class="<?php print $classes; ?>">
<?php print $user_picture; ?>
</div>
<?php
} else {
$profile = profile2_load_by_user($account->uid);
global $language ;
$curr_lang = $language->language;
if ($profile['main']->field_user_gender) {
$field_user_gender = $profile['main']->field_user_gender['und'][0]['value'];
$uid = $profile['main']->uid;
}
if($field_user_gender=="female"){
?>
<div class="user-picture">
<a href="/<?=$curr_lang?>/user/<?=$uid?>" class="active"><img src="/sites/all/themes/xxx/img/f.jpg"></a>
</div>
<?php }else{?>
<div class="user-picture">
<a href="/<?=$curr_lang?>/user/<?=$uid?>" class="active"><img src="/sites/all/themes/xxx/img/m.jpg"></a>
</div>
<?php
}
} ?>
Template_preprocess_user_picture()をオーバーライドするのはどうですか?
->デフォルトの実装は次のとおりです。 http://api.drupal.org/api/drupal/modules%21user%21user.module/function/template_preprocess_user_picture/7
これは、ユーザーが指定した画像を使用するか、デフォルトの画像にフォールバックするかが決定される場所です。
[...]
elseif (variable_get('user_picture_default', '')) {
$filepath = variable_get('user_picture_default', '');
}
[...]
これを拡張して、$ accountオブジェクト(現時点で使用可能)にある性別フィールドを調べ、user_picture_default_maleおよびuser_picture_default_femaleを提供するだけです。
それは理にかなっていますか?