Tabellarische Eingabe - Suchformular

Hallo,

ich habe nun versucht, eine tabellarische Eingabe - so wie in der Dokumentation beschrieben - zu implementieren, was mir irgendwie gelungen ist.

Nun habe ich auch ein Suchformular hinzugefügt. Dieses will aber nicht funktionieren.

Ich hatte das ganze auch schon probiert mit der Extension Multimodelform. Da funktioniert zwar die Suche mit dem Suchformular aber wenn man das Suchergebnis mehr als eine Seite braucht, dann wird nach Klick auf den Pager wieder alles angezeigt. Funktioniert also auch nicht richtig.

Trotzdem interessiert mich, warum es hier nicht geht. Leider verstehe ich nicht, wie eigentlich eine Suche von Yii abgewickelt wird. Es gibt ja keine eigene Action "search" im Controller. Die Methode "search" im Model wird wohl irgendwie aufgerufen aber wie und wo … ?

Hier ist der Code der Action im Controller, welche die Seite mit dem Formular für die tabellarische Eingabe anzeigt. Die Auswertung der Suche habe ich hier irgendwie versucht, aber es werden immer alle Datensätze angezeigt.


        public function actionBatchUpdate()

        {

            $model=new Noten();

            $criteria = new CDbCriteria();


            $dataProvider =  $model->search();

            $criteria = $dataProvider->criteria;


            $count=$model->count($criteria); echo $count;


            $pages=new CPagination($count);

            $pages->pageSize=6;

            $pages->applyLimit($criteria);


            $items = $model->findAll($criteria);


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

                $valid=true;

                foreach($items as $i=>$item)

                {

                    if(isset($_POST['Noten'][$i]))

                        $item->attributes=$_POST['Noten'][$i];

                    $valid=$item->validate() && $valid;

                }

            }

            $this->render('batchUpdate', array(

                'model' => $model,

                'items' => $items,

                'pages' => $pages,

            ));

        }

Das ist der Code des aufgerufenen Formulars. Die Pagination funktioniert. Das Suchformular wird auch angezeigt. Ich kann Suchbegriffe eingeben. Aber nach Klick auf "search" erscheinen immer alle Datensätze. Die Suche funktioniert also nicht.




Yii::app()->clientScript->registerScript('search', "

$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

");


echo CHtml::link('Daten suchen','#',array('class'=>'search-button')); ?>

<div class="search-form" style="display:none">

<?php $this->renderPartial('_search',array('model'=>$model,));?>

</div><!-- search-form -->


<div class="form">


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

    'id'=>'noten-multiform',

    'enableAjaxValidation'=>false,

)); ?>


<table>

<tr>

<th>Komponist</th><th>Werk / Besetzung</th><th>Verlag / Nr</th><th>Reihe</th><th>Anmerkung</th></tr>

<?php foreach($items as $i=>$item): ?>

    <tr>

        ...

        <td><?php echo $form->textField($item,"[$i]Werk"); ?><br>

            <?php echo $form->textField($item,"[$i]Besetzung"); ?></td>

        ...

    </tr>

<?php endforeach; ?>

</table>


<div class="row buttons">

        <?php echo CHtml::submitButton('Save'); ?>

</div>


<?php $this->endWidget(); ?>


</div>


<?php $this->widget('CLinkPager', array(

    'pages' => $pages,

)); ?>



Probier mal im Controller:


$model = new Noten('search');

$model->unsetAttributes();


if(isset($_GET['Noten']))

   $model->attributes = $_GET['Noten'];

Der Rest des Controllers müsste natürlich noch entsprechend angepasst werden.

Das Suchformular sollte entsprechend die GET-Methode verwenden. Wenn nicht, dann muss der Code auf $_POST umgeschrieben werden.

Wenn du im Firefox testest, empfiehlt sich zudem beispielsweise Firebug, um die versendeten Parameter zu prüfen.

Danke für die Hilfestellung.

