ВопросКак вытянуть форму загрузки автара пользователя

Добрый день! Я делаю полностью свою форму редактирования профиля, это связано с темой. С текстовыми полями вроде бы все просто, сохраняются через user_save(). Но вот с аватаром пользователя возникли проблемы. В идеале хотелось бы вытянуть кусок формы загрузки из user_edit_form() Но пока не получается.

Нарыл такой код (How to add user edit form fields to profile content type form?):

  if ($form_id == 'profile_node_form') {
      require_once drupal_get_path('module', 'user') .'/user.pages.inc';
    require_once drupal_get_path('module', 'node') .'/node.pages.inc';
    global $user;
      $form += array('account' => array());
      // Get the node form
      $node_form = drupal_retrieve_form('user_profile_form', $form_state, $user);
      drupal_prepare_form('user_profile_form', &$node_form, &$form_state);
    $form['picture'] = $node_form['picture'];
    $form['locale'] = $node_form['locale'];
      $form['email'] = array(
        '#type' => 'textfield',
        '#title' => t('E-mail address'),
        '#default_value' => $user->mail,
        '#required' => TRUE,
      );
    $form['locale']['language']['#type'] = 'select';
      if ($user->uid) {
        $form['#submit'][] = 'profile_user_submit';
        $form['#validate'][] = 'users_validate_picture';
     }
    $form['#attributes'] = array('enctype' => 'multipart/form-data');
   }

Но не могу разобраться как его применить в моем случае. Влепил в свой модуль такую форму:

function custom_user_picture($form_state) {
 
  require_once drupal_get_path('module', 'user') .'/user.pages.inc';
  global $user;
 
    // Get the node form
  $node_form = drupal_retrieve_form('user_profile_form', $form_state, $user);
  drupal_prepare_form('user_profile_form', &$node_form, &$form_state);
  $form['picture'] = $node_form['picture'];
 
  $form['#attributes'] = array('enctype' => 'multipart/form-data');
  $form['type'] = array('#value'=>'profile','#type'=>'hidden');
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Change'),
    );
 
  return $form;
}

потом вывел ее в нужном месте через drupal_render('custom_user_picture');

Форма выводится, но она не функционирует.. Может посоветуете как-то по другому решить это?

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Два замечания.

1. custom_user_picture - это форма. Поэтому вызываться она должна не через drupal_render(), а через drupal_get_form('custom_user_picture');

2. Я не думаю, что надо подтягивать другие формы. Скорее всего, вам просто надо создать форму с загрузкой изображения. Далее на сабмите (после обязательной валидации изображения на корректность) загружаете пользователя с помощью global $user, добавляете фотографию к нему в профиль (в объекте $user будет поле с фото) и делаете user_save($user);

Если я слишком сложно объяснил - пишите, помогу кодом. Я так понял, это Drupal 6?

10.12.2011 22:23
Аватар пользователя Гость
Гость написал:

Что-то не выходит сохранить... Проверку взял из стандартного модуля user

function custom_picture_form() {
  $form = array(
    '#attributes' => array('enctype' => 'multipart/form-data'),
  );
  $form['file'] = array(
    '#type' => 'file',
    '#title' => 'Аватар',
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Отправить',
  );
  return $form;
}
 
function custom_picture_form_validate($form, &$form_state) {
  // If required, validate the uploaded picture.
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '130x130')),
    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
  );
  if ($file = file_save_upload('picture_upload', $validators)) {
    // Remove the old picture.
    if (isset($form_state['values']['_account']->picture) && file_exists($form_state['values']['_account']->picture)) {
      file_delete($form_state['values']['_account']->picture);
    }
 
    // The image was saved using file_save_upload() and was added to the
    // files table as a temporary file. We'll make a copy and let the garbage
    // collector delete the original upload.
    $info = image_get_info($file->filepath);
    $destination = variable_get('user_picture_path', 'pictures') .'/picture-'. $form['#uid'] .'.'. $info['extension'];
    if (file_copy($file, $destination, FILE_EXISTS_REPLACE)) {
      $form_state['values']['picture'] = $file->filepath;
    }
    else {
      form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
    }
  }
}
 
function custom_picture_form_submit($form, &$form_state) {
  global $user;
 
  $user = user_load($user->uid);
  $file = file_load($form_state['storage']['fid']);
 
  $user->picture = $file;
 
  user_save($user);
 
  // Delete that user's menu cache:
  cache_clear_all($user->uid .':', 'cache_menu', TRUE);
  // Clear the page cache because pages can contain usernames and/or profile information:
  cache_clear_all();
  drupal_set_message(t('The changes have been saved.'));
}
11.12.2011 01:59
Аватар пользователя Гость
Гость написал:

Все предыдущий код - бред =) Разобрался, раскопал что как в стандартном обработчике работает и сделал свою форму. Кстати обошелся без сабмита. Правильно ли я сделал сейчас? Но аватар уже меняет)

