Empfehlungen: Erweiterte Suche

Ein Dropdown aus zwei DB-Feldern

Ausgabedaten formatieren und darstellen

Ein Dropdown aus zwei DB-Feldern

Beitragvon doppelD » So 23. Mai 2010, 17:34

Hi,
ich habe in meiner db zwei werte, x-achse und y-achse, die angeben wie groß ein Spielfeld sein kann.
Wenn ich das backen lasse und die bereits vorhandenen Einträge als hasMany-Beziehung in eine andere Tabelle eingeben möcht, macht er mir daraus zwei Eingebemöglichkeiten.
Da die beiden Felder aber nur zusammen richtig sind, möchte ich diese in ein Dropdown stecken und die beiden Werte mit einem "x" verbinden.
Die nächste Schwierigkeit dabei ist, dass beim Eintragen in die neue Tabelle die beiden Werde wieder getrennt gespeichert werden müssen.
Nun möchte ich auch noch wissen, wie ich die beiden Felder in die hasMany-Beziehung bringen kann.
Im Moment habe ich da noch keine Verknüpfung, wodurch nur zwei Input-Felder angezeigt werden.

Tabelle Feldgröße: id, x-achse, y-achse
Tabelle Spiele: id, x-achse, y-achse, ...

Villeicht geht es ja auch, dass ich bei den Spielen die id der Feldgröße speicher und darüber die Anzeige der "x-ache x y-ache" bekomme.

Bitte um Hilfe.
doppelD
 
Beiträge: 21
Registriert: Di 20. Apr 2010, 20:55

Re: Ein Dropdown aus zwei DB-Feldern

Beitragvon Flo » So 23. Mai 2010, 18:37

Bitte stell hier dochmal die Tabellenstruktur und Code der Models rein, dann kann man wesentlich besser verstehen was du hast und wo du hinwillst ;-)
Flo
 
Beiträge: 85
Registriert: Mi 11. Jun 2008, 20:48
Wohnort: Bielefeld
CakePHP-Version: 1.3
OS: Mac OSX 10.6

Re: Ein Dropdown aus zwei DB-Feldern

Beitragvon doppelD » So 23. Mai 2010, 20:10

