Здравствуйте уважаемое сообщество. Необходима помощь.
Пишу модуль который загружает для некоторых целей изображения. Пытаюсь выполнить следующее см. рисунок 1. Есть форма для загрузки картинок с помощью ahah. Вот форма передает аргумент add для добавления картинки и номер файла для удаления, когда картинка загружена.
вот у меня получилось, загрузка а вот после нажатия удалить что то происходит не то и страница вроде как субмититься, итолько со второго раза происходит вызов ahah. Мне кажется что то не то делаю и проблема с кешированием форм но как это исправить не пойму помогите пожалуйста.
Исходные коды:
function node_picture_menu() {
$items = array();
$items['admin/settings/node_picture/file_upload/%/%'] = array(
'title' => ('Node picture settings'),
'page callback' => 'node_picture_ahah_upload',
'page arguments' => array(4,5),
'access callback' => TRUE,
'description' => 'Ahah callback for upload images',
'type' => MENU_CALLBACK,
);
return $items;
}
Форма рис 1.
drupal_add_css(drupal_get_path('module', 'node_picture') . '/node_picture.css', 'module');
if ($action == 'edit') {
if ($node_picture = db_fetch_object(db_query_range('SELECT * FROM {node_picture} WHERE npid=%d', $id, 0, 1))) {
$form_state['storage']['path'] = $node_picture->path;
if ($node_picture->fid_img) {
$form_state['storage']['file_img'] = db_fetch_object(db_query_range('SELECT fid,filepath FROM {files} WHERE fid=%d', $node_picture->fid_img, 0, 1));
}
if ($node_picture->fid_ico) {
$form_state['storage']['file_ico'] = db_fetch_object(db_query_range('SELECT fid,filepath FROM {files} WHERE fid=%d', $node_picture->fid_ico, 0, 1));
}
}
}
$form['#cache'] = TRUE;
$form ['#attributes'] = array('enctype ' => 'multipart/form-data');
$form['node_picture'] = array(
'#type' => 'fieldset',
);
$form['node_picture']['path'] = array(
'#type' => 'textfield',
'#title' => 'Относительный путь',
'#description' => 'Введите относительный путь без /. Используйте * для указания всех возможных вариантов. Например: news/* означает все страницы
находящиеся после www.имясайта.домен/news/',
'#required' => false,
);
if ($form_state['storage']['path']) {
$form['node_picture']['path']['#default_value'] = $form_state['storage']['path'];
if ($form_state['storage']['path'] == 'default') {
$form['node_picture']['path']['#attributes'] = array('readonly' => 'readonly');
$form['node_picture']['path']['#description'] = 'Значение по умолчанию';
}
}
if ($form_state['storage']['file_img']) {
$form['node_picture_img'] = array(
'#type' => 'fieldset',
'#prefix' => '<div id="img_file">',
'#value' => '<div class="info">Изображение для страницы:</div><img src="/'.$form_state['storage']['file_img']->filepath.'" height="95px"/>',
'#suffix' => '</div>'
);
$form['node_picture_img']['img'] = array(
'#type' => 'submit',
'#value' => 'Удалить',
'#ahah' => array(
'path' => 'admin/settings/node_picture/file_upload/img/'.$form_state['storage']['file_img']->fid,
'wrapper' => 'img_file',
'event' => 'click',
'method' => 'replace',
'effect' => 'fade',
),
);
} else {
$form['node_picture_img'] = array(
'#prefix' => '<div id="img_file">',
'#type' => 'fieldset',
'#suffix' => '</div>'
);
$form['node_picture_img']['upload_img'] = array(
'#type' => 'file',
'#title' => ('Загрузка изображения для страницы'),
'#description' => 'Форматы для загрузки jpg, png, gif',
'#size' => 40
);
$form['node_picture_img']['submit_img'] = array(
'#type' => 'submit',
'#value' => 'Загрузить',
'#ahah' => array(
'path' => 'admin/settings/node_picture/file_upload/img/add',
'wrapper' => 'img_file',
'event' => 'click',
'method' => 'replace',
'progress' => array('type' => 'bar', 'message' => t('Please wait...')),
'effect' => 'fade',
),
);
}
if ($form_state['storage']['file_ico']) {
$form['node_picture_ico'] = array(
'#type' => 'fieldset',
'#prefix' => '<div id="ico_file">',
'#value' => '<div class="info">Иконка для страницы:</div><img src="/'.$form_state['storage']['file_ico']->filepath.'" height="95px"/>',
'#suffix' => '</div>'
);
$form['node_picture_ico']['ico'] = array(
'#type' => 'submit',
'#value' => 'Удалить',
'#ahah' => array(
'path' => 'admin/settings/node_picture/file_upload/ico/'.$form_state['storage']['file_ico']->fid,
'wrapper' => 'ico_file',
'event' => 'click',
'method' => 'replace',
'effect' => 'fade',
),
);
}
else{
$form['node_picture_ico'] = array(
'#prefix' => '<div id="ico_file">',
'#type' => 'fieldset',
'#suffix' => '</div>'
);
$form['node_picture_ico']['upload_ico'] = array(
'#type' => 'file',
'#title' => ('Загрузка иконки для страницы'),
'#description' => 'Форматы для загрузки jpg, png, gif',
'#size' => 40
);
$form['node_picture_ico']['submit_ico'] = array(
'#type' => 'submit',
'#value' => 'Загрузить',
'#ahah' => array(
'path' => 'admin/settings/node_picture/file_upload/ico/add',
'wrapper' => 'ico_file',
'event' => 'click',
'method' => 'replace',
'progress' => array('type' => 'bar', 'message' => t('Please wait...')),
'effect' => 'fade',
),
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Сохранить',
'#suffix'=>'</div>',
);
return $form;
}
Собственно функция ahah
$debug[0] = $form_build_id = $_POST['form_build_id'];
$form_state = array('storage' => NULL, 'submitted' => FALSE,);
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
$args = $form['#parameters'];
$form_id = array_shift($args);
$form['#post'] = $_POST;
$form['#redirect'] = FALSE;
$form['#programmed'] = FALSE;
$form_state['post'] = $_POST;
switch ($action) {
case 'add':
$validators = array(
'file_validate_extensions' => array('jpg png gif'),
'file_validate_is_image' => array(),
);
if ($file = file_save_upload('upload_' . $type, $validators, file_directory_temp())) {
$form_state['storage']['file_' . $type] = $file;
}
else
form_set_error('upload_' . $type, 'Необходимо выбрать изображение.');
break;
default:
global $file;
$file = $form_state['storage']['file_' . $type];
unset($form_state['storage']['file_' . $type]);
break;
}
drupal_process_form($form_id, $form, $form_state);
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
$new_form = $form['node_picture_' . $type];
$output = theme('status_messages') . drupal_render($new_form);
print_r(drupal_to_js(array('status' => TRUE, 'data' => $output, 'debug' => $debug, 'FORM' => $form, 'FORM_STATE' => $form_state, 'post' => $_POST, 'file' => $file)));
exit();
}
Комментарии
Что совсем никто не знает как помочь?
Оффтоп: где вариант про то что очень много букавок и не осилил?
По теме:
drupal_process_form($form_id, $form, $form_state);
разве не вызывает сабмит формы?
попробуйте не через
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
а через
$form = form_builder($form_id, $form, $form_state);
если на форме ваш ахах делает изменения незабывайте обновлять кэш после изменений:
form_set_cache($form_build_id, $form, $form_state);
Очевидно, что спасение утопающих дело рук самих утопающих. Вообщем я сам решил свою проблему. После пол ночи дебага я выяснил почему ммой код не работает. Дело в том что друпал в процессе подмены формы, не меняет ahah path, а я пытался ему под сунуть другую функцию и ко всему прочему создавал другой сабмит . После переписывания функции, и с указанием одного и того же сабмита и для удаления и для загрузки все стало на свои места.