Warsztat programistyczny [JS/PHP/HTML/CSS/Inne]

Miejsce, w którym użytkownicy forum mogą pochwalić się swoją, szeroko rozumianą, twórczością artystyczną - prozą, poezją, grafiką, śpiewem czy figurkami z plasteliny, a także blogami, portfoliami, galeriami itp.

Postprzez Luxter » 10 cze 2016, o 13:57

Oferuję pisanie skryptów w wyżej wymienionych technologiach i nie tylko. Zastrzegam, że wykonuję tylko niewielkie/średnie zlecenia (nie będę pisał całych rozszerzeń, systemów itp.) lecz bardziej jakieś krótkie skrypty, które po prostu ułatwiają życie na forum. Więc jeśli masz jakiś pomysł na techniczną rzecz, a nie potrafisz jej sam zaimplementować to możesz tu napisać.

Podkreślam techniczny aspekt mojej działalności, czyli NIE tworzę styli na forum, ładnych rameczek etc.

W skrócie:
  • skrypty
  • techniczne
  • małe/średnie

Jaki jest tego cel? Ano, żeby pbf-y były jak najlepsze. Celowo nie chcę się wiązać z jednym i bardzo się angażować w wielkie projekty, lecz pomóc każdemu, kto chciałby żeby jego forum oferowało ciut więcej dla wygody graczy.

Nie wiesz czy dany pomysł da się zrealizować lub czy mu podołam? Sprawdź mnie.

Czego oczekuję w zamian za wykonanie skryptu? Wzmianki o tym, że jestem jego twórcą jeśli go wykorzystasz u siebie (np. w formie ogłoszenia administracyjnego - tak żeby było to po prostu widoczne).

Spis skryptów:
Ostatnio edytowano 17 cze 2016, o 16:20 przez Luxter, łącznie edytowano 4 razy
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Luxter » 12 cze 2016, o 20:07

Wrzucam na zachętę małe demo (wykorzystuje dodatkowo JQuery):
https://jsfiddle.net/pcnav68u/19/

Jest to bardzo prosta sygnatura z dynamicznymi danymi. Może posłużyć na przykład do prezentowania statystyk postaci wczytanych z bazy danych/pól profilowych/wartości ze zdarzeń etc.

W przykładzie zamieściłem instrukcje, którymi można z poziomu javascriptu wypełniać poszczególne sygnatury. Szczegóły pewnie będą się różnić od silnika do silnika (doświadczenie mam tylko z phpBB3.1+), ale idea pozostaje ta sama.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Luxter » 15 cze 2016, o 14:01

Małe co nieco z PHP: http://phpfiddle.org/main/code/35dw-j079

Jest to funkcja, która automatycznie podmienia wprowadzone linki na klikalne. Można skorzystać wszędzie tam, gdzie normalnie linków wstawiać nie można, jak np. pola profilowe etc.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Luxter » 17 cze 2016, o 11:27

JS + JQuery + szczypta AJAXa = https://jsfiddle.net/Luxter/7b1j45rz/5/

Mega prosta funkcja serwująca losowe wiadomości ze zdefiniowanej puli. Jest to we wszystkich grach to i na PBF-ach może się przyda. Enjoy.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Maestro » 21 cze 2016, o 19:21

Witaj,
Czy masz może więcej prac do zaprezentowania? Albo może konkretniej określisz, czym możesz się zająć? Bo w sumie pokazałeś, że umiesz zrobić zagięty róg strony, który ujawnia kawałek następnej po najechaniu, sygnaturkę z dynamicznymi danymi oraz jakieś losowe wiadomości z puli. Niby fajne, ale poza ostatnim (przy odpowiednich modyfikacjach), nie ma niczego co ja osobiście użyłbym na forum.

Co konkretnie tyczy się prac małych i średnich? Czy edycja skryptu shouboxa, aby był bardziej dostosowany do potrzeb forum na silniku mybb, to jest małe, średnie, czy w ogóle nie wchodzi w grę? Edycja czy spisanie dajmy na to konkretnego menu bocznego, które pasowałoby do wyglądu forum jest możliwe? Czy to już jest coś z "całych rozszerzeń", którymi się nie zajmujesz?

W sumie chciałbym mieć nieco wyraźniejszy wgląd na to co robisz, a czego nie, bo nie chce mi się rozpisywać nad daną rzeczą, by potem dowiedzieć się, że czegoś nie robisz bo wyszło poza małe/średnie zlecenie. A na chwilę obecną pokazujesz pierdołki, które pewnie mógłbym zakodować sam, gdybym poświęcił na to czas. Czemu tak mówię? Bo wpisałem "syganatura, dynamiczne dane" w google i po niecałej minucie miałem wątek, który odesłał mnie do manuala, z kodem na zapewne coś podobnego (z tego co wyczytałem z opisu), więc jakbym chciał i rzucił konkretniejsze zapytanie w google, to pewnie znalazłbym kody css i jQuery, więc na tę chwilę nie oferujesz mi niczego, czego nie byłbym w stanie zrobić sam.

Pozdrawiam.
Avatar użytkownika
Maestro
 
Posty: 17
Dołączył(a): 26 lut 2016, o 13:07

Postprzez Luxter » 22 cze 2016, o 10:34

Z założenia temat służy do zajmowania się "pierdółkami" dla ludzi, którym zrobienie tego co chociażby tutaj w ramach demonstracji prezentowałem zajęłoby sporo czasu (powiedzmy że męczyliby się kilka dni, a mi zajęło to 15 minut). Przykłady są takie a nie inne bo je po prostu zmyślam, nie mam swojego forum, więc nie wiem co na takowym by się przydało - po to jest ten temat.

Co zaś tyczy się edycji skryptu przykładowego shoutboxa na mybb - to zależy. Przede wszystkim czy miałbym jak dokonać takiej edycji. Zmiana sama w sobie może być prosta, ale muszę mieć możliwość testowania i uruchamiania skryptu. W skrócie: musiałbym mieć udostępnione środowisko do takiej zabawy typu jakieś puste testowe forum z wgranym sb, dostępem do PA, dostępem do FTP i pewnie jeszcze kilkoma mniejszymi rzeczami. I wszystkie tego typu rzeczy jak to menu boczne (z którym nie zrozumiałem o co chodzi, bo jak o dopasowanie do wyglądu forum to nie jest to rzecz techniczna), będą wymagały przygotowania takiego dostępu, a to pewnie będzie upierdliwe. Ewentualnie mógłbym robić to u siebie lokalnie, tutaj jednak wkradają się inne problemy - możemy mieć inne wersje, konfigurację, mody, exty etc. a to wszystko potencjalnie może sprawić, że to co "u mnie działa" u Ciebie już takie nie będzie.