Tabellen:
CREATE TABLE IF NOT EXISTS `cake_field_sizes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`xachse` int(11) NOT NULL,
`yachse` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=2 ;

CREATE TABLE IF NOT EXISTS `cake_games` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE latin1_german1_ci NOT NULL,
`aera_id` int(11) NOT NULL,
`number_player_id` int(11) NOT NULL,
`round_id` int(11) NOT NULL,
`verbleibende_runden` int(11) NOT NULL,
`waiting_time_id` int(11) NOT NULL,
`xachse` int(11) NOT NULL,
`yachse` int(11) NOT NULL,
`laufend` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=2 ;

Models:
Code: Alles auswählen
<?php
class FieldSize extends AppModel {

    var $name = 'FieldSize';
    var $validate = array(
        'xachse' => array('numeric'),
        'yachse' => array('numeric')
    );

}
?>

Code: Alles auswählen
<?php
class Game extends AppModel {

    var $name = 'Game';
    var $validate = array(
        'name' => array('notempty'),
        'aera_id' => array('numeric'),
        'number_player_id' => array('numeric'),
        'round_id' => array('numeric'),
        'verbleibende_runden' => array('numeric'),
        'waiting_time_id' => array('numeric'),
        'xachse' => array('numeric'),
        'yachse' => array('numeric'),
        'laufend' => array('numeric')
    );

    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $belongsTo = array(
        'Aera' => array(
            'className' => 'Aera',
            'foreignKey' => 'aera_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'NumberPlayer' => array(
            'className' => 'NumberPlayer',
            'foreignKey' => 'number_player_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Round' => array(
            'className' => 'Round',
            'foreignKey' => 'round_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'WaitingTime' => array(
            'className' => 'WaitingTime',
            'foreignKey' => 'waiting_time_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
                //Hier noch irgendeine Bedingung für xache und yachse oder für die id von field_sizes
    );

}
?>


View:
Code: Alles auswählen
<?php echo $form->create('Game');?>
    <fieldset>
        <legend><?php __('Add Game');?></legend>
    <?php
        echo $form->input('name');
        echo $form->input('aera_id');
        echo $form->input('number_player_id');
        echo $form->input('round_id');
        echo $form->input('verbleibende_runden');
        echo $form->input('waiting_time_id');
        echo $form->input('xachse'); //Diese beiden Inputs zu einem Dropdown machen
        echo $form->input('yachse');
        echo $form->input('laufend', array( 'value' => '0' , 'type' => 'hidden'));
    ?>
    </fieldset>
<?php echo $form->end('Submit');?>


Controller:
Code: Alles auswählen
class GamesController extends AppController {

    var $name = 'Games';
    var $helpers = array('Html', 'Form');

    function add() {
        // Hier wieder beide Werte getrennt in die DB speichern
                if (!empty($this->data)) {
            $this->Game->create();
            if ($this->Game->save($this->data)) {
                $this->Session->setFlash(__('The Game has been saved', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The Game could not be saved. Please, try again.', true));
            }
        }
        $aeras = $this->Game->Aera->find('list');
        $numberPlayers = $this->Game->NumberPlayer->find('list');
        $rounds = $this->Game->Round->find('list');
        $waitingTimes = $this->Game->WaitingTime->find('list');
        $this->set(compact('aeras', 'numberPlayers', 'rounds', 'waitingTimes'));
    }
}


Und hier noch wie ich das ohne CakePHP gemacht hatte:
Code: Alles auswählen
$spiel = insert_next_value ('spiele', 'spid');
$feldgroesse = mysql_query("SELECT xachse, yachse FROM feldgroesse WHERE fgid='".mysql_real_escape_string($_POST['feldgroesse'])."'");
$row_feldgroesse = mysql_fetch_assoc($feldgroesse);
$kommando = "UPDATE spiele SET name='".mysql_real_escape_string($_POST['sname'])."', aera='".mysql_real_escape_string($_POST['aera'])."', spieler_anzahl='".mysql_real_escape_string($_POST['spielerzahl'])."', max_runden='".mysql_real_escape_string($_POST['rundenzahl'])."', verbleibende_runden='".mysql_real_escape_string($_POST['rundenzahl'])."', wartezeit='".mysql_real_escape_string($_POST['rundenzeit'])."', xachse='".mysql_real_escape_string($row_feldgroesse['xachse'])."', yachse='".mysql_real_escape_string($row_feldgroesse['yachse'])."' WHERE spid='$spiel'";
$result = mysql_query($kommando);
 

Code: Alles auswählen
echo '<select name="feldgroesse" style="width: 140px">';
echo '<option value="0">Spielfeldgröße</option>';
$feldgroesse = mysql_query("SELECT fgid, xachse, yachse FROM feldgroesse");
while ($row_feldgroesse = mysql_fetch_assoc($feldgroesse)) {
    echo '<option value="'.$row_feldgroesse['fgid'].'" ';
    if (isset($_GET['feldgroesse']) &amp;&amp; $_GET['feldgroesse'] == $row_feldgroesse['fgid']) {
           echo 'selected';
    }
    echo '>'.$row_feldgroesse['xachse'].'x'.$row_feldgroesse['yachse'].' Felder</option>';
}
echo '</select><br />';
 


Jetzt soll bei games/add sowas stehen wie:
Feldgröße
"Dropdown"20x10"Dropdown"

Ich weiß, es ist etwas kompliziert (und jetzt viel Code), aber ich hoffe Ihr könnt mir trotzdem helfen.
doppelD
 
Beiträge: 21
Registriert: Di 20. Apr 2010, 20:55

Re: Ein Dropdown aus zwei DB-Feldern

Beitragvon phyrexianer » Di 25. Mai 2010, 10:04

Habe mir zwar nicht alles Haargenau durchgelesen, aber das hier könnte dir wohl weiter helfen
phyrexianer
 
Beiträge: 30
Registriert: Fr 19. Jun 2009, 10:52

Re: Ein Dropdown aus zwei DB-Feldern

Beitragvon doppelD » Di 25. Mai 2010, 14:25

Anscheinend bin ich zu dumm um des zu verstehen.

Hab jetzt mal folgendes in mein Model gepackt:
Code: Alles auswählen
var $actsAs = array('MultipleDisplayFields'  => array(
        'fields' => array('Game.xachse', 'Game.yachse'),
        'defaults' => array('---','x','----'),
        'pattern' => '%s %s'
));

Es hat sich nichts verändert.
Und wenn es funktionieren würde, bleibt immer noch die Frage, wie ich des dann wieder getrennt in die DB bekomme.
In dem Fall wollte er es ja nur zusammen auf dem Bildschirm anzeigen lassen.
doppelD
 
Beiträge: 21
Registriert: Di 20. Apr 2010, 20:55


Zurück zu Views

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast