Решено: ahah загрузка и удаление изображений

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

Аватар пользователя enemis enemis 5 декабря 2011 в 17:17

Здравствуйте уважаемое сообщество. Необходима помощь.
Пишу модуль который загружает для некоторых целей изображения. Пытаюсь выполнить следующее см. рисунок 1. Есть форма для загрузки картинок с помощью ahah. Вот форма передает аргумент add для добавления картинки и номер файла для удаления, когда картинка загружена.
вот у меня получилось, загрузка а вот после нажатия удалить что то происходит не то и страница вроде как субмититься, итолько со второго раза происходит вызов ahah. Мне кажется что то не то делаю и проблема с кешированием форм но как это исправить не пойму помогите пожалуйста.



Исходные коды:

// Implementation of hook_menu()

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.

function node_picture_path_form($form_state, $id, $action) {
        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

function node_picture_ahah_upload($type, $action) {

    $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();
}

Комментарии

Аватар пользователя divined divined 6 декабря 2011 в 18:26

Оффтоп: где вариант про то что очень много букавок и не осилил?

По теме:

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

Аватар пользователя enemis enemis 17 декабря 2011 в 22:07

Очевидно, что спасение утопающих дело рук самих утопающих. Вообщем я сам решил свою проблему. После пол ночи дебага я выяснил почему ммой код не работает. Дело в том что друпал в процессе подмены формы, не меняет ahah path, а я пытался ему под сунуть другую функцию и ко всему прочему создавал другой сабмит . После переписывания функции, и с указанием одного и того же сабмита и для удаления и для загрузки все стало на свои места.