Konzeptionelle Umsetzung "tabs, Combi, Update"

Hallo Zusammen

Könnt Ihr mir einen konzeptionellen Tipp geben wie man folgende Beschreibung richtig umsetzt? Mit einem textbasierten tipp wäre mir bereits geholfen.

Ich möchte das der Benutzer mit einem Kombinationsfeld ein Projekt auswählen kann. In Tabs sollen dann verschiedene Tabellen, welche alle einen Fremdschlüssel des ausgewählten Projekts beinhalten, zur weiteren Verarbeitung angeboten werden.

Wo rendere ich das Kombinationsfeld Formular? Im Controller? in der View?

Folgende Formulare habe ich erstellt:

  • "Show_Projekt" = Diese View wird Controller aufgerufen. Siehe Controllercode
  • "_FormCmbAuswahl" = Kombinationsfeld für die Auswahl des Projekt

4319

24-05-2013 07-38-57.png

Controller




 public function actionShow_Projekt() {


        if (Yii::app()->user->isGuest) {

            $this->fnc_ShowLogin();

        } else {

             $this->render('Show_Projekt'

            )); 

           

        }



Show_Projekt (View)





$modelProjekt = new Tbl_Projekt; 


 // Kombinationsfeld anzeigen

 $this->renderpartial('_FormCmbAuswahl' ,array('model1' => $modelProjekt));




$this->widget('zii.widgets.jui.CJuiTabs', array(

    'tabs' => array(

        'Projekt' => $this->renderPartial(''), true

  ),

    'options' => array(

        'collapsible' => false,

    ),

));



_FormCmbAuswahl




<?php


$form = $this->beginWidget('CActiveForm', array(

    'id' => 'project-form',

    'enableAjaxValidation' => true,

        ));

 

echo $form->dropDownList($model1, 'primary', CHtml::listData(Tbl_Projekt::model()->findAll(), 'primary', 'Projektname'), array('style' => 'width:150px;','submit'=>array('Tbl_Projekt/Show_Projekt', 'model1' => $model1))

);


$this->endWidget();

?>



Hallo, Beat

Du kannst in eine <Form> das Kombinationsfeld und Tabs mit Tabellen einbauen. Dann wird es kein Problem mit Fremdeschlüssel sein (du kannst Feldname verändern, falls Tbl_project[primary] gefällt dir nicht).

Ich würde alle zwei Views, dass du hier angezeigt hast, in ein View kombinieren (aber nur in Fall, wenn du _FormCmbAuswahl nicht irgendwo in andere View brauchst).

Definitiv in der View. Rendering-Logik hat im Controller nichts verloren.

Ich bin mir nicht ganz sicher, was du mit den bearbeitbaren Fremdschlüsseln erzielen willst. Prinzipiell würde ich das aber so halten, dass nach der Auswahl eines Projektes ein Formular via Ajax nachgeladen wird, welches bereits vorgefüllt ist. Dazu bietet sich am ehesten eine weitere Action in deinem Controller an, die die ID des Projekts nimmt und das besagte Formular als partielle View bereitstellt.

Hallo Zusammen

Wo oder wie sollte ich das ausgewählt Projekt am besten speichern? In der Session, in Globaler var, in einer Temp Tabelle?

Aktueller Ablauf:

actionTestform --> Kombinationsfeld wird angzeiegt –> submit bei Auswahl --> [size="2"]actionCmbAuswahl --> Kombinationsfeld + Tabs (Tab 1 = Updateformular) wird angzeigt –> Updateformular absenden --> Die $_POST[primary] vom Kombinationsfeld ist durch das erneute Laden des Formulars nicht mehr bekannt.[/size]

Controller





 public function actionTestform() {


        $this->render('_FormProjekt');

    }


    public function actionCmbAuswahl() {




        $SelectProjekt = $_POST['id'];    // <----- wo oder wie speichern?

 		$model = Tbl_Entwicklung::model()->FindByPk($SelectProjekt);


        if (isset($_POST['Tbl_Entwicklung'])) {


            // Aktualisieren

            $this->Actionupdate($SelectProjekt);

        }


        $this->render('testform', array('model' => $model));

    }




_FormProjekt


<br><br> <?php


// Projekt auswählen

$model1 = new Tbl_Entwicklung;


$form = $this->beginWidget('CActiveForm', array(

    'id' => 'project-form',

    'enableAjaxValidation' => true,

        ));


echo $form->dropDownList($model1, 'primary', CHtml::listData(Tbl_Entwicklung::model()->findAll(), 'primary', 'Arbeitspaket'), array(

    'style' => 'width:150px;',

    'submit' => array('/Tbl_Entwicklung/CmbAuswahl'),

    'params' => array('id' => 'js: $(this).val()'))    // <---- anders machen?

);


$this->endWidget();

?>

testform





<br><br>

<?php

// Kombinationsfeld anzeigen

$this->renderpartial('_FormProjekt', true);




// Tabs erstellen

$this->widget('zii.widgets.jui.CJuiTabs', array(

    'tabs' => array(

   	'Projekt' => $this->renderPartial('update', array('model' => $model), true

        ),

        'Team ' => $this->renderPartial('/tbl_Team/admin', array('model' => Tbl_Team::model()->OffeneAnfragen()), TRUE

        ),

        'Nachrichten ' => $this->renderPartial('/tbl_Nachricht/admin', array('model' => Tbl_Nachricht::model()->Nachrichten()), TRUE

        ),

        'Arbeit' => array('content' => 'Content for tab 2', 'id' => 'tab2'),

    ),

    'options' => array(

        'collapsible' => false,

    ),

));




Der Arbeitsablauf ist hier leider auch nicht ganz klar. Am ehesten wird aber wohl ein Hidden Field ausreichen, um die ID des Projekts weiterzureichen. Für eine längerfristige Speicherung (zum Beispiel weil der Nutzer in den Kontext eines bestimmten Projekts verbleibt), wird am ehesten die Session herhalten müssen. Globale Variablen und temporäre Tabellen wären in diesem Fall ein klares Antipattern.

Mal eine Frage: Hast du irgendwie einen Hintergrund in .NET? Deine Namensgebungen scheinen darauf hinzuweisen.

Klappt bestens, vielen Dank.




        if (isset($_POST['id'])) {

       	Yii::app()->session['Projekt'] = $_POST['id'];

        }  

        

        $SelectProjekt = Yii::app()->session['Projekt'];

Zu meiner Herkunft: Ich komme aus der verpönten Welt des MSAccess VBA . Mein Weg ist noch sehr lang aber macht riesen Spass. Hier auch mal ein Danke für die super Unterstützung von uns Newbie.