Skocz do zawartości


Largo

Rejestracja: 04 mar 2009
Poza forum Ostatnio: 14 gru 2011 21:45
*****

Moje tematy

Generowanie menu

29 grudzień 2010 - 12:36

Witam,

Chcę stworzy automatycznie generowane menu w swojej aplikacji. Polegać to by polegało na umieszczeniu w głównym szablonie kodu:

<ul class='tab_bar no_title'>
<if test="$is_array($menuItems) AND count($menuItems)">
<foreach loop="$menuItems AS $menuModule => $menuData">
	<li>
	<if test="$menuData['isActive']">
		{$menuData['menuTitle']}
	<else />
		<a href="{$menuData['moduleUrl']}">{$menuData['menuTitle']}</a>
	</if>
	</li>
</foreach>
</if>
</ul>

Jeżeli istnieje menu dla specjalnego modułu, to zostanie ono wypełnione na podstawie danego menu, podobnego do tego w IP.Nexus - wiem, że wszyscy wiedzą jak wygląda menu tego produktu :-) Ma to na celu ustawienie menu w miejscach, w których uważam, że będzie sensowne, np. w administracji paroma danymi, ale np. dla strony transakcji, gdzie jest wiele informacji już nie, z 2 powodów:

  • Brak miejsca
  • Niepotrzebne menu dla tego typu strony
Czy jest jakiś sposób na to? O ile w modułach dałoby radę stworzyć interfejs i tam dodać takie metody o ile jak wyciągać nazwy modułów? Ustawiać prywatną, statyczną tablicę z tymi danymi? Efekt ma być taki, że dla niektórych stron będzie mój kod HTML, a dla niektórych widok jak w IP.Nexus, czyli obok menu, a obok treść.

Proszę o porady jak takie coś wykonać.

Globalne Transakcje

03 kwiecień 2010 - 15:31

Witam,

Od wczoraj programuję moduł masowych dotacji. Czym taka dotacja się różni od zwykłej transakcji? A paroma rzeczami:

  • Nie posiada fizycznego odbiorcy, ani nadawcy. Nie wyobrażam sobie zapisanie chociażby 100 ID po przecinku, o tysiącach nie wspomnę :-)
  • De facto jest to akcja systemowa, wykonywana przez człowieka, ale nie z wykorzystaniem jego ID
  • Zapisuję ją jako systemową i oznaczam, że to jest masowa dotacja, dołączam także ID tejże dotacji z tabeli pośrednej z jej ograniczeniami
I tu mam problem. Ograniczenia polegają na paru kryteriach, w tym dla grup, przedziału postów, ilości ostrzeżeń i reputacji, jeżeli włączona. Problem stoi w tym fakcie, że to będzie widoczne dla użytkownika dopóki kryteria użytkownika się sprawdzają, a co jeżeli przekroczy limit postów lub otrzyma za dużo ostrzeżeń? Mimo, że otrzymał dotację, nie będzie jej widział co jest błędem. Musi być logiczny sposób na sprawdzanie tego, ale nie zapis X ID'ków do bazy, gdzie pole musiałoby mieć typ TEXT :-)

Pozdrawiam,
Largo

Daty zależne

24 marzec 2010 - 08:57

Witam,

