Pagination einbauen

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Antworten
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Pagination einbauen

Beitrag von Dungeonwatcher »

Moin, moin! :cool:

Ich möchte in der Aktien Übersichtsseite des Vault Mods ein Pagination einbauen. Dazu bin ich nach dieser Anleitung vorgegangen:

Adding Pagination to a phpBB Page

Das funktioniert in soweit, als das die korrekte Anzahl von Aktien auf der ersten Seite angezeigt wird. Auch wird das "Gehe zu Seite: 1,2,3 Weiter" angezeigt. Allerdings funktioniert es nicht.Ich lande beim Klick auf Weiter oder der Seitennummer nicht auf der gewünschten Seite, sondern auf der Startseite des Mods. Das liegt daran, das nicht zur richtigen Stelle im Code gesprungen wird. Der betroffene Codeblock ist dieser:

Code: Alles auswählen

if ( $stock_exchange )
{
Die Url für das Pagination dazu sieht so aus:

Code: Alles auswählen

$pagination = generate_pagination(append_sid("vault.$phpEx?mode=stock_exchange"), $total_pag_items, $board_config['topics_per_page'], $start);
bzw.:

Code: Alles auswählen

.../forum/vault.php?mode=stock_exchange&start=25
Nun gibt es das mode=stock_exchange allerdings nicht.

Ändere ich den Beginn des Codeblockes auf:

Code: Alles auswählen

if ( $mode == stock_exchange )
{
funktioniert zwar das Pagination, dafür aber der Rest nicht mehr. Wie muss dieser Block aufgerufen werden?
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Keine Ahnung, ich weiß ja nicht, wo das Pagination von dir eingebunden werden soll.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

Hi! :cool:

Daran soll's nicht liegen. Ich habe es mittlerweile geschafft den Parameter mode=stock_exchange in den Link einzufügen. Das ganze sieht nun so aus:

Code: Alles auswählen

...vault.php?from=stock_exchange&mode=stock_exchange&start=25
Im Code dann so:

Code: Alles auswählen

if ( $stock_exchange )
{
	$template->set_filenames(array(
		'body' => 'vault_exchange_body.tpl')
	);

	$start = ( isset($HTTP_GET_VARS['start']) ) ? doubleval($HTTP_GET_VARS['start']) : 0;
	
	if ( isset($HTTP_GET_VARS['mode']) || isset($HTTP_POST_VARS['mode']) )
	{
		$mode = ( isset($HTTP_POST_VARS['mode']) ) ? htmlspecialchars($HTTP_POST_VARS['mode']) : htmlspecialchars($HTTP_GET_VARS['mode']);
	}
	else
	{
		$mode = 'stock_exchange';
	}
	
	$sql = "SELECT *
		FROM " . VAULT_EXCHANGE_TABLE ." ORDER BY stock_id
		LIMIT " . $start . "," . $board_config['topics_per_page'] . "";
		$result = $db->sql_query($sql);
	if( !$result )
	{
		message_die(GENERAL_ERROR, "Couldn't obtain stock exchange from database", "", __LINE__, __FILE__, $sql);
	}
	$exchange = $db->sql_fetchrowset($result);
	
	for($i = 0; $i < count($exchange); $i++)
	{
		$a = $exchange[$i]['stock_id'];
		$stock_language[$a] = isset($lang1[$exchange[$i]['stock_language']]) ? $lang1[$exchange[$i]['stock_language']] : $exchange[$i]['stock_language'];
		$stock_name_max[$a] = isset($lang1[$exchange[$i]['stock_name_max']]) ? $lang1[$exchange[$i]['stock_name_max']] : $exchange[$i]['stock_name_max'];
		$stock_name_max_free[$a] = isset($lang1[$exchange[$i]['stock_name_max_free']]) ? $lang1[$exchange[$i]['stock_name_max_free']] : $exchange[$i]['stock_name_max_free'];
		$actions_owned[$a] = $owned['stock_amount'];
		
		// --- Berechnung der kplt. Anzahl verkaufter Aktien --- Start ---

		$sql = "SELECT sum(stock_amount) AS stock_amount_sum FROM  " . VAULT_EXCHANGE_USERS_TABLE ."
			WHERE stock_id = " . $a . "
			GROUP by stock_id";
		$result = $db->sql_query($sql);
		if( !$result )
		{
			message_die(GENERAL_ERROR, 'Could not obtain avarade stock_amount_sum information', "", __LINE__, __FILE__, $sql);
		}
		$query = mysql_query($sql);
		$array = mysql_fetch_array($query);
		$stock_amount_sum = $array[0];
		$stock_name_max_sum[$a] = $stock_amount_sum;
		
		// --- Berechnung der kplt. Anzahl verkaufter Aktien --- Ende ---

			$buy_item[$a] = "";
			$buy_item[$a] = '<input class="post" type="text" maxlength="12" size="12" name="buy_item'.$a.'" style="text-align: right;" />';
			$sell_item[$a] = "";
			$sell_item[$a] = '<input class="post" type="text" maxlength="12" size="12" name="sell_item'.$a.'" style="text-align: right;" />';
		
		$row_class = ( !($i % 2) ) ? $theme['td_class1'] : $theme['td_class2'];

		$sql = "SELECT * FROM " . VAULT_EXCHANGE_USERS_TABLE ."
			WHERE stock_id = ".$exchange[$i]['stock_id']."
			AND user_id = ".$user_id;
		$result = $db->sql_query($sql);
		if( !$result )
		{
			message_die(GENERAL_ERROR, "Couldn't obtain stock exchange from database", "", __LINE__, __FILE__, $sql);
		}
		$owned = $db->sql_fetchrow($result);
		$actions_owned = $owned['stock_amount'];
		$bought_owned = $owned['price_transaction'];
		$stock_owned_act = $actions_owned * $exchange[$i]['stock_price'];

		if ( $stock_price_avg > $stock_avg/100 * 90 )
		{
			$stock_amount_dax = $lang['Vault_exchange_dax_0'] . number_format($stock_price_avg,2, ",", ".");
		}
		else if ( $stock_price_avg <= $stock_avg/100 * 90 && $stock_price_avg >= $stock_avg/100 * 50)
		{
			$stock_amount_dax = $lang['Vault_exchange_dax_1'] . number_format($stock_price_avg,2, ",", ".");
		}
		else if ( $stock_price_avg < $stock_avg/100 * 50 )
		{
			$stock_amount_dax = $lang['Vault_exchange_dax_2'] . number_format($stock_price_avg,2, ",", ".");
		}

		if ( !$actions_owned )
		{
			$actions_owned = $lang['Vault_exchange_none'];
		}
		
		if ( $exchange[$i]['stock_price'] > $exchange[$i]['stock_previous_price'] )
		{
			$stock_amount_stat = $lang['Vault_exchange_actions_amount_0'];
		}
		else if ( $exchange[$i]['stock_price'] == $exchange[$i]['stock_previous_price'] )
		{
			$stock_amount_stat = $lang['Vault_exchange_actions_amount_1'];
		}
		else if ( $exchange[$i]['stock_price'] < $exchange[$i]['stock_previous_price'] )
		{
			$stock_amount_stat = $lang['Vault_exchange_actions_amount_2'];
		}

		$template->assign_block_vars("exchange", array(
			"ROW_COLOR"				=> "#" . $row_color,
			"ROW_CLASS"				=> $row_class,
			"STOCK_ID"				=> vault_get_lang($exchange[$i]['stock_id']),
			'STOCK_LANGUAGE'		=> ( vault_get_lang($exchange[$i]['stock_language']) == '' ) ? '<img src="./images/flags/no_flag_img.png" width="18" height="12" alt="" border="0" />' : '<img src="images/flags/' . vault_get_lang($exchange[$i]['stock_language']) . '.png" width="18" height="12" alt="" border="0" />',
			"STOCK_NAME"			=> vault_get_lang($exchange[$i]['stock_name']),
			"STOCK_NAME_MAX"		=> number_format(vault_get_lang($exchange[$i]['stock_name_max']),0, ",", "."),
			"STOCK_NAME_MAX_FREE"	=> number_format(vault_get_lang($exchange[$i]['stock_name_max_free']),0, ",", "."),
			"STOCK_NAME_MAX_SUM"	=> number_format($stock_name_max_sum[$a],0, ",", "."),
			"STOCK_DESC"			=> vault_get_lang($exchange[$i]['stock_desc']),
			"STOCK_AMOUNT"			=> number_format($exchange[$i]['stock_price'],2, ",", "."),
			"STOCK_BOUGHT"			=> number_format($bought_owned,2, ",", "."),
			"STOCK_AMOUNT_STAT"		=> $stock_amount_stat,
			"STOCK_PREVIOUS"		=> number_format($exchange[$i]['stock_previous_price'],2, ",", "."),
			"STOCK_WORST"			=> number_format($exchange[$i]['stock_worst_price'],2, ",", "."),
			"STOCK_BEST"			=> number_format($exchange[$i]['stock_best_price'],2, ",", "."),
			"STOCK_BUY"				=> $buy_item[$a],
			"STOCK_SELL"			=> $sell_item[$a],
			"STOCK_OWNED_ACT"		=> number_format($stock_owned_act,2, ",", "."),
			"STOCK_OWNED"			=> number_format($actions_owned,0, ",", "."))
		);
	}

	// Begin Pagination
	$sql = 'SELECT count(stock_id) AS total FROM ' . VAULT_EXCHANGE_TABLE;

	if ( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Error getting total', '', __LINE__, __FILE__, $sql);
	} 
	
	if ( $total = $db->sql_fetchrow($result) )
	{
		$total_page_items = $total['total'];
		$pagination = generate_pagination(append_sid("vault.$phpEx?from=stock_exchange&mode=$mode"), $total_page_items, $board_config['topics_per_page'], $start);
	}
	
	$template->assign_vars(array(
		'PAGINATION'	=> $pagination,
		'PAGE_NUMBER'	=> sprintf($lang['Page_of'], $current_page, $total_pages)
	));
	// End Pagination	
	
	$template->assign_vars(array(
		'L_STOCK_EXCHANGE_ACTIONS'	=> $lang['Vault_exchange_actions'],
		'L_STOCK_EXCHANGE_DAX'		=> $lang['Vault_exchange_dax'],
		'L_STOCK_ID'				=> $lang['Vault_exchange_id'],
		'L_STOCK_LANGUAGE'			=> $lang['Vault_exchange_language'],
		'L_STOCK_NAME'				=> $lang['Vault_exchange_actions_name'],
		'L_STOCK_NAME_MAX'			=> $lang['Vault_exchange_actions_name_max'],
		'L_STOCK_NAME_MAX_FREE'		=> $lang['Vault_exchange_actions_name_max_free'],
		'L_STOCK_NAME_BUYS'			=> $lang['Vault_exchange_actions_name_buys'],
		'L_STOCK_DESC'				=> $lang['Vault_exchange_actions_desc'],
		'L_STOCK_AMOUNT'			=> $lang['Vault_exchange_actions_amount'],
		'L_STOCK_BOUGHT'			=> $lang['Vault_exchange_actions_bought'],
		'L_STOCK_PREVIOUS'			=> $lang['Vault_exchange_previous_price'],
		'L_STOCK_WORST'				=> $lang['Vault_exchange_worst_price'],
		'L_STOCK_BEST'				=> $lang['Vault_exchange_best_price'],
		'L_STOCK_OWNED'				=> $lang['Vault_exchange_owned'],
		'L_STOCK_BUY'				=> $lang['Vault_exchange_buy'],
		'L_STOCK_SELL'				=> $lang['Vault_exchange_sell'],
		'L_SUBMIT'					=> $lang['Submit'],
		'STOCK_AVG'					=> $stock_amount_dax)
	);
}
Jetzt bin ich aber mit meinem Latein völlig am Ende. Warum wird dieser Block trotzdem nicht korrekt ausgeführt?
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Den Block

Code: Alles auswählen

       if ( $total = $db->sql_fetchrow($result) )
       {
          $total_page_items = $total['total'];
          $pagination = generate_pagination(append_sid("vault.$phpEx?from=stock_exchange&mode=$mode"), $total_page_items, $board_config['topics_per_page'], $start);
       }
       
       $template->assign_vars(array(
          'PAGINATION'   => $pagination,
          'PAGE_NUMBER'   => sprintf($lang['Page_of'], $current_page, $total_pages)
       ));
würde ich eher so notieren:

Code: Alles auswählen

		if ( $total = $db->sql_fetchrow($result) )
		{
			$total_page_items = $total['total'];
			$pagination = generate_pagination("vault.$phpEx?from=stock_exchange&mode=$mode", $total_page_items, $board_config['topics_per_page'], $start);
			
			$template->assign_vars(array(
			  'PAGINATION'   => $pagination,
			  'PAGE_NUMBER'   => sprintf($lang['Page_of'], $current_page, $total_pages)
			));
		}
		else
		{
			$template->assign_vars(array(
			  'PAGINATION'   => '',
			  'PAGE_NUMBER'   => ''
			));
		}
Und nach

Code: Alles auswählen

       // End Pagination  
sollte die Zeile

Code: Alles auswählen

       $db->sql_freeresult($result);
nicht fehlen.

Aber dennoch weiß ich nicht, welche Parameter nötig sind, um $stock_exchange TRUE werden zu lassen.
Ist denn "from=stock_exchange" hier korrekt oder muss es nicht doch "mode=stock_exchange" heissen?
Vielleicht fehlen dort noch weitere Parameter, die ich so ja nicht kenne, da ich das komplette Script ja nicht sehe ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

oxpus hat geschrieben:Den Block [...] würde ich eher so notieren...:
O.k. das macht Sinn.
Und nach

Code: Alles auswählen

       // End Pagination  
sollte die Zeile

Code: Alles auswählen

       $db->sql_freeresult($result);
nicht fehlen.
Hmmm, das leuchtet mir nicht ein.
Aber dennoch weiß ich nicht, welche Parameter nötig sind, um $stock_exchange TRUE werden zu lassen.
Ist denn "from=stock_exchange" hier korrekt oder muss es nicht doch "mode=stock_exchange" heissen?
Vielleicht fehlen dort noch weitere Parameter, die ich so ja nicht kenne, da ich das komplette Script ja nicht sehe ;)
Anbei nun der aktuelle Code um viele überflüssige Kommentare bereinigt:

vault.php
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Code: Alles auswählen

$db->sql_freeresult($result);
ist dafür da, die verwendeten Ressourcen und den Verbindungskanal zur Datenbank zu beenden, der mit $db->sql_query($sql); aufgemacht wurde.
Bei zu vielen Verbindungen schaltet die Datenbank ab, was dann zu Fehlern und auch Problemen mit dem Server selber führen kann.

Die Datei selber schaue ich mir später/morgen an, da ich aktuell im phpBB3-Update-Fieber bin (9 Foren...).
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Ähm, hm, eigentlich müsste es nicht heissen "from=stock_exchange", sondern "from=pm".
So jedenfalls wird im Script $stock_exchange definitiv auf "true" gesetzt und die Bedingung wird ausgelöst.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

Aaahhh, so funktioniert's. :anbet

Darauf muss erstmal so'n PHP DAU wie meiner einer erst mal kommen. :eek:

Ich habe die Stelle jetzt auch gefunden wo das definiert wird:

Code: Alles auswählen

if(isset($HTTP_POST_VARS['from']))
{
Naja, man lernt nicht aus. :)

THNX nochmal.

Bye
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Nun ja, was habe ich denn gemacht:
Script angeschaut und geprüft, wo die Variable, die den Block ja auslösen soll, definiert wird und wann sie "TRUE" ist.
Also Variable kopiert und über den Editor vom Anfang der Datei an gesucht.
Dann wird es auch schnell klar, was man machen müsste.
Das ist dann Debugging "zu Fuß".

Nur so als Tipp unter uns Programmierern ;)
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

