web-dev-qa-db-ja.com

登録時に、性別に基づいてユーザーに異なるプロフィール写真を割り当てるにはどうすればよいですか?

私のセットアップ:Drupal 7ですが、デフォルトのユーザープロファイル写真を使用していません。代わりに、ユーザープロファイルに添付されているカスタム画像フィールドprofile_pictureがあります。ユーザーが登録すると、性別を選択する必要があります(男性/女性/言わないでください)。

各ユーザーが性別に選択した値に基づいて、このprofile_pictureフィールドに別のデフォルト画像を割り当てたいと思います。ルールでデータ値の設定を使用してみましたが、これらの3つの特定の写真(性別の選択ごとに1つ)をオプションにする方法がわかりません。

それが役立つ場合、各ユーザーは自分の性別に基づく役割も持っています。私はこのためにルールを使用することを約束していません。プロフィールのフィールドの値に基づいて画像を確実に設定できる任意のソリューションを受け入れます。ユーザーが性別を変更する機会はないため、これは一度だけ設定する必要があります。

編集:ユーザーは後でこれを独自のカスタムプロフィール写真に置き換えることができるため、これを画像フィールドとして保持する必要があります。

3
Patrick Kenny

簡単な方法としては、性別フィールド自体のテーマを変更して、値に基づいて画像を表示する方法があります。たとえば、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.phpfield--gender--profile.tpl.phpにコピーすることが、そこに基本的な開始点であり、$ itemをrender()する代わりに、何かを行うことを示唆していますその値と似ています。

次に、どちらのバージョンでも、male.pngfemale.pngunknown.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.pngfemale.pngおよびunknown.pngそして、profile_pictureフィールドが設定されていない場合にそれらを表示します。

2
Jimajamma

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);
}
2

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;
}
1

別の解決策:(プロファイル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
}
} ?>
0
brainHax

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を提供するだけです。

それは理にかなっていますか?

0
jpoesen