Na koniec dodam, że nawet jakbym napisał jakiś względnie duży skrypt, który no nie wiem, automatycznie przenosi użytkowników do grupy "nieaktywni" po np. miesiącu od ostatniego posta to to nadal jest coś co "możesz sam napisać" i to bez względu na jego rozmiar. Moje usługi są więc względne wobec zleceniodawcy - jest jednak szansa, że zrobię to szybciej/lepiej.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Luxter » 12 sty 2017, o 11:20

Jako, że trafiło mi się ostatnio drogą prywatną zlecenie na stworzenie BBCode pod phpBB by Przemo za zgodą zlecającego wrzucam tu kod, a także na jego przykładzie krótko i zwięźle wytłumaczę jak samemu taki BBCode stworzyć w przyszłości. WYDAJE MI SIĘ, że na zwykłym phpBB w wersji 2.x działa to w sposób analogiczny (a w 3.x jest to już dużo lepiej rozwiązane).

Aby stworzyć prosty BBCode bez żadnych fajerwerków typu: dodawanie go do spisu przycisków BBCode w widoku pisania posta czy prywatnej wiadomości wystarczy dokonać zmian w 2 plikach:
  1. includes/bbcode.php - tutaj zawiera się cała logika zamieniania znacznika BBCode na odpowiedni HTML
  2. templates/NAZWA_NASZEGO_STYLU/bbcode.tpl - tutaj zawiera się spis HTML BBCode, które są wstawiane w miejsce znaczników

Jak widać nie ma wielkiej filozofii. W bbcode.php jest zamiana znacznika BBCode na znacznik HTML, który dodajemy do bbcode.tpl. Banalnie proste.

Zacznijmy od pliku bbcode.tpl. Składa się on po prostu z serii linii w formacie:
Kod: Zaznacz cały
<!-- BEGIN IDENTYFIKATOR -->Znacznik HTML<!-- END IDENTYFIKATOR -->


Gdzie "IDENTYFIKATOR" to unikatowa nazwa pozwalająca rozróżnić znaczniki HTML między sobą a "Znacznik HTML" to jest to co chcemy żeby się pojawiało w miejsce naszego BBCode. W naszym przykładzie wygląda to tak:
Kod: Zaznacz cały
<!-- BEGIN karta_open --><div style="background-color: #101019; width: 634px; border: 8px double #020307; padding: 4px; color: #56565D; font-family: tahoma; font-size: 12px; text-align: justify;"><!-- END karta_open -->
<!-- BEGIN karta_close --></div><!-- END karta_close -->


Jak widać nasz BBCode składa się z dwóch części. Znacznika otwierającego "karta_open" i zamykającego "karta_close", które de facto odpowiadają znacznikom <div> z HTML-a (z atrybutem style, żeby nadać mu pożądany wygląd). I już. Czyli nasz BBCode składający się z dwóch części [karta]Treść[/karta] sprawi, że [karta] zamieni się na <div style="nasze stylowanie">, a znacznik [/karta] na </div>. I już.

Teraz trzeba sprawić, żeby faktycznie ta zamiana miała miejsce. Na razie jedyne co zrobiliśmy to zdefiniowaliśmy NA CO ma się zamienić nasz znacznik BBCode, ale to nie oznacza, że zamiana od tak odbywa się automatycznie. Przyjrzyjmy się teraz zawartości bbcode.php.

Interesują nas dwie zdefiniowane wewnątrz niego funkcje: function bbencode_first_pass($text, $uid), oraz function bbencode_second_pass($text, $uid, $username = ''). Są one wywoływane odpowiednio: first_pass przed zapisem postu do bazy danych i second_pass przed wyświetleniem postu.

W praktycznie dowolnym miejscu funkcji function bbencode_first_pass($text, $uid) (najlepiej gdzieś koło podobnych linijek) dodajemy taką oto linijkę:
Kod: Zaznacz cały
$text = preg_replace("#\[karta\](.*?)\[/karta\]#si", "[karta:$uid]\\1[/karta:$uid]", $text);


W kwestii minimalnego wyjaśnienia. Zmienna $text to treść naszego postu. Wywołując funkcję preg_replace wyszukujemy w zmiennej $text (w poście) danego elementu "#\[karta\](.*?)\[/karta\]#si" i zamieniamy go na "[karta:$uid]\\1[/karta:$uid]". Po szczegóły odsyłam do dokumentacji funkcji preg_replace oraz zagadnienia wyrażeń regularnych. Nie zagłębiając się w to wybitnie to co tu się tak naprawdę dzieje? Ano wyszukujemy w poście fragmentu [karta]TUTAJ_COKOLWIEK[/karta] i zamieniamy go na [karta:$uid]TUTAJ_TO_COKOLWIEK_CO_BYŁO_WCZEŚNIEJ[/karta:$uid]. Czyli de facto dodajemy do naszych znaczników [karta][/karta] :$uid gdzie zmienna $uid przechowuje unikalny identyfikator posta.

Właściwie to trochę zgaduję po co robimy ten krok, ale wszystkie przykładowe BBCode właśnie trzymają się ten konwencji, więc przez analogię również uwzględniam ten krok. WYDAJE MI SIĘ, że dodawanie unikalnego identyfikatora posta do każdego BBCode w nim zawartego sprawia, że BBCode działają w obrębie jednego posta (CZYLI NIE MOŻNA OTWORZYĆ BBCode W JEDNYM POŚCIE I ZAMKNĄĆ GO W INNYM). Ale jak mówię, jest to moje gdybanie. Jeśli się nie mylę to w bazie danych, w treści posta, wszystkie BBCode typu [ b] czy [­ center] powinny być z identyfikatorami tego posta czyli [b:$uid] [center:$uid]. No nic, przyjmijmy że tak jest. Jak zapewne zauważyliście udało nam się dokleić do naszego BBCode [karta][/karta] uid posta czyli [karta:uid][/karta:uid].