function custom_picture_form() {
  global $user;
 
  $form = array(
    '#attributes' => array('enctype' => 'multipart/form-data'),
  );
  $form['picture']['picture_upload'] = array(
  '#type' => 'file',
  '#title' => t('Upload picture'),
  '#size' => 28,
  '#description' => t('Your virtual face or picture. Maximum dimensions are %dimensions and the maximum size is %size kB.',
  array('%dimensions' => variable_get('user_picture_dimensions', '85x85'),
  '%size' => variable_get('user_picture_file_size', '30'))) .' '. variable_get('user_picture_guidelines', '')
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Отправить',
  );
 
  $form['#uid'] = $user->uid;
 
  return $form;
}
 
function custom_picture_form_validate($form, &$form_state) {
  // If required, validate the uploaded picture.
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '130x130')),
    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
  );
  if ($file = file_save_upload('picture_upload', $validators)) {
    // Remove the old picture.
    if (isset($form_state['values']['_account']->picture) && file_exists($form_state['values']['_account']->picture)) {
      file_delete($form_state['values']['_account']->picture);
    }
 
    // The image was saved using file_save_upload() and was added to the
    // files table as a temporary file. We'll make a copy and let the garbage
    // collector delete the original upload.
    $info = image_get_info($file->filepath);
    $destination = variable_get('user_picture_path', 'pictures') .'/picture-'. $form['#uid'] .'.'. $info['extension'];
    if (file_copy($file, $destination, FILE_EXISTS_REPLACE)) {
      $form_state['values']['picture'] = $file->filepath;
 
      // То что добавил
      cache_clear_all($form['#uid'] .':', 'cache_menu', TRUE);
      cache_clear_all();
      drupal_set_message(t('The changes have been saved.'));
    }
    else {
      form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
    }
  }
}
11.12.2011 02:30
Аватар пользователя Spleshka
Spleshka написал:

Ага, теперь всё верно :)

11.12.2011 13:27
Аватар пользователя corjeque
corjeque написал:

Здравствуйте, не подскажите как в функции submit переложить в переменную $file_id = $fid файла. Просто картинка сохраняется отдельно в файловой системе, а форма с данными сабмитится, но $fid не перекладывается. Это нужно чтобы в дальнейшем вывести каждую запись из таблицы с картинкой

function staff_form($form, &$form_state, $staff, $op = 'edit') {
 
  $form = array(
    '#attributes' => array('enctype' => 'multipart/form-data'),
  );
  $form['name'] = array(
	 '#title' => 'ФИО',
     '#description' => 'Фамилия и инициалы сотрудника',
     '#type' => 'textfield',
     '#default_value' => isset($staff->name) ? $staff->name : '',
     '#required' => true,
  );
  $form['post'] = array(
	  '#title' => 'Должность',
      '#description' => 'Должность сотрудника',
      '#type' => 'textfield',
      '#default_value' => isset($staff->post) ? $staff->post : '',
      '#required' => true,
    );
  $form['rank'] = array(
      '#title' => 'Квалификация', 
      '#description' => 'Квалификация сотрудника',
      '#type' => 'textfield',
      '#default_value' => isset($staff->rank) ? $staff->rank : '',
	  '#required' => true,
	  '#size' => 5,
    );
  $form['exp'] = array(
      '#title' => 'Стаж',
	  '#description' => 'Стаж сотрудника',
      '#type' => 'textfield',
      '#default_value' => isset($staff->exp) ? $staff->exp : '',
	  '#required' => true,
	  '#size' => 5,
    );
  $form['salary'] = array(
      '#title' => 'Зарплата',
	  '#description' => 'Зарплата сотрудника',
      '#type' => 'textfield',
      '#default_value' => isset($staff->salary) ? $staff->salary : '',
	  '#required' => true,
	  '#size' => 5,
    );
 
  $form['file'] = array(
    '#type' => 'file',
    '#title' => 'Картинка',
    '#description' => 'Выберите файл с расширением jpg, jpeg, png или gif',
  );
  $form['file_id'] = array(
    '#default_value' => isset($file_managed->fid) ? $file_managed->fid : '',
 
	);
 
 
  $form['actions']['submit'] = array(
    '#type' => 'actions',
  );
 
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Сохранить',
  );
 
  return $form;
}
/**
 * Form validate callback
 */
function staff_form_validate($form, &$form_state) {
  $validators = array(
    'file_validate_is_image' => array(), // Проверка, действительно ли файл является изображением
    'file_validate_extensions' => array('png gif jpg jpeg'), // Проверка на расширения
    'file_validate_size' => array(1 * 1024 * 1024), // Проверка на размер файла (максимум 1mb)
  );
 
  // Загружаем файл в sites/default/files (по умолчанию)
  if ($file = file_save_upload('file', $validators, 'public://')) {
 
 
  $form_state['values']['file'] = $file; // передаём информацию о файле в ф-ю mymodule_form_submit()
  }
  else {
    form_set_error('file', 'Файл не был загружен');
  }
}
/**
 * Form submit callback
 */