Ich habe mit viel Mühe nun doch ein bisschen mehr Durchblick in Yii bekommen.

So habe ich nun die Extension multimodelform zum Bearbeiten der Sammelhefte implementiert. Code aus dem Controller Sammelhefte:




public function actionUpdate($id) { 

    Yii::import('ext.multimodelform.MultiModelForm');

    $model=$this->loadModel($id);

    $member = new Noten;

    $validatedMembers = array();


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

	$model->attributes=$_POST['Sammelhefte'];


	//the value for the foreign key

	$masterValues = array ('Sammelheft_Id'=>$model->Id);


	//Save the master model after saving valid members

	if ( MultiModelForm::save($member,$validatedMembers,$deleteMembers,$masterValues) 

            and $model->save() )

	    $this->redirect(Yii::app()->user->getState('returnUrl'));

    } else 

	$this->render('update',array(

	    'model'=>$model,

	    'member'=>$member,

	    'validatedMembers' => $validatedMembers,

	    'returnUrl' => Yii::app()->user->getState('returnUrl')

	));

}

Weiters habe ich noch versucht, nach der Anleitung zur Tabellarischen Eingabe in der Yii Dokumentation eine tabellarische Eingabeseite für die Noten zu implementieren, was mir nun auch gelungen ist. Code aus dem Noten Controller:


public function actionBatchUpdate() {

    Yii::app()->user->setState('returnUrl',Yii::app()->createUrl('noten/batchUpdate',$_GET));

    $model=new Noten('search_normal');

    if(isset($_GET['Noten'])) {

	$model->unsetAttributes();

	$model->attributes = $_GET['Noten']; 

    }


    $dataProvider =  $model->search_normal();

    $count=$model->count($dataProvider->criteria);

    $dataProvider->pagination = array('pageSize' => 6);


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

	$valid=true;

	foreach($dataProvider->data as $i=>$item)

	{

	    if(isset($_POST['Noten'][$i]))

		$item->attributes=$_POST['Noten'][$i]; 

		$valid=$item->validate() && $valid;

		$item->save();

	}

    }


    $this->render('batchUpdate', array(

	'model' => $model,

	'dataProvider' => $dataProvider,

	'pages' => $dataProvider->pagination,

    ));

}



Das Formular für die tabellarische Eingabe ist kompliziert ausgefallen, funktioniert aber jetzt auch, denke ich.




<?php

...

$zaehler = 0;

$items = $dataProvider->data;

foreach($items as $i=>$model):

$zaehler++;

if (($zaehler % 2) ) $bgcolor = "#E5F1F4";

else $bgcolor = "#FFFFFF";

?>

<tr bgcolor="<?php echo $bgcolor;?>">


<td>

    <?php echo $form->textField($model,"[$i]Id",array("readonly"=>true,"style"=>"width:25px")); ?>

</td>


<td>

    <?php If ( $model->Sammelheft_Id and ! $model->Sammelheft->Komponist_Id or ! $model->Sammelheft_Id ) { ?>

    <div style="width:270px;">

	<div class="row" >

	    <?php echo $form->labelEx($model,"[$i]Komponist_Id"); ?>

	    <?php $Komponisten = CHtml::listData(Komponisten::model()->findAll(array("order"=>"Zuname ASC")),"Id","FullName"); 

		    echo $form->dropDownList($model,"[$i]Komponist_Id", $Komponisten, array("empty"=>"","style"=>"width:190px")); ?>

	    <?php echo $form->error($model,"[$i]Komponist_Id"); 

	} ?> 

	</div>

	<div class="row" >

	    <?php echo $form->labelEx($model,"[$i]Werk"); ?>

	    <?php echo $form->textField($model,"[$i]Werk",array("style"=>"width:200px;")); ?>

	    <?php echo $form->error($model,"[$i]Werk"); ?>

	</div>

	<?php

	if ( $model->Sammelheft ) { ?>

	    <div class="row" >

		<strong>Sammelheft:</strong>

		<?php echo $model->Sammelheft->Titel?>

	    </div> <?php

	} ?>

    </div>