Mam pewien problem, nie z samą funkcjonalnością, ale z tym jak to wykonać wg. IPS'owych klas. Mam taki kod:

		/* User want to see that? */
		if( true/*$this->memberData['member_fg_show_stats']*/ )
		{
			/* Create list of months! */
			$startDate 	 = $memberData['joined'];
			$actualDate	 = time();
			$currentDate = IPSTime::unixstamp_to_human( $actualDate );
			$monthsData	 = '';
			
			/* Create language array of months */
			$monthsNames = array( $this->lang->words['M_1'], $this->lang->words['M_2'], $this->lang->words['M_3'], 
								 $this->lang->words['M_4'], $this->lang->words['M_5'], $this->lang->words['M_6'], 
								 $this->lang->words['M_7'], $this->lang->words['M_8'], $this->lang->words['M_9'], 
								 $this->lang->words['M_10'], $this->lang->words['M_11'], $this->lang->words['M_12'] );
			
			/* Get last 12 months */			
			$tempDate = strtotime( '-11months', $actualDate );
			
			/* Date is lower than our joined? */
			if( $startDate < $tempDate )
			{
				$startDate = $tempDate;
			}
			
			/* Set start date... */
			IPSTime::setTimestamp( $startDate );

			/* List months! */
			while( $startDate < $actualDate )
			{				
				/* Get Month */
				$dateArray = IPSTime::unixstamp_to_human( $startDate );
				
				/* Add to list of months... */
				$monthsData .= "\t<option value='{$dateArray['month']}'";
				$monthsData .= ( $inputMonth && ( $inputMonth == $dateArray['month'] ) ) ? " selected='selected'" : '';
				$monthsData .= ">{$monthsNames[ $dateArray['month'] - 1 ]} {$dateArray['year']}</option>\n";
				
				/* Add month! */
				IPSTime::add_month();
				$startDate = IPSTime::getTimestamp();
			}

			/* Current month? */
			if( $currentDate['month'] == date( 'm', $startDate ) )
			{
				$monthsData .= "\t<option value='".$currentDate['month']."'";
				$monthsData .= ( $currentDate['month'] == date( 'm', $startDate ) && ( $currentDate['year'] == date( 'Y', $startDate ) ) ) ? " selected='selected'" : '';
				$monthsData .= ">{$monthsNames[ date( 'm', $startDate ) - 1 ]} ".date( 'Y', $startDate)."</option>\n";
			}
			
			/* Different Month? */
			$selectedMonth = ( $inputMonth ) ? $inputMonth : $actualMonth;
		}

Co on ma za zadanie robić? Ma wylistować 12 miesięcy od dziś, ale uwzględniając pod fakt, że jeżeli data dołączenia jest mniejsza niż 12 miesięcy, to ma się do nich ograniczyć. I to działa, ale wg. kodu PHP, czystego, nie z IP.Board. Użyłem funkcji strtotime(), a czy da się wg. IPS'owych klas? Jakbym mógł prosić o ewentualną korektę kodu, byłbym wdzięczny :-) A czemu taki sposób wybrałem - powody są proste. Nie chcę mieć listy z np. 4 lat ( 4 * 12 = 48 elementów listy... ), inna sprawa to fakt, że jest Archiwum, i nie ma sensu przekazywać tylu danych. A ostatni powód jest taki, że nie muszę szukać wymyślnych sposobów na ukrycie dat w wartości, a jedynie ich numery i sprawdzanie czy dana data już była.

Transakcje i ich typy

19 marzec 2010 - 13:25

Witam,

Ostatnio z kolegą rozważam pewien pomysł dotyczący samych transakcji. W czym problem? Użytkownik wysyłając kasę do innego nie wykorzystuje systemowych transakcji i tu nie mam dużego pola do manewru, ponieważ określam typ na bieżąco w PHP, nie po stronie MySQL. W czym mimo to mam problem? Otóź są typy systemowe - kiedy my wydajemy kasę na rzecz akcji w której nie ma nadawcy, ale także kiedy system nam przysyła kasę, czyli nie ma nadawcy. I tu pojawiła się propozycja - zróbmy dynamiczne typy. Co to oznacza? Każdy typ byłby określany przez ACP - np. Sklep, Loteria. To są aplikacje wewnętrzne ( osobne moduły ), i np. nadajmy niebieski kolor Loterii, a Sklep niech dostanie kolor fioletowy. Ale Forum Gold ma działać z paroma aplikacjami - Gildie będą z niego korzystały, a także inne projekty. I np. inne akcje miałoby na celu pokazać co kupił i gdzie. W przypadku zewnętrznych aplikacji dawałoby się URL. Tabele mam gotową, pytam się raczej jak to w PHP ogarnąć?

Doszliśmy do wniosku, że zrobimy to tak. Przy każdej aktualizacji Forum Gold dodawałoby się do razem z aktualizacją ( po co ingerować w to osobno? ), ale w przypadku osobnych aplikacji potrzebne byłby plik .xml lub wpisanie odpowiednich danych. I to da się w Cache zamknąć za każdą edycją. I tu pytanie - czy to ma sens? Jak się potem do tych danych dobierać poza aplikacją?

Poprawki CSS

10 marzec 2010 - 13:15

Witam,

Wiem, że są tu migacy ( lub magik ) od spraw CSS, czyli od spraw beznadziejnych :-) Otóź, mam problem, który wiem, że da się rozwiązać, ale jeszcze nie wiem jak. Oto kod:

<form id="send_fg_form_{$member['member_id']}">
<input type='hidden' name='sender' id='sender' value="{$this->memberData['member_id']}" />
<input type='hidden' name='recipient' id='recipient' value="{$member['member_id']}" />
<input type='hidden' name='auth_key' id='auth_key' value="{$this->member->form_hash}" />
	<fieldset class='row2'>
	<h3 class='bar'>Wysyłanie Forum Gold do {$member['members_display_name']}</h3>
		<div id="send_fg_error_{$member['member_id']}">
		<br />
			<p class='message error'></p>
			<script type='text/javascript'>
				$('send_fg_error_{$member['member_id']}').hide();
			</script>
		</div>
		<ul>
			<li class='field'>
				<label for="send_fg_amount_{$member['member_id']}">Wyślij
					<input class='input_text' type='text' name='amount' id="send_fg_amount_{$member['member_id']}" size='5' value="{$this->memberData['member_fg']}" onFocus="if( this.value == '{$this->memberData['member_fg']}' ) { this.value = '' }" /> Forum Gold do {$member['members_display_name']} ( {$member['member_fg']} )
				</label>
			</li>
			<li class='field'>
				<label for="send_fg_comment_{$member['member_id']}">Podaj komentarz do transakcji!</label>
				<input class='input_text' name="send_fg_comment_{$member['member_id']}" id="send_fg_comment_{$member['member_id']}" />
				<span class='desc'>Wpisz komentarz dotyczący transakcji. Maksymalna długość to 32 znaki!</span>
			</li>
			<li class='field'>
				<label for="send_fg_password_{$member['member_id']}">Wpisz swoje hasło Forum Gold!</label>
				<input class='input_text' type='password' name='password' id="send_fg_password_{$member['member_id']}" />
				<if test="empty( $this->memberData['member_fg_password'] )">
				<span class='desc'>Jeżeli nie ustawiłeś hasła Forum Gold, wpisane hasło zostanie zapisane do bazy danych!</span>
				</if>
			</li>
			<if test="$this->memberData['g_access_cp'] || ( $this->memberData['member_group_id'] == $this->settings['admin_group'] )">
			<li class='field checkbox'>
				<input class='input_check' type='checkbox' name='invisible' id="send_fg_invisible_{$member['member_id']}" value='1' />
				<label for="send_fg_invisible_{$member['member_id']}"><strong>Ukryć transakcję?</strong></label>
				<span class='desc'>Opcja ta jest dostępna TYLKO dla osób z uprawnieniami administratora!</span>
			</li>
			</if>
			<if test="$this->memberData['g_fg_send_anymously'] = true">
			<li class='field checkbox'>
				<input class='input_check' type='checkbox' name='anonymous' id="send_fg_anonymous_{$member['member_id']}" value='1' />
				<label for="send_fg_anonymous_{$member['member_id']}"><strong>Anonimowa transakcja?</strong></label>
				<span class='desc'>Ustawiając tą opcję, Twój kontrahent nie będzie wiedział kto mu wysłał Forum Gold.</span>
			</li>
			</if>
		</ul>
	</fieldset>
	<fieldset class='submit'>
		<input class='input_submit' type='submit' name='submit' value='Wyślij Forum Gold' accesskey='s' tabindex='0' /> <a href='{parse url="showbuyfg" template="showbuyfg" seotitle="buyfg" base="publicWithApp"}' class='input_submit alt' title='Zakup Forum Gold!' target='_blank'>Kup Forum Gold</a> lub <a href='#' class='cancel' title='Anuluj transakcje' id="send_fg_cancel_{$member['member_id']}" tabindex='0'>Anuluj</a>
	</fieldset>
</form>

A oto screen co ten kod pokazuje: [IMG=http://img51.imageshack.us/img51/3186/invisionizepl.png][/IMG]

Na obrazku dodałem zamieszczone 2 kreski - poziome i pionowe. Pionowa ma za zadanie oddzielić label od input, tak jak w klasie post_form, ale z uwzględnieniem długości znaków, a nie stałą wartością. A kreska pozioma ma działać jak tag <hr />, ale sam w sobie nie pomaga. Czy magik z CSS da radę mnie wspomóc w tym?

Pozdrawiam,
Largo