function staff_form_submit($form, &$form_state) {
  $file = $form_state['values']['file'];
  $file->status = FILE_STATUS_PERMANENT; // Изменяем статус файла на "Постоянный"
 
  file_save($file); // Сохраняем новый статус
  drupal_set_message('Картинка загружена');
 
  $file->fid;
 
  unset($form_state['values']['file']);
 
  $staff = entity_ui_form_submit_build_entity($form, $form_state);//
  $staff->save();
  $form_state['redirect'] = 'admin/structure/staffs';
 
 
  }
 
22.04.2012 16:09
Аватар пользователя Spleshka
Spleshka написал:

$file_id = $file->fid ? Или я неправильно вас понял?

26.04.2012 00:50
Аватар пользователя Лена
Лена написал:

Можете и мне подсказать. Код понятен, но здесь человек делает свою темизированную страничку, и код пихает в модуль. Можно ли как-то вызвать загрузку аватара прямо из профиля?. Например есть кнопка "Загрузить изображение", нажимая на которую человек сразу мог выбрать фотографию. или же например, вывести форму загрузки фото в табе. Если так то куда пихать данный код?

25.09.2013 17:48
Аватар пользователя Spleshka
Spleshka написал:

Вам придётся самостоятельно это делать - создавать форму с кнопкой загрузки. Либо же брать готовую форму с редактированием профилем пользователя, и вырезать оттуда лишнее.

25.09.2013 20:19
Аватар пользователя Гость
Гость написал:

можете еще помочь? делаю так:

function custom_picture_form() {
  global $user;
 
  $form = array(
    '#attributes' => array('enctype' => 'multipart/form-data'),
  );
  $form['picture']['picture_upload'] = array(
  '#type' => 'file',
  '#title' => t('Upload picture'),
  '#size' => 28,
  '#description' => t('Your virtual face or picture. Maximum dimensions are %dimensions and the maximum size is %size kB.',
  array('%dimensions' => variable_get('user_picture_dimensions', '85x85'),
  '%size' => variable_get('user_picture_file_size', '30'))) .' '. variable_get('user_picture_guidelines', '')
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Отправить',
  );
 
  $form['#uid'] = $user->uid;
 
  return $form;
}
 
function custom_picture_form_validate($form, &$form_state) {
  // If required, validate the uploaded picture.
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '130x130')),
    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
  );
  if ($file = file_save_upload('picture_upload', $validators)) {
    // Remove the old picture.
    if (isset($form_state['values']['_account']->picture) && file_exists($form_state['values']['_account']->picture)) {
      file_delete($form_state['values']['_account']->picture);
    }
 
    // The image was saved using file_save_upload() and was added to the
    // files table as a temporary file. We'll make a copy and let the garbage
    // collector delete the original upload.
    $info = image_get_info($file->filepath);
    $destination = variable_get('user_picture_path', 'pictures') .'/picture-'. $form['#uid'] .'.'. $info['extension'];
    if (file_copy($file, $destination, FILE_EXISTS_REPLACE)) {
      $form_state['values']['picture'] = $file->filepath;
 
      // То что добавил
      cache_clear_all($form['#uid'] .':', 'cache_menu', TRUE);
      cache_clear_all();
      drupal_set_message(t('The changes have been saved.'));
    }
    else {
      form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
    }
  }
}

потом вывожу где мне надо, вот так:

<?php
module_load_include('user', 'mymodule.module');
echo drupal_get_form('custom_picture_form');
?>

форма загрузки выводиться и изображение сохраняет в files (но саму картинку не видно), как мне теперь сделать что бы это изображение циплялось к юзеру и сразу отображалось

Мне кажется, что копать нужно где-то сюда:

$errors = file_validate($file, $validators);
if (empty($errors)) {
  file_save($file);
  $edit['picture'] = $file;
  user_save($account, $edit);
}

(код для 7-рки)

То-есть нужно сохранить каким то образов картинку в юзере. Нужна помощь, натолкните...

07.10.2013 18:05
Аватар пользователя Spleshka
Spleshka написал:

Я могу ошибаться, но вам в сабмите формы надо сделать примерно следущее:

$account->picture = (object) $file;
user_save($account);
07.10.2013 18:49
Аватар пользователя Гость
Гость написал:

что-то типа такого?

function custom_picture_form_submit($form, &$form_state){
$account->picture = (object) $file;
user_save($account);
}

?

11.10.2013 18:57
Аватар пользователя Spleshka
Spleshka написал:

По сути да, только файл надо из $form_state забрать.

14.10.2013 16:50

Комментировать