</td>


<td>

    <?php

    if ( $model->Sammelheft ) { 

	if ( $model->Sammelheft->Komponist ) { ?> 

	    <strong>Komponist: </strong> <?php echo $model->Sammelheft->getFullName("common");?> <br>  <?php

	} 

	if ( $model->Sammelheft->Besetzung ) { ?> 

	    <strong>Besetzung: </strong> <?php echo $model->Sammelheft->Besetzung; ?> <br> <?php

	} 

	if ( $model->Sammelheft->Verlag ) { 

	    $VerlagInfo = "<strong>Verlag: </strong>".$model->Sammelheft->Verlag->Name;

	    if ( $model->Sammelheft->Verlag_Nr ) $VerlagInfo .= " ".$model->Sammelheft->Verlag_Nr; 

	    if ( $model->Sammelheft->Reihe ) $VerlagInfo .= " ".$model->Sammelheft->Reihe;

	    $VerlagInfo .= "</br>";

	    echo $VerlagInfo;

	} 

	if ( $model->Sammelheft->Anmerkung ) { ?>

	    <strong>Anmerkung: </strong> <?php echo $model->Sammelheft->Anmerkung;

	} 


	if ( ! $model->Sammelheft->Besetzung ) { ?>

		<?php echo $form->labelEx($model,"[$i]Besetzung"); ?>

		<?php echo $form->textField($model,"[$i]Besetzung",array("size"=>49,"maxlength"=>49)); ?>

		<?php echo $form->error($model,"[$i]Besetzung"); 

	} ?> 

    </div> <?php 

    } else { ?>

    <div style="width:270px;">

	<div class="row">

	    <?php echo $form->labelEx($model,"[$i]Verlag_Id"); ?>

	    <?php $Verlage = CHtml::listData(Verlage::model()->findAll(array("order"=>"Name ASC")),"Id", "Name");

		echo $form->dropDownList($model,"[$i]Verlag_Id",$Verlage,array("empty"=>"","style"=>"width:220px")); ?>

	    <?php echo $form->error($model,"[$i]Verlag_Id"); ?>

	</div> 

	<div class="row">

	    <?php echo $form->labelEx($model,"[$i]Verlag_Nr"); ?>

	    <?php echo $form->textField($model,"[$i]Verlag_Nr",array("size"=>5,)); ?>

	    <?php echo $form->error($model,"[$i]Verlag_Nr"); ?>

	</div> 

	<div class="row"> 

	    <?php echo $form->labelEx($model,"[$i]Reihe"); ?>

	    <?php echo $form->textField($model,"[$i]Reihe",array("style"=>"width:60px")); ?>

	    <?php echo $form->error($model,"[$i]Reihe"); ?>

	</div>

    

	<div class="row">

	    <?php echo $form->labelEx($model,"[$i]Anmerkung"); ?>

	    <?php echo $form->textField($model,"[$i]Anmerkung",array("style"=>"width:180px")); ?>

	    <?php echo $form->error($model,"[$i]Anmerkung"); ?>

	</div>  

    </div> <?php

    } ?>

</td>

<td> <?php 

    echo CHtml::link(

	"Löschen",

	"#",

	array("submit"=>array("noten/delete","id"=>$model["Id"]),

	    "params"=>array("returnUrl"=>"index.php?r=noten/batchUpdate"), "confirm" => "Diesen Datensatz löschen?")

    ); ?>

</td>

</tr> <?php 

endforeach; ?>

</table>


<div class="row buttons">

<?php echo CHtml::submitButton("Änderungen speichern"); ?>

</div>

<div style="clear:left;">

<?php

$this->widget("CLinkPager", array(

"pages" => $pages,

)); 

$this->endWidget(); 

?>

</div>

Man kann es hier ausprobieren:

Demoversion