A skoro potrafimy to zrobić, to analogicznie wystarczy teraz zamienić [karta:uid][/karta:uid] na nasz html z bbcode.tpl. W tym celu musimy w praktycznie dowolnym miejscu funkcji function bbencode_second_pass($text, $uid, $username = '') (najlepiej gdzieś koło podobnych linijek) dodać linie:
Kod: Zaznacz cały
$text = ($board_config['button_b']) ? str_replace("[karta:$uid]", $bbcode_tpl['karta_open'], $text) : str_replace("[karta:$uid]", '', $text);
$text = ($board_config['button_b']) ? str_replace("[/karta:$uid]", $bbcode_tpl['karta_close'], $text) : str_replace("[/karta:$uid]", '', $text);


Dodając to w funkcji bbencode_second_pass gwarantujemy, że wcześniej wywołana była bbencode_first_pass (w której to doklejaliśmy nasze :$uid). Jak widać są one bardzo podobne do tej doklejającej :$uid. Najważniejsza rzecz to zastosowany operator "(warunek) ? (kod jeśli prawda) : (kod jeśli fałsz)". Jak widać naszym warunkiem jest ($board_config['button_b']), który po prostu sprawdza czy w ustawieniach forum jest włączone przetwarzanie BBCode. Jeśli tak to zamieniamy [karta:$uid] na $bbcode_tpl['karta_open'], czyli na znacznik HTML pomiędzy <!-- BEGIN karta_open --><!-- END karta_open --> z pliku bbcode.tpl, który wcześniej dodaliśmy. Jeśli nie to po prostu zamieniamy [karta:$uid] na '' czyli pusty znak, czyli usuwamy. Dla [/karta] rzecz ma się zupełnie analogicznie.

Tym oto sposobem nasz znacznik [karta]COŚ[/karta] najpierw w funkcji bbencode_first_pass zamieniany jest na [karta:$uid]COŚ[/karta:$uid], a następnie w funkcji bbencode_second_pass znacznik [karta:$uid]COŚ[/karta:$uid] zamieniany jest na
Kod: Zaznacz cały
<div style="background-color: #101019; width: 634px; border: 8px double #020307; padding: 4px; color: #56565D; font-family: tahoma; font-size: 12px; text-align: justify;">COŚ</div>


I gotowe. Nasz prosty, zupełnie nowy BBCode zajął dosłownie 3 linie w pliku bbcode.php i 2 linie w bbcode.tpl. Mam nadzieję, że każdemu teraz uda się dodać własny BBCode na swoje forum. Powodzenia.

PS. Link do archiwum .zip z zedytowanymi plikami bbcode.php i bbcode.tpl http://www.filedropper.com/kartabbcode jakby ktoś się zgubił w wyjaśnieniach bądź nie wiedział co gdzie wkleić.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Izayeth » 5 lut 2017, o 12:25

Witam, chciałbym złożyć zamówienie na customowy bbcode.

Wersja PHPBB: 3.1.10 lub 3.2 (w zależności czy uda mi się uaktualnienie forum)

W założeniu ma on działać tak, że gdy zawrę jakiś wyraz w tagu [ob][/ob], to tekst pokryje się takim niby-hiperłączem, które po najechaniu wyświetli chmurkę z tekstem z objaśnieniem danego pojęcia. Może być ono zawarte w jakiejś bazie danych, bylebym wiedział jak dodawać do niej nowe słowa i ich definicje.
Izayeth
 
Posty: 21
Dołączył(a): 21 mar 2013, o 23:18
Numer GG: 5678394

Postprzez Luxter » 7 lut 2017, o 11:16

No i zamówienie zrealizowane. Jest to nowy BBCode, który wyświetla w dymku definicje wprowadzone do bazy danych. Udało się je też poprawnie wgrać na forum, więc można powiedzieć, że działa w 100%. Zgodnie z życzeniem jest to extension pod phpBB w wersji 3.2 (ale podejrzewam, że przy niewielkich/braku poprawek na 3.1 też by zadziałało).
Pora na krótką instrukcję obsługi, gdzie skupię się na tym jak ext-a wgrać i doprowadzić do stanu używalności, a nie jak tworzyć ext-y (o czym jest wybitnie dużo materiałów na samej stronie phpBB). Przyjmę tylko jako hosting cba.pl na potrzeby objaśnień, ale to bez najmniejszego znaczenia. A więc do dzieła.

