Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Largo

Użytkownik
  • Postów

    1 157
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Largo

  1. Fajnie, że działa :-) klnkjjk
  2. Widać nie przyłożyłeś się do sprawdzenia jak działa IP.Board - a szkoda. <?php ob_start(); /* Po co Ci ob_start()? Potrzebujesz ten content gdzieś poza klasą? Dodatkowo, chyba klas się nie dodaje do bufora, bo i po co? :-) */ class profile_chars extends profile_plugin_parent { /** * Feturn HTML block * * @access public * @param array Member information * @return string HTML block */ public function return_html_block( $member=array() ) { /* Staraj się inicjować zmienne, w Java lub innych językach taki zapis nie przeszedłby kompilacji - to uczy złych nawyków */ $content = ''; /* Zapytania działają na zasadzie odpowiednich kluczy - więcej o tym w dokumentacji! * Dodatkowo IP.Board obsługuje wszystkie tabele w danej bazie - jak inaczej wyobrażasz sobie pisanie modyfikacji? :-) */ $skin = $this->DB->buildAndFetch(array('select' => 'Skin', 'from' => 'samp_members', 'where' => 'Name = ' . $member['members_seo_name'])); $content = '<img src="Skins/Skin_'.$skin.'.png">'; return $content; } } Miłej lektury kodu :-)
  3. A nie lepiej ten kod przepisać na jakiś bardziej 'elegancki'? Jeżeli chcesz kilka liczników, to logicznym jest, że wypada czas do końca gdzieś trzymać? Na dobry początek polecam stworzyć w tym kodzie zmienną globalną, coś w ten deseń: <script type='text/javascript'> var timers = new Object(); </script>] W ten sposób możesz trzymać parę liczników, tak samo jak i ich ID. Kolejny logiczny krok jaki powinieneś zrobić to jest dosyć prosty. W miejsce gdzie dajesz licznik wyświetlasz span z ID, np: <script type='text/javascript'> var timers = new Object(); </script> <span id="contest_{$contest['id']}"></span> <script type='text/javascript'> timers.contest_{$contest['id']} = 300; </script>] W ten sposób możesz mieć w tablicy aktywne konkursy. Jedyne co musisz zrobić to podstawić ID konkursów ( aby JS wiedział co i jak ) i czas, w takiej formie jakiej jest licznik zrobiony. To podpowiedzi - gotowca nie daję, bo mi się nie chcę robić :-)
  4. A czemu nie możesz stworzyć ukrytego inputa z taką treścią? To o wiele łatwiejsze, na dodatek nadajesz ID i wstawiasz dane - potem tylko Jquery('#twójId').val() i masz wartość w JS, a co z nią zrobisz, to już Twoja robota - podpowiedź to Ajax.
  5. Kumpel też mi doradzał interfejsy via UCP, ale tu jedno nie pasuje - mamy moduły i sekcje, jedynie po sekcjach możemy zaimplementować, a to nam podwoi/potroi/... tablice z danymi o innych sekcjach, do których użytkownik może nie mieć uprawnień. Mówisz, że takie rozwiązanie jest OK? A inne pomysły? Czy tylko ten pasuje do schematu? PS. OK, wszystko git, tylko jak tą tablicę danych chcesz wypełnić? Nie mów, że w konstruktorze biblioteki mam tworzyć taką tablicę?
  6. Jeżeli Cię dobrze rozumiem to coś w ten deseń: private static $_menuItems = array( 'administration' => array( 'generateMenu' => true, 'menuData' => array( 'menuUrl' => 'section=account', 'isActive' => $this->request['module'] == 'administration' && $this->request['section'] == 'account', 'menuTitle' => $this->lang->words['accountMenuLangBit'] ), array( 'menuUrl' => 'section=payments', 'isActive' => $this->request['module'] == 'administration' && $this->request['section'] == 'payments', 'menuTitle' => $this->lang->words['paymentsMenuLangBit'] ) ), 'transactions' => array( 'generateMenu' => false, 'menuData' => array() ) );
  7. A co, wolisz 2 zdania, że na jednej stronie chcę menu, a na drugiej nie? :-) Problem jest chyba dosyć dobrze wyjaśniony. Wiesz jak wygląda lewe menu w IP.Nexus? Jeżeli tak, to wiesz jak wyglądają strony w IP.Nexus - dla pewnych moich modułów w aplikacji potrzebuje DOKŁADNIE takie samo działanie. A dla niektórych całość będzie zajmował moduł, bez menu. Nic tu trudnego nie ma, oprócz samego pomysłu jak to wykonać, aby przy aktualizacjach nie bawić się w szablonach, a w jednym, ewentualnie dwóch miejscach w kodzie :-) PS. Mała poprawka do opisu - jeżeli dodam np. 3 linki w menu głównym ( one zapewne będą ze statycznej tablicy ), to jeżeli dodam menu to potrzebuje tego do konkretnego modułu - nie do konkretnej sekcji, bo załóżmy, że zakładka 'Administracja' będzie składała się z 3 sekcji: Zarządzanie kontem Zarządzanie płatnościami Zarządzanie systemem To są 3 osobne sekcje, a menu powinno wskazywać na te 3 linki. Nie wiem czy takie coś jest w ogóle wykonalne w obecnej architekturze IP.Board
  8. 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ć.
  9. Witam, Jak chcecz konkurować z moim FG to zaczekaj jeszcze pewien czas, ale ja opieram dosyć mocno IP.Board na zaletach PHP5 jak i na klasach do obsługi wielu systemów płatności ( w tym możliwość dopisania własnych klas do płatności :-) ), to proszę. Komercyjna wersja skryptu będzie mocno bogata, darmowej nie będzie, obie wersje będą zakodowane, aby kod się nie ulotnił, za długo na to pracuję, aby to porzucić :-) Na dodatek inwestuje w multum zabezpieczeń ( w tym logowanie akcji 'podejrzanych', automatyczne blokady po przekroczeniu pewnego poziomu zabezpieczeń ) jak i rozbudowany system zarządzania pieniędzmi. To naprawdę krótki opis, FG aktualnie już ( pomijam, że to koło 50% prac ) ma prawie 10k linijek kodu. A do napisania jest hohoho :-) Aby przepisać mod Calypso to tydzień, ale żeby napisać aplikację z prawdziwego zdarzenia to i parę miesięcy Ci zejdzie ( rzadko programuję po pracy, mam dosyć po 8h ). Mimo to - powodzenia ;-) Konkurencja jest zdrowa, ale ja narzucam standardy wyższe niż moja konkurencja światowa, a ich programista jest świetny.
  10. Largo

    FlashFXP - promocja!

    Nie zmienia, nie ma mocy danej od wyższych sfer, Bogiem także nie jest. Dał temat, zobaczyłem informację, znam ten skrypt program i będę z niego korzystał niejednokrotnie. W pracy jako Web Developer dostęp do wielu kont FTP to standard i to przeważyło za tym. A fakt, że FlashFXP jest najbardziej zaawansowanym narzędziem do obsługi protokołu FTP nie powinien dziwić nikogo kto zna lub częściowo interesował się tematem ;-) A przy moich zarobkach to wydatek 20$ z PayPal to lepsze niż wyjście na imprezę piątkową :-) W jeden weekend potrafię 'przelać' przez siebie ok. 3 licencji FlashFXP, lepiej wydać na coś co się przyda, niż dalej 'rozrastać' się tam gdzie nie powinno się w tym wieku ;-)
  11. Largo

    FlashFXP - promocja!

    Witam, Miło mi powiedzieć, że i ja nie mam już ochoty szerzyć grup osób, korzystających z nielegalnego oprogramowania. Licencja zakupiona ;-)
  12. 340 linijka pliku classXML.php Tak więc można coś na to poradzić? Witaj, Albo wgrać nowy plik versions.xml od systemu blogów, albo go poprawić, aby był zgodny ze schematem XML. Z błędu wnioskuję, ze obiekt DOMDocument nie mógł wczytać danego pliku ze ścieżki: /domains/skrypty-forum.com.pl/public_html/admin/applications_addon/ips/blog/xml/versions.xml Sprawdź ją i potem napisz czy ponowne wgranie pliku pomogło. Jeżeli nie, zapodaj na forum jego zawartość.
  13. Witam, ID osoby zalogowanej powinieneś wiedzieć. W czasie inicjacji klasy, czyli konstruktor inicjuje się te dane. Metoda, która Cię interesuje to $this->registry->member()->fetchMemberData(); Oczywiście, żeby się dostać do tej zmiennej musisz mieć rejestr przypisany do pola klasy ( nie konieczne ). A ID osoby piszącej post w jakim bicie?
  14. UPDATE ibf_members SET member_group_id = 4 WHERE member_id = X X - wpisz swój numer ID, zazwyczaj 1.
  15. Witam, Widzę, że koledzy kombinują to samo co ja już mam od dawna :-) Na początek zaznaczę, że nie tak to się robi. Tutaj jest potrzebna wiedza programisty i jego wykonanie, inaczej to nie będzie dynamiczne.
  16. Witaj, Czy Tobie czasem nie chodzi o pola klasy rejestru IP.Board? Zapewne chcesz uzyskać dane z ustawień w panelu ACP, np. ile wynosi jakaś wartość z pola input? Podam Ci sposób na to! Na początek musisz uzyskać instancję klasy rejestru, czyli ipsRegistry, a sposób na to jest prosty - dodaj plik admin/sources/base/ipsRegistry.php i utwórz instancję. Dostęp do tej metody instance() jest publiczny. Pamiętaj, że owa metoda jest statyczna, więc dostęp do niej masz za pomocą konstrukcji ipsRegistry::instance(); Więcej o klasie -> ipsRegistry Kolejna sprawa to pobranie ustawień. Aby to zrobić musisz użyć funkcji fetchSettings(); Dostęp do dane ustawienia opiera się na kluczu w tablicy. Oto przykładowy kod: $this->settings['board_name']; - gdzie board_name to nazwa klucza, pod którą zostało zapisane ustawienie. Dzięki tej operacji w zmiennej lub obiekcie będziesz miał tablicę wszystkich ustawień IP.Board :-) Pozdrawiam, Largo
  17. Hym, nie do końca rozumiem Twoje rozwiązanie. Mam zapisać w tabeli members tymczasowe pole? A przy założeniu X dotacji?
  18. 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
  19. 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.
  20. Witaj, Kolego, HTML się kłania :-) Styl colspan określa ile komórek będzie zawierała cała tabela. Zmień colspan na 4, ponieważ masz 4 komórki tabeli. Poprzez tą operację tabela powinna zostać wyśrodkowana i dodaj klasę short, aby to wykonać wg, standardów CSS wykonanych przez programistów IPS. W jaki sposób? Oto cały, poprawiony kod: <table class='ipb_table'> <tr class='header'> <th width='10%'>{$this->lang->words['showrep_tipo']}</th> <th width='20%'>{$this->lang->words['showrep_usuario']}</th> <th width='20%'>{$this->lang->words['showrep_data']}</th> <th width='60%'>{$this->lang->words['showrep_msg']}</th> </tr> <if test="hasPosters:|:count($points) AND is_array($points)"> {parse striping="whoposted" classes="row1,row2"} <foreach loop="whoposted:$points as $row"> <tr class='{parse striping="whoposted"}'> <td><if test="$row['rep_rating'] == '-1'"> {parse replacement="rep_down"} <else /> {parse replacement="rep_up"} </if> </td> <td class="altrow"> {IPSLib::makeProfileLink(IPSLib::makeNameFormatted( $row['members_display_name'], $row['member_group_id']), $row['member_id'])} {parse template="user_popup" group="global" params="$row['member_id'],$row['members_display_name']"} </td> <td>{parse date="$row['rep_date']" format="short"}</td> <td>'{$row['rep_msg']}'</td> </tr> </foreach> <else /> <tr class='{parse striping="whoposted"}'> <td class='short' colspan='4'><em>{$this->lang->words['showrep_nothing']}</em></td> </tr> </if> </table> Życzę powodzenia w nauce PHP, HTML i CSS, a także poznawanie IP.Board :-) Pozdrawiam, Largo
  21. Według zapytania, rep_msg jest pobierane. Sprawdź to w kodzie używając funkcji print_r().
  22. Witaj, Tak na start Ci powiem, że dziwnie to zrobiłeś - funkcji intval() się powinno używać przed zapytaniem, a powodem jest fakt, że intval() sprawdza zmienną pod kątem integer, czyli liczby całkowitej. Potem można sprawdzić czy ta zmienna w ogóle należy do zbioru liczb całkowitych, ale technikę programowania zostawiam Tobie :-) Budowa zapytania poprawna - powinno działać. I skoro chcesz wyciągnąć rep_msg, to przecież te dane powinieneś mieć. Sprawdź dokładnie funkcją print_r(); * oznacza, że pobierze wszystkie dane z danej tabeli, a skoro Ty chcesz otrzymać rep_msg z tabeli reputation_index to powinieneś je mieć! Jeżeli nie o to Ci chodzi to opiszę Ci schemat IP.Board: $this->DB->build - budujesz zapytanie, które ma zwrócić wiele rekordów. Opcjami dodatkowymi są: selectWybierasz, które dane chcesz wyciągnąć. * oznacza, że chcesz pobrać wszystkie elementy z tabeli.[*]from Deklarujesz informację z której tabeli korzystasz. W przypadku dodania klauzuli add_join musisz stworzyć tablicę z 1 rekordem, składającym się z dwóch danych:nazwę tabeli jako string bez prefix literka, dotyczące aliasu tabeli [*]where Warunki, które musi wykonać zapytanie MySQL lub inny sterownik baz danych. O warunkach poczytaj na oficjalnych stronach sterowników baz danych.[*]add_join Deklarujesz tablicę numeryczną lub kolejne tablice i tworzysz normalnie zapytanie, ale z warunkiem where, który musi składać z kluczy, które połączą rekordy. Przykładem jest ibf_members.member_group_id i ibf_groups.g_id, ponieważ mają te same wartości i się odwołują do tych samych danych. Dodatkiem jest deklaracja typu zapytania, możliwe to:left inner right [*]limit Wymuszasz na bazie danych ile rekordów ma zostać pobranych. W IP.Board musisz stworzyć tablicę, która składa się w ten sposób:start, od którego rekordu ma zacząć pobieranie baza danych. ile baza ma pobrać danych. [*]order Oznacza typ sortowania, składa się ze stringu i musi posiadać minimum 2 parametry. Nazwę pola do sortowania i typ, możliwe to:desc asc [*]group Grupowanie zapytań to już średnia szkoła jazdy. Przykładem jest fakt, że potrzebujesz ile postów napisany w danym forum i w tej sytuacji używasz grupowania. Wymaganym parametrem jest nazwa pola po którym grupujemy - może być ich więcej niż jedna, ale każda kolejna ma mniejszy priorytet. Mam nadzieję, że Ci pomogłem, jak nie, napisz dokładnie w czym masz problem i Ci pomogę! :-) Pozdrawiam, Largo
  23. Witaj, Da się. Poniżej przedstawię sposób. Otwórz: admin/applications/forums/modules_public/forums/board.php Znajdź: //----------------------------------------- // FETCH... //----------------------------------------- while ( $r = $this->DB->fetch() ) { $rows[ $r['running_time'].'.'.$r['id'] ] = $r; } Zamień na: //----------------------------------------- // FETCH... //----------------------------------------- while ( $r = $this->DB->fetch() ) { /* (LW30) Remove banned from Active List */ if( $r['member_group_id'] == $this->settings['banned_group'] ) { continue; } $rows[ $r['running_time'].'.'.$r['id'] ] = $r; } PS. Popraw te linijki z $rows, aby były w jednej linii. Pozdrawiam, Largo
  24. Masz rację, sam skrypt jest dosyć mocno rozbudowany. To jest typowa aplikacja wg. IPS, więc tłumaczenie ich funkcji zajęłoby dużo czasu. Chcę osiągnąć następujące rzeczy: Posiadać statystyki z transakcji. Informacje jak dużo użytkownik używa danych funkcji, jak i globalne informacje co zawiera najwięcej informacji o wykorzystywaniu Forum Gold. Aby użytkownik wiedział z jakich modułów lub aplikacji korzystał, że Forum Gold zostało ściągnięte. Trzymanie tych danych w innej tabeli pozwala na takie informacje. Jestem z kolegą pewny, że tabela słownika jest potrzebna. Ja raczej chcę się dowiedzieć w jaki sposób skrypt w każdym miejscu ma 'wiedzieć' jaki moduł ma zostać zapisany z transakcją. Czyli, przekazując parametr do funkcji ona musi wiedzieć jakie ID podać do zapisu w tabeli transakcji. Modułu mogą być doinstalowane poprzez API Forum Gold. To mogę napisać, aby np. importować plik .xml i dodawać do tabeli te informacje, albo wpisywać je. Pozdrawiam, Largo
  25. Witaj, To mam rozumieć jako? :-) Tak właśnie robimy - mam funkcję tylko do zapisu transakcji, inna ma za zadanie ściągać Forum Gold zależnie od parametru. I tu do funkcji zapisu transakcji chciałbym to dodawać w sposób dynamiczny. Nie tak, że podaję na sztywno dane, ponieważ nie każdy chcę grzebać w plikach, a ta wersja możliwe, że będzie komercyjna. Nie jestem na to przekonany, ale zawsze mogę wyjątek zrobić, jak napiszę system płatności także dynamiczny to trochę na tym systemiku zarobię :-) Ale do sedna - potrzebuję zrobić to tak, że nawet z zewnętrznej aplikacji będę w stanie przekazać informacje dotyczące ID tej tabeli wiążącej. W ten sposób nie dość, że sformatuję transakcje jak chcę ( dodajemy do tabeli klasę CSS, aby pokolorować efekt, a także parę innych opcji, w tym URL do zewnętrznych aplikacji ) to mogę na ich podstawie stworzyć diagram co użytkownicy najchętniej wybierają i na czym się mam skupić. Takie dane dają naprawdę wiele możliwości. Myślałem o Cache, ale jak? Dostęp do zewnętrznych aplikacji chyba tylko taki zostaje? Nie wiem, doradź mi. Pozdrawiam, Largo
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.