Предпросмотр формы загрузки файлов перед отправкой

Главные вкладки

Аватар пользователя erikson erikson 24 декабря 2012 в 13:59

Создаю форму обращений посетителей. Посетители заполняют форму: выбирают из выпадающих списков свой адрес (улицу, дом), заполняют текст обращения, прикрепляют файлы. Заполненная форма отсылается на некий емайл со ссылками на прикрепленные файлы (которые аккуратно складываются в директории сайта sites/default/files/attaches).
Все работает если не использовать предпросмотр сообщения перед отправкой. Но если включить предпросмотр аттачи куда-то теряются, т.е. отправляется текст (без ссылок), а файлы падают в public:// (при валидации) и дальше никуда. Т.е. сабмит не получает никаких данных о файле.
Куда копать не понимаю. Прошу указать направление.

function module_form($form_state) {

$op = isset($_POST['op']) ? $_POST['op'] : '';

$form['pre'] = array(
'#type' => 'fieldset',
'#collapsible' => FALSE,
'#collapsed' => FALSE,
);
$form['pre']['pre_message'] = array('#value' => 'Вводный текст формы.');

if ($op == t('Preview')) {
$form['#after_build'] = array('module_form_add_preview');
}

$form['#attributes']['enctype'] = 'multipart/form-data';

if ($form_state['post']['build']) $bid = $form_state['post']['build'];

$form['address'] = array(
'#type' => 'fieldset',
'#title' => 'Укажите адрес здания',
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);

$street_list = db_street_list('- выберите улицу -');
if ($bid) $street_id = $form_state['post']['street'];

$build_list = array('0' => '- дом -');
if ($street_id) $build_list += db_build_id($street_id);
$build_id = 0;
if ($bid) {
$build_id = $bid;
}
if ($form_state['post']['build']) {
$build_id = $form_state['post']['build'];
}

$form['address']['street'] = array(
'#id' => 'anonim-form-street',
'#type' => 'select',
'#options' => $street_list,
'#default_value' => $street_id,
'#attributes' => array('onChange' => 'loadAnBuild(this)'),
);
$form['address']['build'] = array(
'#id' => 'anonim-form-build',
'#type' => 'select',
'#options' => $build_list,
'#default_value' => $build_id,
);

$form['message'] = array(
'#type' => 'textarea',
'#title' => 'Предложение, жалоба, замечание',
'#description' => 'Это поле для Вашего сообщения. Текст может быть любым, имеющим отношение к деятельности компании. Пример: "На улице А в доме Б проживает большое количество нелегальных мигрантов, прошу принять меры." Или "В нашем подъезде не убирают. Адрес такой-то."',
'#required' => TRUE,
);

$form['files'] = array(
'#type' => 'fieldset',
'#title' => 'Вы можете добавить фото или видео',
'#description' => 'Вместе с сообщением Вы можете отправить фотографии (не более трех) и оставить ссылку на видеоролик. Видеоролик можно разместить на любом видеохостинге, например youtube.ru.',
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);

$form['files']['file1'] = array('#type' => 'file', '#title' => 'Файл № 1');
$form['files']['file2'] = array('#type' => 'file', '#title' => 'Файл № 2');
$form['files']['file3'] = array('#type' => 'file', '#title' => 'Файл № 3',
'#description' => 'Разрешенные форматы файлов: изображения (jpeg, jpg, png, gif, bmp), документы (txt, rtf, odf, pdf, doc, docx, ppt, pptx, xls, xlsx), архивы (rar, zip, 7z). Ограничение по размеру одного файла - 2 мегабайта.',
);

$form['files']['video'] = array(
'#type' => 'textfield',
'#title' => 'Ссылка на видеоролик',
'#description' => 'Ссылка на видеоролик. Видеоролик можно разместить на любом видеохостинге, например youtube.ru.',
);

if (!form_get_errors() && (($op == t('Preview')) || ($op == 'Отправить'))) {
$form['submit'] = array('#type' => 'submit', '#value' => 'Отправить', '#weight' => 19);
}

$form['preview'] = array('#type' => 'button', '#value' => t('Preview'), '#weight' => 20);

return $form;
}

function module_form_add_preview($form, &$form_state) {

drupal_validate_form($form['form_id']['#value'], $form, $form_state);

$values = $form_state['values'];
$text = '';

if (!form_get_errors()) {

$text .= 'Указанный Вами адрес:
';
$text .= ($values['build']) ? bs_id_to_address($values['build']) : 'адрес не указан.';
$text .= '';

$text .= 'Ваше сообщение:
' . $values['message'] . '';

$text .= 'Список прикрепленных файлов:
';
if (!$values['file1'] && !$values['file2'] && !$values['file3']) {
$text .= 'нет файлов.';
}
else {
$text .= ($values['file1']) ? $values['file1']->filename . '
' : '';
$text .= ($values['file2']) ? $values['file2']->filename . '
' : '';
$text .= ($values['file3']) ? $values['file3']->filename . '
' : '';
}
$text .= '';

$text .= 'Ссылка на видеоролик:
';
$text .= ($values['video']) ? $values['video'] : 'отсутствует.';
$text .= '';
}

$form['send_message'] = array(
'#value' => $text,
'#prefix' => '

',
'#suffix' => '

',
);

return $form;
}

function module_form_validate($form, &$form_state) {

$op = isset($_POST['op']) ? $_POST['op'] : '';

$dest = 'public://';
$validators = array(
'file_validate_size' => array(5 * 1024 * 1024),
'file_validate_extensions' => array('jpeg jpg png gif bmp txt rtf odf pdf doc docx ppt pptx xls xlsx rar zip 7z'),
);

if ($op == t('Preview')) {
$file1 = file_save_upload('file1', $validators, $dest);
if ($file1) $form_state['values']['file1'] = $file1;
$file2 = file_save_upload('file2', $validators, $dest);
if ($file2) $form_state['values']['file2'] = $file2;
$file3 = file_save_upload('file3', $validators, $dest);
if ($file3) $form_state['values']['file3'] = $file3;
}

}

function module_form_submit($form, &$form_state) {

$values = $form_state['values'];
$dir = 'sites/default/files/attaches/';

if ($values['file1']) {
$result = file_move($values['file1'], $dir, FILE_EXISTS_RENAME);
if (!$result) drupal_set_message('Ошибка сохранения файла.');
}
if ($values['file2']) {
$result = file_move($values['file2'], $dir, FILE_EXISTS_RENAME);
if (!$result) drupal_set_message('Ошибка сохранения файла.');
}
if ($values['file3']) {
$result = file_move($values['file3'], $dir, FILE_EXISTS_RENAME);
if (!$result) drupal_set_message('Ошибка сохранения файла.');
}

//Пишем сообщение в базу
$db_write = array(...);
if (drupal_write_record('bd_table', $db_write)) {

// отправляем мессагу

drupal_set_message('Сообщение отправлено.');
}
}

Комментарии