Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Modul-Entwicklung ›

AHAH für gethemtes Formular

Eingetragen von djdops (30)
am 25.05.2009 - 14:12 Uhr in
  • Modul-Entwicklung
  • Drupal 6.x

Moin alle,

ich versuche mich gerade zum ersten mal an AHAH. Allerdings ist schon die Ausgangsposition nicht ganz einfach. Ich habe ein Formular mit einem eigenem Element, welches ich in eine Tabelle theme. Unter der Tabelle wird ein Drop-Down angezeigt. Wird ein Wert im Drop-Down ausgewählt, soll die Tabelle eine weitere Zeile bekommen. Was ich immerhin schon hinbekommen habe ist, das beim ändern des Drop-Down ein Ladebalken angezeigt wird. Das wars dann auch schon...

Das ist mein Form:

<?php
function cardgenerator_manage_game_layouts_form(&$form_state) {
   
$gameInfo = _get_games_info(arg(4));
   
   
$items['layout-wrapper'] = array(
       
'#tree' => false,
       
'#prefix' => '<div class="clear-block" id="layout-wrapper">',
       
'#suffix' => '</div>',
    );
   
    foreach (
$gameInfo['card_types'] as $cardTypeId => $cardType) {
       
$items['layout-wrapper'][$cardType['_type']] = array(
           
'#type' => 'fieldset',
           
'#title' => $cardType['label'],
           
'#collapsible' => true,
           
'#collapsed' => false,
        );
       
$items['layout-wrapper'][$cardType['_type']]['layouts'] = array(
           
'#type' => 'selected_layout_elements',
           
'#default_value' => $cardType['game_card_type_id'],
        );
       
       
$sql = 'SELECT                l.id,
                                                    l.name,
                                                    l.description,
                                                    l.card_size_x,
                                                    l.card_size_y
                        FROM                    mks_crdgen_layouts as l'
;
       
$result = db_query($sql);
       
$options[0]    = t('-- Chose layout --');
        while (
$row = db_fetch_array($result)) {
           
$options[$row['id']]    = $row['name'] . ' (' . $row['card_size_x'] . 'x' . $row['card_size_y'] . ')';
        }
       
       
$items['layout-wrapper'][$cardType['_type']]['select'] = array(
           
'#type' => 'select',
           
'#id' => 'layout-select-'.$cardType['game_card_type_id'],
           
'#name' => 'layout-select-'.$cardType['game_card_type_id'],
           
'#options' => $options,
           
'#attributes' => array('class' => 'layout-select'),
           
'#ahah' => array(
               
'path' => '/layout/get-layout-infos',
               
'event' => 'change',
               
'progress' => array('type' => 'bar', 'message' => t('Please wait...')),
               
'wrapper' => 'result-wrapper',
               
'effect' => 'fade',
            )
        );
    }
   
    if (
count($items) > 0) {
       
$items['submit'] = array(
           
'#type' => 'submit',
           
'#id' => 'submit',
           
'#name' => 'submit',
           
'#value' => t('Save'),
        );
    }
   
/*print_r($items);
    echo '<br><br>';*/
   
return $items;
}
?>

Und das die Theme-Funktion für mein Element:

<?php
function theme_selected_layout_elements($element) {
   
//print_r($element);
   
$layouts = _get_layouts_for_game_card_type($element['#default_value']);
   
//print_r($element);
   
if (count($layouts) == 0) {
       
$noLayoutsRow[] = array(
           
'data' => t('There are no layouts selected for this card type.'),
        );
       
$rows[]    = $noLayoutsRow;
    } else {
        foreach (
$layouts as $layout) {
           
$weight    = array(
               
'#type' => 'textfield',
               
'#id' => 'weight-' . $layout['id'],
               
'#name' => 'weight-' . $layout['id'],
               
'#value' => $layout['weight'],
               
'#attributes' => array('style' => 'display: none;'),
            );
           
$row        = array();
           
$row[]    = array('data' => $layout['id']);
           
$row[]    = array('data' => theme('image', file_directory_path().'/card_generator/layouts/'.$layout['id'].'.jpg', $layout['name'], $layout['name']));
           
$row[]    = array('data' => $layout['name']);
           
$row[]    = array('data' => $layout['description']);
           
$row[]    = array('data' => theme('image', drupal_get_path('module', 'cardgenerator') . '/images/kreuz.gif', t('delete'), t('delete')));
           
$row[]    = drupal_render($weight);
        }
       
$rows[]    = array('data' => $row, 'class' => 'draggable');
    }
    unset(
$row);
   
   
// Adding the drop-down-box
    /*$row[] = array('data' => theme_layout_select($element['#value'], $element['#value']), 'colspan' => 5);
    $rows[]    = $row;*/
   
$head    = array(t('Id'), t('Preview'), t('Name'), t('Description'), '', '');
   
$output = theme('table', $head, $rows, array('id' => 'card-type-' . $element['#default_value'] . '-table'));
   
   
drupal_add_tabledrag('card-type-' . $element['#default_value'] . '-table', 'order', 'sibling', 'weight', null, null, false);
   
    return
$output;
}
?>