1. Zaczynamy od ściągnięcia mojego ext-a stąd: http://www.filedropper.com/luxter Jest to zwykły .zip z typową strukturą katalogów dla ext-ów, tak żeby szybko, łatwo i przyjemnie go wgrać na nasze forum.
2. Bierzemy cały folder "luxter" i wrzucamy go przez FTP na nasz serwer do katalogu /ext
3. Wchodzimy w panel administracyjny naszego forum zakładka "Customize" i szukamy naszego "Dictionary BBCode" oczywiście klikając "Enable". I już. Czyż wgrywanie rozszerzeń nie jest piękne? Ale uwaga!
Obrazek
4. Jako, że nasz ext służy do podmieniania definicji z bazy danych, to musimy też ręcznie wprowadzić zmiany do bazy. Wchodzimy więc sobie do zarządzania naszą bazą danych przez panel cba wybieramy naszą bazę danych i od razu wybieramy na górze "SQL".
Obrazek
Teraz wklejamy sobie takie coś:
Kod: Zaznacz cały
CREATE TABLE `phpbb_dictionary` (
 `name` varchar(255) COLLATE utf8_bin NOT NULL,
 `definition` varchar(1000) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC

I klikamy wykonaj.
Obrazek
Jest to komenda tworząca nową tabelę w naszej bazie danych. Można ją sobie równie dobrze wyklikać z interfejsu, ale tak jest po prostu szybciej.
Teraz nie pozostało nam już nic innego jak powypełniać nasz słownik danymi. Można to znowu zrobić poprzez interfejs (wybieramy naszą nową tabelę "phpbb_dictionary" -> klikamy "Wstaw" -> uzupełniamy pola), albo przez konsolę SQL jak poprzednio, przykładowo:
Kod: Zaznacz cały
INSERT INTO `phpbb_dictionary` (`name`, `definition`) VALUES ('python', 'język programowania wysokiego poziomu ogólnego przeznaczenia[2], o rozbudowanym pakiecie bibliotek standardowych[3], którego ideą przewodnią jest czytelność i klarowność kodu źródłowego. Jego składnia cechuje się przejrzystością i zwięzłością[4][5].')

Zwracam tylko uwagę, że pierwsza wartość pod kolumną "name" to klucz i musi być ona unikatowa oraz zaczynać się z małej litery.
Obrazek
Obrazek
5. Teraz możemy korzystać sobie z naszego nowego BBCode (domyślnie jest to [d]<name_z_bazy_danych[/d]) i po wysłaniu posta i jego przeglądaniu będą nam się pojawiać dymki z definicjami prosto z bazy danych.

Przykład:
Obrazek

Niestety na zrzucie ekranu nie widać kursora (ale zaznaczyłem czerwonym prostokątem gdzie był i co się pojawiło).

Kod jest dostępny dla wszystkich i każdy może go sobie wgrać na forum. Pragnę tylko przypomnieć by wspomnieć gdzieś na forum w widocznym miejscu o tym kto jest autorem rozszerzenia. Enjoy!

PS. Można by tę całą zabawę z bazą danych zautomatyzować, lecz postanowiłem tego nie robić, gdyż wtedy usuwajac rozszerzenie (lub przypadkowo je wyłączając i czyszcząc) utracilibyśmy wszelkie wprowadzone dane. W ten sposób dane zostają z resztą bazy danych niezależnie od tego co się z ext-em dzieje.
PS2. Klikając PPM->"Otwórz obrazek w nowym oknie" możemy go zobaczyć w lepszym rozmiarze i rozdzielczości.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Luxter » 13 mar 2017, o 19:12

Kolejny ekspresowy tutorial. Tym razem będą to "ciekawsze" ramki do avatarów. Postaramy się zrobić coś, co nie jest zwykłym czarnym prostokątem, lecz bardziej fikuśnym tym: https://jsfiddle.net/Luxter/u9wyj1wf/3

Jak widać html jest MEGA prosty: to <div> kontener na dwa obrazki <img> (każdy element ze swoją klasą css).

Do tego mamy tylko i wyłącznie css, bez żadnych javascriptów i innych takich.

Kod: Zaznacz cały
.parent {
  position: relative;
}


Ustalamy, że pozycje dzieci (obrazków) mają być względem rodzica (kontenera).

Kod: Zaznacz cały
.image1 {
  clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
}


To skomplikowane coś "przycina" nam spodni obrazek, w tym przypadku avatar, do zadanego kształtu. Niestety o tym trzeba doczytać LUB skorzystać z narzędzia, które to wygeneruje za nas: http://bennettfeely.com/clippy/

Kod: Zaznacz cały
.image2 {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 150px;
  height: 200px;
}


Tym natomiast przenosimy wierzchni obrazek (należy pamiętać, żeby miał przezroczyste tło, inaczej zasłoni drugi) nad spodni. Ja dodatkowo dodałem parametry width i height, gdyż oba obrazki były różnych wymiarów. Ramka może mieć dowolny kształt, gdyż clip-path przytnie do dowolnego wielokąta. I to wszystko. Enjoy!
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Nocny » 22 kwi 2017, o 18:24

Witaj,
może będziesz w stanie mi pomóc.
Wrzuciłem na moje forum własne pola profilu i wyglądają one następująco: LINK
Cała sprawa rozchodzi się oto aby nieco poprawić wygląd. Zależy mi na tym, aby tekst był wyjustowany i aby była stała szerokość tych tabel (przy większej ilości tekstu obecny był suwak) no i może nieco zmniejszyć odległość, aby ta komórka po lewej nie była taka wielka i pusta.

Wiem (chyba) jaki plik za to odpowiada - member_profile
Kod: Zaznacz cały
<html>
<head>
<title>{$mybb->settings['bbname']} - {$lang->profile}</title>
{$headerinclude}
<script type="text/javascript" src="{$mybb->asset_url}/jscripts/report.js?ver=1804"></script>
   
   
<script>
   $(document).ready(function(){
   
   $('ul.tabs li').click(function(){
      var tab_id = $(this).attr('data-tab');

      $('ul.tabs li').removeClass('current');
      $('.tab-content2').removeClass('current');

      $(this).addClass('current');
      $("#"+tab_id).addClass('current');
   })

})
   </script>
   
<style>
         .container2{
         margin: 0 auto;
      }



      ul.tabs{
         margin: 0px;
         padding: 0px;
         list-style: none;
      }
      ul.tabs li{
         background: none;
         color: #fff;
         display: inline-block;
         padding: 10px 15px;
         cursor: pointer;
         margin-top: 10px;   
         
      }

      ul.tabs li.current{
          background: rgba(15,15,15,0.95);
         color: #fff;
             -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    border-radius: 2px;
      }

      .tab-content2{
         display: none;
         padding: 1px;
         width: 100%
         
      }

      .tab-content2.current{
         display: inherit;
      }
   </style>
   
   
   
   
</head>
<body>
{$header}
<div class="float_right" style="text-align: center">{$buddy_options}{$ignore_options}{$report_options}</div> <br /><br />
<fieldset>
   <table width="100%" cellspacing="0" cellpadding="0" border="0">
      <tr>
         <td width="75%">
            <span class="largetext"><strong>{$formattedname}</strong></span><br />
            <span class="smalltext">
               ({$usertitle})<br />
               {$groupimage}
               {$userstars}<br />
               <br />
               <strong>{$lang->registration_date}</strong> {$memregdate}<br />
               <strong>{$lang->date_of_birth}</strong> {$membday} {$membdayage}<br />
               <strong>{$lang->local_time}</strong> {$localtime}<br />
               <strong>{$lang->postbit_status}</strong> {$online_status}
            </span>
         </td>
         <td width="25%" align="right" valign="middle">{$avatar}</td>
      </tr>
   </table>
</fieldset>
<br />
   
   
<div class="container2">

   <ul class="tabs">
            <li class="tab-link current" data-tab="tab-3"><strong>Karta Postaci</strong></li>
      <li class="tab-link" data-tab="tab-1"> Informacje</li>
      <li class="tab-link" data-tab="tab-2">Kontakt</li>
      <li class="tab-link" data-tab="tab-4">Podpis</li>
      <li class="tab-link" data-tab="tab-5">Moderuj</li>
   </ul>

   <div id="tab-1" class="tab-content2">
      
      <br />
      
<table width="100%" cellspacing="0" cellpadding="0" border="0" align="center">
   <tr>
      <td width="50%" valign="top">
         <table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
            <tr>
               <td colspan="2" class="thead"><strong>{$lang->users_forum_info}</strong></td>
            </tr>
            <tr>
               <td class="trow1" style="width: 10%;"><strong>{$lang->joined}</strong></td>
               <td class="trow1">{$memregdate}</td>
            </tr>
            <tr>
               <td class="trow2"><strong>{$lang->lastvisit}</strong></td>
               <td class="trow2">{$memlastvisitdate}</td>
            </tr>
            <tr>
               <td class="trow1"><strong>{$lang->total_posts}</strong></td>
               <td class="trow1">{$memprofile['postnum']} ({$lang->ppd_percent_total}){$findposts}</td>
            </tr>
            <tr>
               <td class="trow2"><strong>{$lang->total_threads}</strong></td>
               <td class="trow2">{$memprofile['threadnum']} ({$lang->tpd_percent_total}){$findthreads}</td>
            </tr>
            <tr>
               <td class="trow1"><strong>{$lang->timeonline}</strong></td>
               <td class="trow1">{$timeonline}</td>
            </tr>
            {$referrals}
            {$reputation}
            {$warning_level}
         </table>
      </td>
   </tr>
</table>

      
      
   </div>
   <div id="tab-2" class="tab-content2">
   <br />   {$contact_details}
   </div>
   <div id="tab-3" class="tab-content2  current">
   <br />   {$profilefields}<table width="100%" cellspacing="0" cellpadding="0" border="0" align="center">
   <tr>
      <td width="50%" valign="top">
         <table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
            <tr>
                              <td class="trow1" style="width: 5%;"><strong>{$newpoints_profile}</strong></td>
            </tr>
         </table>
      </td>
   </tr>
</table>
   </div>
   <div id="tab-4" class="tab-content2">
   <br />   {$signature}
   </div>
   <div id="tab-5" class="tab-content2">
   <br />   {$modoptions}{$adminoptions}
   </div>
</div>   
   

   
{$footer}
</body>
</html>

Tak się prezentuje. To, gdzie znajdują się moje dodatkowe pola określa ten kod:
Kod: Zaznacz cały
   </div>
   <div id="tab-2" class="tab-content2">
   <br />   {$contact_details}
   </div>
   <div id="tab-3" class="tab-content2  current">
   <br />   {$profilefields}<table width="100%" cellspacing="0" cellpadding="0" border="0" align="center">
   <tr>
      <td width="50%" valign="top">
         <table border="0" cellspacing="{$theme['borderwidth']}" cellpadding="{$theme['tablespace']}" class="tborder">
            <tr>
                              <td class="trow1" style="width: 5%;"><strong>{$newpoints_profile}</strong></td>
            </tr>
         </table>


Tylko nie wiem jak go odpowiednio zmodyfikować, aby odpowiadał temu, co chcę osiągnąć.

Styl, który używam: igame od iAndrew
Silnik forum: mybb wersja 1.8.11

To w sumie tyle. Jak potrzeba dodatkowych informacji czy konkretnych kodów to podam.
Z góry dziękuję za pomoc.
Avatar użytkownika
Nocny
 
Posty: 9
Dołączył(a): 18 mar 2017, o 12:47

Postprzez Luxter » 23 kwi 2017, o 10:52

Najprawdopodobniej musisz edytować plik member_profile_custom_fields. W nim szukasz takiego fragmentu:
Kod: Zaznacz cały
<!-- start: member_profile_customfields -->
<table border="0" cellspacing="0" cellpadding="5" class="tborder tfixed">
<colgroup>
<col style="width: 30%;" />
</colgroup>
<tr>
<td colspan="2" class="thead"><strong>Dodatkowe informacje o Kreator</strong></td>


Ta wartość procentowa "30%" odpowiada za szerokość pierwszej kolumny Twoich pól profilowych.

Odnośnie wyjustowania tekstu interesuje Cię plik css3.css (Boże, co to za okropne nazewnictwo?!), a konkretniej ten fragment:
Kod: Zaznacz cały
tr td.trow1:last-child,
tr td.trow2:last-child,
tr td.trow_shaded:last-child {
   border-right: 0;
}


Należy dodać do niego taką oto linię odpowiadającą za ustawienie tekstu: text-align: justify;, czyli finalnie ma wyglądać to tak:
Kod: Zaznacz cały
tr td.trow1:last-child,
tr td.trow2:last-child,
tr td.trow_shaded:last-child {
   border-right: 0;
   text-align: justify;
}


Z ostatnią rzeczą nie jestem pewien czy dobrze Cię zrozumiałem. Chcesz mieć stałą WYSOKOŚĆ tych pól po prawo i jakby było więcej tekstu niż się w takiej zmieści to żeby pojawiał się suwak? W takim wypadku niestety ale trzeba ciut więcej pokombinować. To doskonały przykład na to, dlaczego świat uciekł od tabel i poszedł do divów. Niestety, ale nie da się (a przynajmniej w prosty sposób, albo ja nie potrafię) zmusić komórki, żeby była mniejsza niż jej zawartość (czyli zawsze rozszerza się tak, żeby objąć wszystko co jest w środku). Z tego też powodu musimy wstawić <div> WEWNĄTRZ aktualnej <td> i dopiero naszego <div> odpowiednio możemy stylować. Rozpatrzmy przykład pojedynczego pola profilowego:
Kod: Zaznacz cały
<!-- start: member_profile_customfields_field -->
<tr>
<td class="trow2"><strong>Sen:</strong></td>
<td class="trow2 scaleimages">Bla bla treść pola profilowego.</td>
</tr>


A więc najpierw dodajemy <div> do środka <td>, którego wymiary chcemy kontrolować i dodać przewijanie:
Kod: Zaznacz cały
<!-- start: member_profile_customfields_field -->
<tr>
<td class="trow2"><strong>Sen:</strong></td>
<td class="trow2 scaleimages">
   <div class="scrollable_cell">
      Bla bla treść pola profilowego.
   </div>
</td>
</tr>


Od razu dodałem naszemu <div> klasę "scrollable_cell", żebyśmy jego formatowanie mogli wrzucić do pliku .css (może być w tym nieszczęsnym css3.css). Tam dodajemy takie linijki:
Kod: Zaznacz cały
.scrollable_cell {
    height: 100px;
    overflow-y: scroll;
}


Oczywiście wysokości 100 pikseli jest przykładowa. Dodatkowo dodajemy wyłącznie scrollowanie w pionie stąd overflow jedynie w osi y. Niestety, ale takie div-y z odpowiednią klasą trzeba wstawić ręcznie dla każdego pola, które chcemy żeby się przewijało (ale stylowanie w pliku .css wystarczy dodać tylko raz!).

To chyba wszystko, jeśli dobrze zrozumiałem to o przewijaniu. Jak coś to pisz. Enjoy!
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Jass » 16 maja 2017, o 19:36

Kolejna zagwozdka z serii...
... wydaje mi się, że to niemożliwe, ale...

Wartość domyślna pola profilu

Mam ustawionych kilkanaście pól profilu. Lista jest dość długa... żadne pole profilu nie jest obowiązkowe przy rejestracji. W każdym razie gdzieś pośrodku jest pole profilu Poziom życia. Poziom życia dla każdego użytkownika na początku gry wynosi 100% i dopiero z czasem się zmienia. I tutaj moja zagwozdka. Czy jest możliwe aby każdy użytkownik po rejestracji miał automatycznie domyślną wartość pola profilu?

Dla zobrazowania:
Użytkownik Kowalski rejestruje się na forum. Standardowo wypełnia login, email, hasło i tyle. Po zarejestrowaniu w edycji profilu ma już ustawioną wartość domyślną pola profilu Poziom życia na 100%. I wartość tą oczywiście może dowolnie zmieniać.

Skrypt: Przemo, wersja: 1.12.8, styl: Saphic.
Plik w stylu viewtopic_body.tpl definiuje wszystkie pola profilu jednakowo zapisem:
<!-- BEGIN custom_fields_avatar -->
{postrow.custom_fields_avatar.DESC}{postrow.custom_fields_avatar.FIELD}
<!-- END custom_fields_avatar -->

... więc tutaj nic nie mogę zrobić. Oddzielnie pola profilu są definiowane dopiero w bazie gdzie mają przypisane różne ID. Nie wiem czy da się to zrobić (rozumiem, że przemo... więc może się nie dać), ale jak da się to prosiłabym dodatkowo o instrukcję krok po kroku (jakby mi przyszło jeszcze kiedyś inne pole profilu sobie tak modyfikować), a jak się nie da to trudno i dziękuję za chęci.

PS. Mogę dać dostęp do forum testowego.
Obrazek
Avatar użytkownika
Jass
Administrator
 
Posty: 509
Dołączył(a): 12 sie 2012, o 21:17
Numer GG: 10794287

Postprzez Luxter » 21 maja 2017, o 13:37

Oczywiście, że jest to możliwe i nawet stosunkowo proste (chociaż Przemo nie ułatwia niektórych rzeczy, o czym przekonamy się za chwilę). Zacznijmy od rozeznania wroga, czyli tego gdzie należy zmiany wprowadzać:
  • admin/admin_custom_fields.php - ten plik odpowiada za logikę pól profilowych w panelu administracyjnym. Najłatwiej dodać wartość domyślną do pola profilowego w momencie jego tworzenia, toteż "zapinamy" się z naszym kodem tutaj.
  • templates/Saphic/admin/custom_fields.tpl - ten plik definiuje widok w/w funkcjonalności w panelu administracyjnym. Chcemy, żeby użytkownik mógł wprowadzić tę wartość z poziomu PA, więc trzeba tam wyświetlić dodatkowe pola. Na potrzeby przykładu rozważam styl Saphic.
  • language/lang_polish/lang_custom_fields.php - ten plik definiuje wszelkie wyświetlane napisy w/w funkcjonalności w panelu administracyjnym. Na potrzeby przykładu rozważam tylko język polski.
  • includes/usercp_register.php - ten plik definiuje logikę przy rejestracji użytkownika. Niestety musimy stąd pousuwać parę rzeczy, gdyż Przemo na siłę wypełnia pola profilowe pustymi ciągami znaków.

Na początek ręczna zmiana w bazie (musimy dodać nową kolumnę na wartość domyślną dla naszego pola). Możemy ją wyklikać z poziomu obsługi bazy danych, albo po prostu wykonać zapytanie:
Kod: Zaznacz cały
ALTER TABLE `phpbb_profile_fields` ADD `def_value` VARCHAR(255) NOT NULL DEFAULT '' AFTER `min_value`;


W moim zamyśle umieszczam wartość domyślną pola profilowego pod wartością "minimalnej wartości" danego pola (ułatwia mi to później odnajdywanie odpowiednich fragmentów kodu: widzę, że coś jest robione z minimalną wartością = powinienem coś zrobić z domyślną). I tak po kolei:

admin/admin_custom_fields.php:
Dodaję w 48 linii:
Kod: Zaznacz cały
$def_value = trim($HTTP_POST_VARS['def_value']);


Odpowiada to po prostu za zapamiętanie wprowadzonej do formularza wartości w momencie jego wysyłania (czyli zatwierdzania nowego pola przyciskiem). Wbudowana w php funkcja trim() po prostu usuwa nadmiarowe białe znaki z początku i końca, np. zamienia " spacje na początku" na "spacje na początku".

W linii 96 dodaję:
Kod: Zaznacz cały
$def_value = '';


Jest to wartość domyślna naszej wartości domyślnej (heh), gdy dodajemy nowe pole. Jak widać inne pola również mają swoją wartość początkową (min = 1, max = 45), a wartość początkowa dla naszej wartości domyślnej to '' czyli pusty ciąg znaków.

W linii 123 dodaję:
Kod: Zaznacz cały
$def_value = $row['def_value'];


Jest to wartość pobrana z bazy danych na potrzeby edycji już istniejącego pola profilowego.

Dalej zmieniamy linię 314:
Kod: Zaznacz cały
$sql = "INSERT INTO " . FIELDS_TABLE . " (desc_short, desc_long, makelinks, max_value, min_value, def_value, numerics, jumpbox, requires, view_post, view_profile, set_form, no_forum, prefix, suffix, editable, view_by)
      VALUES ('" . str_replace("\'", "''", $desc_short) . "', '" . str_replace("\'", "''", $desc_long) . "', $makelinks, $max_value, $min_value, '" . str_replace("\'", "''", $def_value) . "', $numerics, '" . str_replace("\'", "''", $jumpbox) . "', $requires, $view_post, $view_profile, $set_form, '" . str_replace("\'", "''", $no_forum_sql) . "', '" . str_replace("\'", "''", $prefix) . "', '" . str_replace("\'", "''", $suffix) . "', $editable, $view_by)";


Do zapytania SQL typu INSERT (wstawiającego do bazy danych) dorzucamy po prostu wartość naszej zmiennej $def_value. Idąc zgodnie z konwencją używamy str_replace("\'", "''", zmienna), co powoduje zastąpienie pojedynczego ' przez dwa ''. Zapobiega to wszelkiego rodzaju atakom, które przedwcześnie zmieniłyby zapytanie poprzez zamknięcie go znakiem '.

Dalej linię 334 zamieniamy na:
Kod: Zaznacz cały
$field_type = ($numerics) ? "INT($max_value) DEFAULT '0' NOT NULL" : "VARCHAR($max_value) DEFAULT '$def_value' NOT NULL";


Ustawia to po prostu wartość domyślną danej kolumny tabeli USERS_TABLE na naszą wartość (czyli dokładnie to o co nam chodzi).

Niżej od linii 368 dodajemy wreszcie coś więcej kodu:
Kod: Zaznacz cały
$sql = "SELECT def_value
      FROM " . FIELDS_TABLE . "
      WHERE id = $id_form";
   if ( !($result = $db->sql_query($sql)) )
   {
      message_die(GENERAL_ERROR, 'Error checking fields table');
   }
   $row = $db->sql_fetchrow($result);
   $prev_def_value = $row['def_value'];


Fragment ten odpowiada za zapamiętanie aktualnej wartości domyślnej pola profilowego, gdy chcemy ją edytować. Dzięki temu, przy ustawieniu nowej wartości domyślnej podmienimy wszystkie (zapamiętane teraz) wartości poprzednie.

Na tę edycję składają się trzy zapytania. Pierwsze w linii 379:
Kod: Zaznacz cały
$sql = "UPDATE " . FIELDS_TABLE . "
      SET desc_short = '" . str_replace("\'", "''", $desc_short) . "', desc_long = '" . str_replace("\'", "''", $desc_long) . "', makelinks = $makelinks, max_value = $max_value, min_value = $min_value, def_value = '" . str_replace("\'", "''", $def_value) . "', numerics = $numerics, jumpbox = '" . str_replace("\'", "''", $jumpbox) . "', requires = $requires, view_post = $view_post, view_profile = $view_profile, set_form = $set_form, no_forum = '" . str_replace("\'", "''", $no_forum_sql) . "', prefix = '" . str_replace("\'", "''", $prefix) . "', suffix = '" . str_replace("\'", "''", $suffix) . "', editable = $editable, view_by = $view_by
      WHERE id = $id_form";


Odpowiada za zaktualizowanie wartości domyślnej danego pola w tabeli FIELDS_TABLE.

Drugie w linii 388:
Kod: Zaznacz cały
$field_type = ($numerics) ? "INT($max_value) DEFAULT '0' NOT NULL" : "VARCHAR($max_value) DEFAULT '$def_value' NULL";


Uaktualnia wartość domyślną (analogicznie do tworzenia jej w linii 334).

Ostatnie w linii 398 dopisujemy sami:
Kod: Zaznacz cały
$sql = "UPDATE " . USERS_TABLE . "
      SET $column_name = '" . str_replace("\'", "''", $def_value) . "' WHERE $column_name = '$prev_def_value'";
   if ( !$db->sql_query($sql) )
   {
      message_die(GENERAL_ERROR, 'Failed to update users table structure', '', __LINE__, __FILE__, $sql);
   }


Podmieniamy użytkownikom w tabeli USERS_TABLE zapamiętaną wartość domyślną na nową (jeśli w międzyczasie sami zmienili wartość pola profilowego, to ta zmiana ich teraz już nie dotyczy).

Pozostaje już tylko powiązanie z widokiem. W linii 431:
Kod: Zaznacz cały
'L_DEF_VALUE' => $lang['CF_def_value'],

Dodajemy naszą etykietę dla pola. Później pokażę zawartość pliku z tymi napisami w języku polskim.

No i w linii 468:
Kod: Zaznacz cały
'DEF_VALUE' => xhtmlspecialchars($def_value),

Dodajemy naszą wartość do widoku, żeby ją móc zobaczyć na stronie.

templates/Saphic/admin/custom_fields.tpl

W linii 31 dodajemy:
Kod: Zaznacz cały
<tr>
      <td class="row1" width="45%">{L_DEF_VALUE}</td>
      <td class="row2" width="55%"><input type="text" class="post" name="def_value" size="50" maxlength="150" value="{DEF_VALUE}"></td>
   </tr>


Jest to po prostu kolejny rząd w widocznej tabeli. Dodajemy zarówno etykietę L_DEF_VALUE (którą wypełniliśmy wcześniej), jak i wartość DEF_VALUE (również wypełnioną pod koniec admin_custom_fields.php).

language/lang_polish/lang_custom_fields.php

Pozostaje jeszcze dodać w polskiej wersji językowej naszą etykietę skrywającą się pod kluczem CF_def_value w linii 32:
Kod: Zaznacz cały
$lang['CF_def_value'] = 'Warto¶æ domy¶lna';


Plik ten jest kodowany w Western (Windows 1252), stąd wklepujemy różne śmieszne znaczki zamiast polskich znaków.

includes/usercp_register.php

Zauważamy, że to co nas interesuje dzieje się w linii 890:
Kod: Zaznacz cały
$sql = "INSERT INTO " . USERS_TABLE . " (username, user_regdate, user_password, user_email, user_icq, user_website, user_occ, user_interests, user_from, " . $sql_custom_fields . " user_sig, user_sig_bbcode_uid, user_sig_image, user_avatar, user_avatar_type, user_viewemail, user_viewaim, user_aim, user_yim, user_msnm, user_attachsig, user_allowsmile, user_allowhtml, user_allowbbcode, user_allow_viewonline, user_notify, user_notify_gg, user_notify_pm, user_popup_pm, user_timezone, user_lang, user_custom_color, user_custom_rank, user_style, user_gender, allowpm, user_level, user_allow_pm, user_birthday, user_next_birthday_greeting, user_ip, user_ip_login_check, user_active, user_actkey)
            VALUES ('" . str_replace("\'", "''", $username) . "', " . CR_TIME . ", '" . str_replace("\'", "''", $new_password) . "', '" . str_replace("\'", "''", $email) . "', '" . str_replace("\'", "''", $icq) . "', '" . str_replace("\'", "''", $website) . "', '" . str_replace("\'", "''", $occupation) . "', '" . str_replace("\'", "''", $interests) . "', '" . str_replace("\'", "''", $location) . "', " . $sql_custom_values . " '" . str_replace("\'", "''", $signature) . "', '$signature_bbcode_uid', $signature_sql, $avatar_sql, $viewemail, $viewaim, '" . str_replace("\'", "''", str_replace(' ', '+', $aim)) . "', '" . str_replace("\'", "''", $yim) . "', '" . str_replace("\'", "''", $msn) . "', $attachsig, $allowsmilies, $allowhtml, $allowbbcode, $allowviewonline, $notifyreply, $user_notify_gg, $notifypm, $popuppm, $user_timezone, '" . str_replace("\'", "''", $user_lang) . "', '" . str_replace("\'", "''", $custom_color) . "', '" . str_replace("\'", "''", $custom_rank) . "', $user_style, '$gender', $allowpm, 0, 1, '$birthday', '$next_birthday_greeting', '$user_ip', $user_ip_login_check, ";


Jest to zapytanie wstawiającego nowego użytkownika. Niestety domyślnie wszystkie wartości są inicjalizowane przez '', czyli pusty ciąg znaków w liniach 170-176:
Kod: Zaznacz cały
if ( $custom_fields_exists )
   {
      for($i = 0; $i < count($fields_array); $i++)
      {
         $$fields_array[$i] = ($HTTP_POST_VARS[$fields_array[$i]] == 'no_image.gif') ? '' : ( (!is_array($HTTP_POST_VARS[$fields_array[$i]])) ? trim(xhtmlspecialchars($HTTP_POST_VARS[$fields_array[$i]])) : '' );
      }
   }


Widzicie te '' na końcu? To właśnie całe nasze zło. Następnie zauważamy, że faktyczna konstrukcja wartości do zapytania jest w bloku linii 806-819:
Kod: Zaznacz cały
if ( $custom_fields_exists )
         {
            $sql_custom_fields = '';
            $sql_custom_values = '';
            for($i = 0; $i < count($custom_fields[0]); $i++)
            {
               if ( $custom_fields[11][$i] || $mode == 'register' )
               {
                  $split_field = 'user_field_' . $custom_fields[0][$i];
                  $sql_custom_fields .= $split_field . ',';
                  $sql_custom_values .= '\'' . str_replace("\'", "''", $$split_field) . '\', ';
               }
            }
         }


Interesuje nas najbardziej wewnętrzny if. Zamiast przepuszczać wszystkie pola dozwolone do edycji, lub gdy jesteśmy w trybie rejestracji my chcielibyśmy przepuszczać tylko te, które zostały ustawione. Poprawiony blok wygląda tak:

Kod: Zaznacz cały
if ( $custom_fields_exists )
         {
            $sql_custom_fields = '';
            $sql_custom_values = '';
            for($i = 0; $i < count($custom_fields[0]); $i++)
            {
               if ( $custom_fields[11][$i] && !empty($$fields_array[$i]) )
               {
                  $split_field = 'user_field_' . $custom_fields[0][$i];
                  $sql_custom_fields .= $split_field . ',';
                  $sql_custom_values .= '\'' . str_replace("\'", "''", $$split_field) . '\', ';
               }
            }
         }


Jak widać zmienił się tylko ten jeden warunek (dodaliśmy sprawdzanie, czy użytkownik wprowadził daną wartość pola profilowego, czyli nie jest ono puste).

I to już wszystko. Mamy w pełni działające wartości domyślne dla naszych pól profilowych. Mogą je modyfikować zarówno użytkownicy, jak i można zmienić wartość domyślną na nową (co spowoduje uaktualnienie jej dla wszystkich użytkowników, którzy jej ręcznie nie zmienili). Enjoy!

PS. Jakby ktoś się pogubił w wyjaśnieniach to podrzucam gotową paczkę ze zmienionymi plikami: http://www.filedropper.com/profilefieldsdefaultvalue (Dałem nawet komentarze //TU żeby łatwiej odnaleźć interesujące fragmenty)

//EDIT
Z racji, że moja pierwsza wersja nie pozwalała ustawiać pól profilowych przy rejestracji (nieostrożnie usunąłem ważne fragmenty w includes/usercp_register.php) poprawiłem poradnik (de facto wystarczy teraz zmienić linię 812 na zaproponowaną zamiast usuwać bloki kodu). Niestety nie chce mi się wrzucać poprawionej paczki #2lazy.
Avatar użytkownika
Luxter
 
Posty: 15
Dołączył(a): 20 cze 2015, o 10:10
Numer GG: 760737

Postprzez Prawca Kados » 3 wrz 2017, o 21:55

Pomyślałem, że cóż szkodzi spróbować. Moje zapytanie jest następujące. Tworzę forum na forumnotion http://vantharia.forumpolish.com i chociaż grafika nie jest dla mnie ważna to chciałbym nieco dodać kolorytu dla przyszłych graczy. Moje pytanie jest, czy dałoby się zrobić jakiś taki myk przy użyciu css, aby profil każdego gracza wyświetlał się w ramce podobnych do tych, które oferujecie tu: http://visionlighthouse.cba.pl/index.ph ... on-avatars (sam się przyznam, że często korzystam z jednej z nich, bo jest bardzo ładna)

Za ewentualną pomoc serdeczne dzięki.
http://vantharia.cba.pl/index.php -> Forum w budowie.

Fan fantastyki, RPG i dobrej zabawy. Pochłonięty kreacją własnego wyimaginowanego świata :lol:
Avatar użytkownika
Prawca Kados
 
Posty: 2
Dołączył(a): 12 sty 2017, o 14:49

Następna strona

Powrót do Nasza twórczość

cron