etwas komplizierteres Newssystem

oaki

Erfahrenes Mitglied
Hallo!

Ich wurde beauftragt ein Newssystem zu schreiben das die Daten entweder aus einer XML, txt Datei oder MYSQL Datenbank holt. Wenn ich die einfach alle Daten in ein Textfeld laden koennte waere das ja auch kein Problem, aber da es viele News sind sollten auf der ersten Seite nur die Titel angezeigt werden und dann gelingt man per Link zum eigentlichen Text.

Logischeweise sollte jeder Titel auch eine kleinen RollOver Effekt haben. Dies bedeutet aber dann ich fuer jeden Titel einen eigenen MovieClip erstellen muss, ausser ich machs mit HTML und CSS aber das ist nicht was ich will.

Kann mir jemand auf die Spruenge helfen wie ich sowas angehen koennte?

Vielen Dank!
 
Hi,

instanziere für jede Überschrift zunächst einen MovieClip und ordne diese Clips untereinander an. Jedem dieser MCs gibst Du den kompletten Newstext schon als Membervariable mit.

Erstelle dann einen MovieClip, der dazu dient, die komplette News anzuzeigen. Beim Klick auf einen der Titel-Clips instanzierst Du diesen "Anzeige"-Clip aus der Bibliothek und übergibst ihm den kompletten Text des Eintrags.

Gruß
.
 
Danke fuer deine Hilfe!

Statt fuer jede Ueberschrift eine MovieClip zu instanzieren, lass ich das ganze einfach dynamisch reinladen, da man ja im Voraus nicht weiss wieviele Eintraege sich in der DB befinden.

Danke nochmals & Gruss
 
Statt fuer jede Ueberschrift eine MovieClip zu instanzieren, lass ich das ganze einfach dynamisch reinladen
Ich meinte selbstverständlich eine dynamische Instanzierung:

Du lädst die Liste der Einträge in ein xml-Objekt, gehst die Knoten durch und instanzierst zur Laufzeit für jeden Eintrag einen (vorgefertigten) MC per attachMovie. Dynamischer gehts kaum. ;)

Gruß
.
 
ok alles klar!

Ginge das auch wenn ich nur ein MovieClip habe und den Text einfach mit ner Variable übergebe?
 
Ginge das auch wenn ich nur ein MovieClip habe und den Text einfach mit ner Variable übergebe?
Sprichst Du jetzt von einem MC in der Bibliothek (das meinte ich), oder von nur einer Instanz auf der Bühne (mein Vorschlag für die Vollanzeige)? Im letzteren Fall bekommst Du Probleme, wenn Du mehrere Überschriften anzeigen willst: Natürlich kannst Du alle Titel und Links in ein html-Textfeld setzen, aber einfacher (und mit schönerem RollOver) bekommst Du es hin, wenn Du mehrere Instanzen verwendest.

So realisiere ich das meistens:
  • In der Bibliothek einen MC "titel", der über ein dyn. Textfeld verfügt, sowie als Button mit RollOver-Effekt arbeitet.

  • Auf _root instanzierst Du nun für jeden Eintrag eine Version dieses Clips und ordnest die Instanzen untereinander an. Jeder Instanz übergibst Du den Text des Titels und den Inhalt der kompletten Nachricht. Der MC "titel" sollte nun so arbeiten, dass er beim Klick eine Methode "showNews" auf _root aufruft, der der Inhalt des kompletten Eintrags als Parameter übergeben wird.

  • Die Funktion "showNews" holt nun wiederum (bzw. blendet ein, läuft aufs selbe hinaus) eine Instanz eines weiteren MC in der Bibliothek ("fullview") auf die Bühne und übergibt ihr den Text im Argument.

  • Der MC "fullview" hat nun die Fähigkeit den übergebenen Text formatiert anzuzeigen und sich ggf. bei einem Klick selbst auszublenden (bzw. zu entfernen)

Gruß
.
 
genau so hab ich mir das auch vorgestellt. Nur komme ich nicht weiter beim übergeben der Variable für das Popup Fenster! Könntest du eventuell mal schnell ein Auge auf meinen Code werfen?

Code:
GenerateMenu = function (container, name, x, y, depth, node_xml) {
	// variable declarations
	var curr_node;
	var curr_item;
	var curr_menu = container.createEmptyMovieClip(name, depth);
	for (var i = 0; i<node_xml.childNodes.length; i++) {
		// movieclip for each item
		curr_item = curr_menu.attachMovie("menuitem", "item"+i+"_mc", i);
		curr_item._x = x;
		curr_item._y = y+i*curr_item._height;
		curr_item.trackAsMenu = true;
		// item properties assigned from XML
		curr_node = node_xml.childNodes[i];
		curr_itemreport = curr_node.childNodes[0].nodeValue;
		curr_item.name.text = curr_node.attributes.name;
		curr_item.onRollOver = curr_item.onDragOver=function () {
			// show a hover color
			var col = new Color(this.background);
			col.setRGB(0xf4faff);
		};
		curr_item.onRollOut = curr_item.onDragOut=function () {
			// restore color
			var col = new Color(this.background);
			col.setTransform({ra:100, rb:0, ga:100, gb:0, ba:100, bb:0});
		};
		curr_item.onRelease = function() {
			Actions["openWindow"](curr_itemreport);
		};
	}
	// end for loop
};
CreateMainMenu = function (x, y, depth, menu_xml) {
	// generate a menu list
	GenerateMenu(this, "mainmenu_mc", x, y, depth, menu_xml.firstChild);
};
Actions = Object();
Actions.openWindow = function(curr_itemreport) {
	attachMovie("window", "window", 3, {_x:50, _y:5});
	window.report.text = curr_itemreport;
};
Actions.newMenu = function(menuxml) {
	menu_xml.load(menuxml);
};
// load XML, when done, run CreateMainMenu to interpret it
menu_xml = new XML();
menu_xml.ignoreWhite = true;
menu_xml.onLoad = function(ok) {
	// create main menu after successful loading of XML
	if (ok) {
		CreateMainMenu(10, 10, 0, this);
		message_txt.text = "XML successfully loaded";
	} else {
		message_txt.text = "error:  XML not successfully loaded";
	}
};
// load first XML menu
menu_xml.load("spielberichte.xml");

Das Problem ist das immer nur der letzte Eintrag in Window angezeigt wird. Ich komm einfach nicht drauf wie ich den Code anders schreiben könnte das jeweils der passende Eintrag auch angezeigt wird..
 
Hi,

Dur darfst "curr_itemreport" nicht als lokale Variable in Deiner for-Schleife anlegen (dann wird sie ja immer wieder überschrieben. Beim Klick auf einen Eintrag versucht dieser Eintrag dann, auf diese (eine!) Variable zuzugreifen - und die hat ja noch den Wert des letzten Schleifendurchlaufs. Vielmehr musst Du jeder Instanz von "menuitem" seinen eigenen Inhalt mitgeben (ich sage ja: "Jeder Instanz übergibst Du den Text des Titels und den Inhalt der kompletten Nachricht.").

Also:
Code:
// Member zuweisen:
curr_iten.itemreport = curr_node.childNodes[0].nodeValue;
// ...
// und später beim Klick:
curr_item.onRelease = function() {
	Actions["openWindow"](this.itemreport);
}

Gruß
.
 
Zurück