Moin, moin! :cool:

O.k., so mache ich das eigentlich auch. Allerdings fehlt mir oft noch das Verständnis für einige Zusammenhänge. ^6

So ein blödes Pagination "Problem" habe ich z.B. noch beim Display All Pictures Posted By... (Photo Album Add-on). Da ist es offensichtlich an einer falschen Stelle eingebaut. Es wird immer mindestens eine leere Seiten zu viel angezeigt. Aber das versuche ich die Tage selber hinzubekommen.

Bye

Nachtrag:

Mit dem $stock_exchange = TRUE; gibt es leider noch eine Unschönheit. Am Ende des Blocks

Code: Alles auswählen

if ( $exchange_submit )
{
wird mit $stock_exchange = TRUE; in den Block

Code: Alles auswählen

if ( $stock_exchange )
{
gesprungen. Soweit so gut und korrekt., denn das schließt den Kauf/Verkauf ab und man landet wieder in der Aktien Übersicht. Der Fehler der hierbei auftritt, ist folgender:
PHP Warning: Cannot use a scalar value as an array in ...\vault.php on line 513
Das ist diese Zeile:

Code: Alles auswählen

$stock_name_max_free[$a] = isset($lang1[$exchange[$i]['stock_name_max_free']]) ? $lang1[$exchange[$i]['stock_name_max_free']] : $exchange[$i]['stock_name_max_free'];
Diese Warnung tritt nur beim kaufen/verkaufen auf. Der Wert für $stock_name_max_free[$a] wird jedoch in der Übersicht angezeigt aber ansonsten nicht ausgewertet. Bei einem neu laden der Übersicht stimmt dann wieder alles. ^6
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Dann wäre es vielleicht geschickter, anstelle $stock_exchange = TRUE; am Ende des Verkaufs in ein redirect zu verwandeln, damit das Script neu geladen und damit eben auch sauber dargestellt wird...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

Moin Meister! :cool:
oxpus hat geschrieben:Dann wäre es vielleicht geschickter, anstelle $stock_exchange = TRUE; am Ende des Verkaufs in ein redirect zu verwandeln, damit das Script neu geladen und damit eben auch sauber dargestellt wird...
Das versuchte ich bereits so zu erreichen:

Code: Alles auswählen

$stock_exchange = 'vault.$phpEx?from=pm&mode=$mode';
Das bringt aber auch nicht den erwünschten Erfolg. ^6

Dieser Block wird doch nach Abschluss des Kaufes genauso aufgerufen wie wenn er direkt aufgerufen wird. Im Template steht für den Direktaufruf:

Code: Alles auswählen

 <td class="row3" align="center" ><input type="submit" value="{L_STOCK_EXCHANGE}" name="stock_exchange" class="button" /></td>
Worin unterscheiden sich diese beiden Varianten?
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Jo, wenn redirect dann so:

Code: Alles auswählen

redirect(append_sid("vault.$phpEx?from=pm&mode=$mode"));
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

Moin Meister! :cool:

Oha, das funktioniert tatsächlich.
Allerdings bin ich nun wieder verwirrt, denn zu einer PHP Funktion redirect() kann ich nichts finden? :eek:
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Pagination einbauen

Beitrag von oxpus »

Die ist entweder in der includes/functions.php oder includes/sessions.php enthalten.
Habe ich jetzt nicht im Kopf...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Re: Pagination einbauen

Beitrag von Dungeonwatcher »

Moin, moin Meister! :cool:

Also was PHPBB eigenes. Ich hab's in der funktions.php gefunden.

THNX :anbet

Bye
Antworten