Seite 1 von 1

Pagination einbauen

Verfasst: So 21.Nov, 2010 13:36
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?

Re: Pagination einbauen

Verfasst: So 21.Nov, 2010 15:01
von oxpus
Keine Ahnung, ich weiß ja nicht, wo das Pagination von dir eingebunden werden soll.

Re: Pagination einbauen

Verfasst: So 21.Nov, 2010 15:06
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?

Re: Pagination einbauen

Verfasst: So 21.Nov, 2010 19:44
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 ;)

Re: Pagination einbauen

Verfasst: So 21.Nov, 2010 20:13
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

Re: Pagination einbauen

Verfasst: So 21.Nov, 2010 20:31
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...).

Re: Pagination einbauen

Verfasst: So 21.Nov, 2010 22:26
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.

Re: Pagination einbauen

Verfasst: Mo 22.Nov, 2010 00:12
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

Re: Pagination einbauen

Verfasst: Mo 22.Nov, 2010 08:49
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 ;)

Re: Pagination einbauen

Verfasst: Mo 22.Nov, 2010 09:38
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

Re: Pagination einbauen

Verfasst: Mo 22.Nov, 2010 16:30
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...

Re: Pagination einbauen

Verfasst: Di 23.Nov, 2010 09:01
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?

Re: Pagination einbauen

Verfasst: Di 23.Nov, 2010 14:19
von oxpus
Jo, wenn redirect dann so:

Code: Alles auswählen

redirect(append_sid("vault.$phpEx?from=pm&mode=$mode"));

Re: Pagination einbauen

Verfasst: Do 25.Nov, 2010 10:44
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:

Re: Pagination einbauen

Verfasst: Do 25.Nov, 2010 14:05
von oxpus
Die ist entweder in der includes/functions.php oder includes/sessions.php enthalten.
Habe ich jetzt nicht im Kopf...

Re: Pagination einbauen

Verfasst: Sa 27.Nov, 2010 09:34
von Dungeonwatcher
Moin, moin Meister! :cool:

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

THNX :anbet

Bye