Objektstrukturierung (Anfägerfrage), wo Lookups auflösen?

Hallo,

ich beschäftige mich ganz frisch mit Yii und hab mit einem Tutorial (Larry Ullmann) die Grundfunktionen (incl. Gii) "gelernt".

Ich versuche jetzt mein erstes (ich finde eigentlich überschaubar komplexes) Projekt mit Yii umzusetzen und tue mich schwer, nicht immer im View die DB-Zugriffe unterzubringen :)

Zunächst vorweg: Wenn Du ein entsprechends Handbuch oder Tutorial zu dem Thema empfehlen kannst, oder das schon in einen anderem Thread besprochen wurde, DANKE für den Link!

> Ziel

Ich möchte eine kleine Bibliotheksverwaltung aufbauen.

So sieht die DB-Struktur aus:

Die vorgefertigen Tools sind ja für das Anlegen der Daten ganz nett, für die Benutzung muss ich natürlich noch die Logik selber umsetzen.

Ich habe dazu z.B. das Modell "Lend" (die Ausleihen) erweitert um:


public function countOut()

{ 

	  return self::model()->countBySql('SELECT count(*) FROM lend WHERE ((`out` <> "0000-00-00 00:00:00") AND (`back` = "0000-00-00 00:00:00"))');

}

Dies kann ich dann in den diversen Views mit :


Lend::model()->countLends();

Verwenden. Alles soweit so gut.

Jetzt möchte ich aber z.B. in der Suche z.B. den Author, der natürlich nicht fest in den Medien steht sondern über einen Relation mit "author" verbunden ist, auch nach dem Namen suchen können. (=Frage 1)

Ich habe es geschafft, dass er den Namen in der Widget-Suchmaske mit anzeigt, aber ich kann nicht danach suchen…


<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'media-grid',

	'dataProvider'=>$model->with('author','type','user')->search(),

	'filter'=>$model,

	'columns'=>array(

		'id',

		'isbn',

		'title',

		'authorId',

		'author.name',

		'typeId',

		'type.name',

		'ownerId',

		'user.name',

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>

Siehe:

Die Suchfelder sind bei den "neuen" Spalten Autorname und Kategoriename quasi "inaktiv".

Ebenso möchte ich bei der Anlage neuer Medien einen Autor nach Namen aussuchen können (geht ja per default mit den Relations), aber auch natürlich einen neuen Anlegen können; wenn ich ihn nämlich in der Liste nicht finden sollte. (=Frage 2)

Müsste ich dafür wirklich die Widgets anpassen?

Ist das nicht eine der "normalsten" Funktionen überhaupt? Das haben doch andere/Ihr bestimmt schon längst gelöst!

Aktuell "hänge" ich daran fest, wo ich neue Funktionen etablieren soll.

Wenn ich z.B. ein Medium anfordern möchte, muss ich dazu in der Tabelle "lend" einen entsprechenden Eintrag machen. Dazu muss er die ID des vorher selektierten Mediums sowie die User-ID verwenden.

Ich habe diese Funktion in das Objekt "lend" integriert, mit der Methode "createLend".

(models/Lend.php):


public function createLend($mediaId)

Wie ich die SQL (wenn ich die Parameter habe) ausführe, ist klar. Aber was gebe ich mit return zurück?

Zum Testen hab ich mal folgendes eingetragen:


 return "toDo (".$mediaId.")";

Ist aber wohl nicht wirklich sinnvoll…

Zum Aufruf habe ich in dem index-View des Objektes "media" einen Link hinterlegt:


<a href="<?php echo Yii::app()->request->baseUrl; ?>

/index.php/lend/createLend/<?php echo $model->id?>">Medium ausleihen bzw. vormerken</a>

Die Struktur hab ich mir bei den anderen Sachen abgeschaut; der Aufruf via Link funktioniert aber nicht.

Ich erhalte die Fehlermeldung:


The system is unable to find the requested action "createLend".

von der Seite:


http://localhost/bibliothek/index.php/lend/createLend/2

Muss ich die neue Methode noch irgendwo ankündigen oder so?

Wie kann ich die Lend-Methode aus dem Media-View (views/media/view.php) aufrufen und dabei die mediaId und userId (Anmeldename) übergeben/verwenden und anschliessend wieder die Medien-View (aktualisiert) anzeigen? (=Frage 3)

So, die Fragen sollen erstmal reichen… Danke im Voraus!

Hi und willkommen,

weil ich unbeantwortete Threads nicht mag: ;)

Leider kann ich dir nicht groß weiterhelfen, ich verwend die Filterfunktion in den Gridviews nie. Aber falls Englisch kein allzugroßes Problem ist: Im Hauptforum gabs diese Frage glaub ich schon ein paarmal, evtl. findest du ja dort eine Lösung?

Sorry, dass ich im Moment nicht mehr dazu sagen, mir fehlt die Zeit mir den Fall näher anzusehen.

Dazu fällt mir dann doch was ein: Du solltest Links immer mit createUrl() erzeugen. Diese Methode ist im Controller- und Applikations-Objekt vorhanden (Yii::app()). Also so:


$this->createUrl('lend/createLend', array('id'=>$model->id))

Oder du erzeugst den ganzen Link-Tag gleich mit dem CHtml::link()-Helper:


echo CHtml::link('Medium ausleihen bzw. vormerken',array('lend/createLend','id'=>$model->id)); 



Wenn du das nicht machst, musst du später zu viele Stellen einzeln korrigieren, wenn du dich z.B. für ein anderes URL-Schema entscheidest (was mit diesem Verfahren ein Klacks ist).

Hallo Mike,

danke für die Tips und dein Engagement, Topics nicht unbeantwortet zu lassen :)

Ich habe bereits viel Hilf in dem irc-kanal auf freenode bekommen und bin auf gutem wege…

Das mit den links hab ich alles auf CHtml::link umgestellt.