Und der AHAH-Callback:

<?php
function ajax_get_layout_info() {
   
// The form is generated in an include file which we need to include manually.
 
include_once 'modules/node/node.pages.inc';
 
// We're starting in step #3, preparing for #4.
 
$form_state = array('storage' => NULL, 'submitted' => FALSE);
 
$form_build_id = $_POST['form_build_id'];
 
// Step #4.
 
$form = form_get_cache($form_build_id, $form_state);
 
 
// adding selected layout
 
$form['layout-wrapper'][$cardType['_type']]['layouts'] = print_r($_POST, true);
 
 
form_set_cache($form_build_id, $form, $form_state);
 
 
// Preparing for #5.
 
$args = $form['#parameters'];
 
$form_id = array_shift($args);
 
$form_state['post'] = $form['#post'] = $_POST;
 
$form['#programmed'] = $form['#redirect'] = FALSE;

 
// Step #5.
 
drupal_process_form($form_id, $form, $form_state);
 
// Step #6 and #7 and #8.
 
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
 
 
 
 
$output = drupal_render($form['layout-wrapper'][$cardType['_type']]['layouts']);
 
 
// Final rendering callback.
 
drupal_json(array('status' => TRUE, 'data' => $output));
}
?>

Kann mir bitte jemand helfen? Ich weiß nicht so richtig wie ich weiter machen soll, geschweige denn ob ich überhaupt alles richtig gemacht habe (wohl eher nicht).

Beste Grüße
djdops

‹ Durch ahah erstellter Button funktioniert nicht Cacheverhalten während des Entwickeln - Wie vorgehen? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Habs geschafft

Eingetragen von djdops (30)
am 25.05.2009 - 16:20 Uhr

Ok, ich hab den Fehler selbst gefunden. Ich hab einen falschen Wrapper angegeben... Nun wird die Callback-Funktion aufgerufen.

<?php

function ajax_get_layout_info() {
   
// Searching in submitted data for added layouts
   
foreach ($_POST as $key => $value) {
        if (
strpos($key, 'layout-select') !== null) {
            if (
$value != 0) {
               
$gameCardTypeId    = str_replace('layout-select-', '', $key);
               
$insert[]    = '(' . $gameCardTypeId . ', ' . $value . ')';
            }
        }
    }
   
   
// Bind new layout to game card type
   
if (count($insert) > 0) {
       
$sql = 'INSERT INTO        mks_crdgen_game_card_type_layouts
                                                    (game_card_type_id, layout_id)
                        VALUES                '
. implode(', ', $insert);
       
db_query($sql);
    }
   
   
// We're starting in step #3, preparing for #4.
 
$form_state = array('storage' => NULL, 'submitted' => FALSE);
 
$form_build_id = $_POST['form_build_id'];
 
// Step #4.
 
$form = form_get_cache($form_build_id, $form_state);
   
 
// Preparing for #5.
 
$args = $form['#parameters'];
 
$form_id = array_shift($args);
 
$form_state['post'] = $form['#post'] = $_POST;
 
$form['#programmed'] = $form['#redirect'] = FALSE;

 
// Step #5.
 
drupal_process_form($form_id, $form, $form_state);
 
// Step #6 and #7 and #8.
 
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
   
   
// Final rendering callback.
 
drupal_json(array('status' => TRUE, 'data' => drupal_render($form)));
}

?>

Hier trage ich die Auswahl des Drop-Down in die DB ein, und will dann das Formular einfach neu laden. form_get_cache() gibt dabei auch das gesammt Formular-Array zurück. drupal_rebuild_form() baut das Formular neu. Dabei wird merkwürdiger Weise nur der Submit-Button berücksichtigt. Das fieldset, mein eigenes Form-Elemen und das select-Element werden nicht geliefert. Kann mir jemand sagen woran das liegt?

Beste Grüße
djdops

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Ich brauche dringen Hilfe zu Updates oder ggf. wwie geht Composer?
  • wmtbpo361x
  • Rolle erstellen nicht zu finden
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
Weiter

Neue Kommentare

  • Rollen
    vor 5 Tagen 11 Stunden
  • Inzwischen sind wir bei
    vor 2 Wochen 2 Tagen
  • Migrieren von D7 auf D8/ D10/ D11
    vor 2 Wochen 2 Tagen
  • melde mich mal wieder, da ich
    vor 10 Wochen 24 Minuten
  • Hey danke
    vor 10 Wochen 19 Stunden
  • Update: jetzt gibt's ein
    vor 10 Wochen 1 Tag
  • Hallo, im Prinzip habe ich
    vor 10 Wochen 5 Tagen
  • Da scheint die Terminologie
    vor 10 Wochen 6 Tagen
  • Kannst doch auch alles direkt
    vor 11 Wochen 3 Tagen
  • In der entsprechenden View
    vor 11 Wochen 3 Tagen

Statistik

Beiträge im Forum: 250239
Registrierte User: 20468

Neue User:

  • LorisBen
  • StevenEness
  • ocvk2810

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 1 Benutzer und 20 Gäste online.

Benutzer online

  • Gorkde

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association