Skocz do zawartości
Spanner

Tworzenie własnego hooka

Polecane posty

Niniejszy artykuł będzie poświęcony pisaniu własnych hooków. Jeśli szukasz zaawansowanych porad dotyczących tworzenia hooków to niestety się rozczarujesz. Przedstawię tutaj podstawowe informacje na temat tworzenia hooków tak aby początkujący użytkownicy znaleźli proste how to pisania własnych dodatków.

Nie pozostaje mi nic innego jak zaprosić Cię do dalszej lektury.

[ghide]

Na samym początku przechodzi my w tryb developerski w tym celu należy edytować plik conf_global.php i zmienić linię:

define('IN_DEV', 0);
na
define('IN_DEV', 1);
Następnie wchodzimy do panelu administratora do zakładki zarządzanie hookami. Klikamy przycisk Utwórz nowy hook i wypełniamy pola: Zakładka Informacje o Hook'u Tytuł Hook'a: Nazwa hooka widoczna w ACP Opis Hook'a: Opis hooka widoczny w ACP Klucz Hook'a: Klucz po jakim hook będzie rozpoznawany w systemie Wersja Hook'a (czytelna dla człowieka): Wersja hooka w postaci np. 1.0.0 Wersja Hook'a (long-version): Wersja hooka w postaci np. 1000 Autor Hook'a: chyba jasne Adres e-mail autora: tutaj też jasne Strona WWW: tutaj także jasne InformacjeOHooku.jpg Następnie przechodzimy do zakładki Pliki hook’a i klikamy na przycisk dodaj kolejny plik. Ponieważ nasz hook będzie wyświetlany tylko na stronie głównej w sdebarze to wypełniamy pola w następujący sposób: Nazwa pliku w katalogu hook'a: mojPierwszyHook.php Nazwa klasy pliku: mojPierwszyHook Typ pliku hook'a: Hook szablonu Grupa skinu dla hook'u: skin_boards Funkcja skina dla hook'a: boardIndexTemplate Rodzaj szablonu hook'a: pętla foreach 'ID' hooka: side_blocks Lokalizacja Hook'a: (na zewnątrz.pre) Przed rozpoczęciem pętli foreach PlikiHooka.jpg Zapisujemy hook. Teraz przechodzimy do ustawień systemowych i klikamy dodaj nową grupę ustawień i wypełniamy formularz: Tytuł grupy ustawień?: Tutaj wpisujemy nazwę grupy ustawień dla naszego hooka Zakładka grupy ustawień: W jakiej zakładce ma się wyświetlać grupa ustawień Opis grupy ustawień?: Opis grupy ustawień Słowa kluczowe grupy ustawień: Tutaj podajemy klucz po jakim będą pobierane ustawienia Ustawienia.jpg Zapisujemy ustawienia. Następnie przechodzimy do szczegółów nowo dodanej grupy. Zobaczymy coś takiego. szczegolyUstawien.jpg Klikamy na dodaj nowe ustawienia i wypełniamy formularz: Tytuł ustawienia?: Tytuł pod jakim będą widoczne nasze ustawienia Opis ustawienia?: Opis ustawienia Typ ustawienia?: tutaj możemy wybrać jakiego typu ma być dane ustawienie. W naszym przypadku damy Pełny edytor Klucz ustawienia?: Tutaj podajemy pod jakim kluczem będzie dostępne nasze ustawienie w $this->settings dodawanieUstawien.jpg Zapisujemy ustawienia. Teraz możemy uzupełnić nasz edytor o pożądaną treść. ustawieniaZapis.jpg Teraz przechodzimy do zakładki Skiny & Języki -> Look & feel -> Zarządzanie skinami -> dany skin -> klikamy na Dodaj nowy bit Nazwa bitu szablonu: Pod tą nazwą będzie widoczny szablon Dodaj do grupy: Tutaj wybieramy w jakiej grupie szablon ma się znajdować. W naszym przypadku wybierzemy skin_boards Zmienne: To pole służy do definiowania zmiennych, jakie będą przekazywane do szablonu. Wpisujemy tutaj $title i zapisujemy formularz addSkin.jpg Ponieważ pokażę na 2 sposoby jak wyświetlić treść, którą podaliśmy w edytorze w ustawieniach to wklejamy poniższy kod:
<div class='ipsSideBlock clearfix'>
<h3>{$this->lang->words['db32_my_first_hook_title']}</h3>
<div class='_sbcollapsable'>
{$this->settings[ 'db32_my_first_hook_editor' ]}
<br />
Ze zmiennej: {$title}
</div>
</div>[/code] Zapisujemy zmiany. Teraz udajemy się do zarządzania językami -> wybieramy dany język i klikamy w dodaj zasób językowy [b]Nazwa paczki:[/b] Tutaj podajemy w jakiej paczce mają się znajdować zasoby, w naszym przypadku public_boards [b]Klucz:[/b] Tutaj podajemy nazwę zasobu, którą użyliśmy w szablonie db32_my_first_hook_title [b]Domyślny tekst:[/b] Tutaj umieszczamy tekst, na który zostanie zamieniony zasób zasobJezykowy.jpg Teraz przechodzimy do zasadniczej części, czyli napiszemy kod odpowiedzialny za wyświetlenie naszego hooka. W katalogu /hooks tworzymy nowy plik: mojPierwszyHook.php a w nim tworzymy klasę mojPierwszyHook oraz metody tej klasy getOutput() oraz __construct(). Poniżej zamieszczony jest kod pliku:
[code]<?php
/**
* SolutionDEVs Application
* (DB32) Mój pierwszy Hook
*
* @author Spanner
* @copyright (c) 2005 - 2012 SolutionDEVs
* @package SolutionDEVs Apps
* @subpackage PHP
* @link http://www.solutiondevs.pl
* @link http://www.ipsbeyond.pl
* @version 1.0.0
*
*/

class mojPierwszyHook
{
private $registry;
private $DB;
private $memberData;
private $settings;

public function __construct()
{
$this->registry = ipsRegistry::instance();
$this->DB = $this->registry->DB();
$this->memberData =& $this->registry->member()->fetchMemberData();
$this->settings =& $this->registry->fetchSettings();
}

public function getOutput()
{
/**
* Ładujemy zasoby językowe
*/
$this->registry->class_localization->loadLanguageFile( array( 'public_boards' ), 'core' );

/**
* Zamieniamy BBCody na kod HTML
*/
IPSText::getTextClass( 'bbcode' )->parse_html = 0;
IPSText::getTextClass( 'bbcode' )->parse_bbcode = 1;
IPSText::getTextClass( 'bbcode' )->parse_smilies = 1;
IPSText::getTextClass( 'bbcode' )->parsing_section = 'db32_my_first_hook_editor';

$this->settings[ 'db32_my_first_hook_editor' ] = IPSText::getTextClass( 'bbcode' )->preDisplayParse( $this->settings[ 'db32_my_first_hook_editor' ] );

/**
* Wyświetlamy zawartość hooka
*/
return $this->registry->getClass( 'output' )->getTemplate( 'boards' )->mojPierwszyHook( $this->settings[ 'db32_my_first_hook_editor' ] );
}
}
?>
Ogólnie nie ma tutaj nic skomplikowanego na początku ładujemy plik z zasobami językowymi, następnie zamieniamy tekst z edytora zawierający BBCody na tagi HTML a następnie przekazujemy tą zmienną do szablonu oraz zwracamy sam szablon. Zapisujemy plik. Teraz wyłączamy tryb developerski. W pliku conf_global.php
define('IN_DEV', 1);
na
define('IN_DEV', 0);

Jeśli pojawił się tekst jak na screenie.

stronaGlowna.jpg

To teraz pokażę jak wyeksportować taki hook. Włączamy tryb developerski. Logujemy się do ACP i przechodzimy do zarządzania hookami. Z menu rozwijanego wybieramy eksportuj hooka.

exportHooka.jpg

Pojawi nam się strona w której musimy pozaznaczać parę opcji. W sekcji

Eksportuj ustawienia, dodajemy nową pozycję a w niej odnajdujemy nasze ustawienia i je dodajemy.

W sekcji eksportuj język postępujemy podobnie. Wybieramy z menu rozwijanego core_public_boards i w drugim oknie odnajdujemy i dodajemy dodany zasób.

W sekcji eksportuj skiny postępujemy podobnie wybieramy z listy rozwijanej skin_boards a w drugim oknie odnajdujemy nasz bit szablonu, który dodawaliśmy.

exportHook.jpg

Klikamy na Eksportuj i zapisujemy plik na dysku. I tak oto stworzyliśmy nasz pierwszy hook.

Plik z hookiem, który utworzyliśmy w tym artykule dołączony jest do tego tematu i możecie go pobrać oraz zmodyfikować według własnych potrzeb i uznania.[/ghide]

Zakaz rozpowszechniania bez zgody i wiedzy autora

(DB32) Mój pierwszy Hook.zip

  • Like 3

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Cieszę się, co prawda opis jest dość prosty ale od czegoś trzeba zacząć :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zależy co masz na myśli przez kontynuację tego poradnika. Jeśli masz jakieś propozycje dodatkowe uwagi to napisz najlepiej o nich w tym temacie:

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Świetny poradnik, kawał dobrej pracy wykonany. Najlepsze forum to i super poradniki.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

rozumiem, ze jesli teraz wlacze tryb developerski to moge w ten sposob wyexportowac kazdy hook, np gdy nie mam kopii a chcialbym sobie ja zrobic ?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

A jak wyświetlić np. treść tego hook'a w nowym pliku *.php? Jest taka możliwość w ogóle?

Tak aby był główny header etc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tzn? możesz napisać jaśniej bo zupełnie nie rozumiem co masz na myśli

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mały odkop.

 

Jak dodać kod PHP?

Jak zrobić wybór grup?

Jak zrobić enable / disable hooka?

 

Te 2 ostatnie podglądałem w innych hookach, ale nie mogę edytować tych ustawień.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jak dodać kod PHP?

 

gdzie ?

 

Jak zrobić wybór grup?

 

gdzie ? w ustawieniach czy w pliku .php ?

 

Jak zrobić enable / disable hooka?

 

j.w.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

gdzie ?

 

 

gdzie ? w ustawieniach czy w pliku .php ?

 

 

j.w.

 

 

Np. Chcę aby w sidebarze pobieral dane z innej bazy, której dane wpisywałoby się w ustawieniach hooka.

Ustawieniach hooka, ustawiać czy jest włączony, czy wyłączony.

Grupy to samo, która grupa moze widzieć hooka w sidebarze.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

jak zrobic hook on/off

 

w pliku .php w getOutput musisz umiescic takie cos :

 

if( ! $this->settings['ps34_tops_enable'] )
		{
			return false;
		}

gdzie 'ps34_tops_enable' jest wyciagniety z ustawien Setting Key

 

podglad w foto:

 

post-817-0-85227000-1364137667_thumb.png

 

 

 

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

natomiast z widocznoscia dla grup jet bardzo podobnie choc troche sie rozni

 

plik .php w getOutput musi miec :

 

if
		(
			$this->settings['Setting_key'] &&
			in_array( $this->memberData['member_group_id'], explode( ",", $this->settings['Setting_key'] ) )
		)

 

w ustawieniach w Setting Extra musisz dac:

 

#show_groups#

a w Raw PHP code to eval before showing and saving? :

 

$key = 'Setting_key';

if ( $save == 1)
{
    if ( is_array($_POST[ $key ]) )
    {
        $_POST[ $key ] = implode(",",$_POST[ $key ]);
    }
    else
    {
        $_POST[ $key ] = "";
    }
}
if ( $show == 1 )
{
    $key .= '[]';
}

 

Pamietaj aby Setting_key wszedzie zamienic na taki jaki podajesz w ustawieniach. Patrz przyklad w poscie powyzej.

 

ja to wlasnie na takiej zasadzie robie w hookach.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, ok. Dzięki Ci bardzo.

Edytowano przez TeeZ

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, mam kolejne ( ostatnie już ) pytanie.

$z = "SELECT * from amx_bans order by bid DESC limit $limit";
        $o = mysql_query($z);
        $sum = mysql_num_rows($o);
        if ($sum > 0)
        {
            while($row = mysql_fetch_array($o))
            {
                $nick = $row['player_name'];
                $czas = $row['ban_length'];
                $serwer = $row['server_name'];
                $admin = $row['admin_nick'];
            }
        }
        else
        {
            return "Brak banów w bazie";
        }
        
		return $this->registry->getClass( 'output' )->getTemplate( 'teez_apps' )->TZ34tabela($nick, $czas, $serwer, $admin);

 

 

I po próbie odczytania tego w szablonie poprzez

 

 <div class='ipsBox_container ipsPad'>   
	<div class='content_border'><table class='ipb_table' summary="{$this->settings['tz34_tabela_serwerow_top_tytul']}">
		<tr class='header'>
  <th scope='col' width="15%"><center>Nazwa Serwera</center></th>
  <th scope='col' width="10%"><center>IP</center></th>
  <th scope='col' width="6%"><center>Mapa</center></th>
</tr>
	         <tr>
            <td><center>{$nick}</center></td>
            <td><center>{$admin}</center></td>
                  </tr>
</table>
</div></div>

Jest pusto. I tutaj mam pytanie - w jaki sposób mam tutaj zastosować while?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

+ Czy musze jakoś zamykać wcześniejsze połączenie, aby rozpocząć kolejne? Te dane pobieram z innej bazy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ehh.. Nie można edytować wcześniejszych postów..

 

Zmieniłem na :

 

 /////////////////////////////////KOD ITD
        $z = "SELECT * from amx_bans order by bid DESC limit $limit";
        $o = mysql_query($z);
        $sum = mysql_num_rows($o);
        if ($sum > 0)
        {
            while($row = mysql_fetch_array($o))
            {
                $nick = $row['player_name'];
                $czas = $row['ban_length'];
                $serwer = $row['server_name'];
                $admin = $row['admin_nick'];
                $data[] = array
                    (
			             "nick" => $row['player_name'],
			             "czas" => $czas,
                         "serwer" => $serwer,
                         "admin" => $admin,
                    );
            }
        }
        else
        {
            return "Brak banów w bazie";
        }
        
		return $this->registry->getClass( 'output' )->getTemplate( 'teez_apps' )->TZ34tabela($data);
	}	
}
?>

 

I próbuję :

 

 <div class='ipsBox_container ipsPad'>   
	<div class='content_border'><table class='ipb_table' summary="{$this->settings['tz34_tabela_serwerow_top_tytul']}">
		<tr class='header'>
  <th scope='col' width="15%"><center>Nazwa Serwera</center></th>
  <th scope='col' width="10%"><center>IP</center></th>
  <th scope='col' width="6%"><center>Mapa</center></th>
</tr>
	         <tr>
		<foreach loop="bany:$data as $cs">
            <td><center>{$cs['nick']}</center></td>
            <td><center>{$cs['admin']}</center></td>
</foreach>
                  </tr>
</table>
</div></div>

I blada dupa Koseckiego.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

wprowadziles zmienne do bitu ?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

teraz tak. :p

 

Ok, jest progres. Teraz jak mam zrobić tam while ? W bicie, bo zmieniłem teraz na normalne:

 

  if ($sum > 0)
        {
            while($row = mysql_fetch_array($o))
            {
                $nick = $row['player_name'];
                $czas = $row['ban_length'];
                $serwer = $row['server_name'];
                $admin = $row['admin_nick'];

            }
        }
        else
        {
            return "Brak banów w bazie";
        }
        return $this->registry->getClass( 'output' )->getTemplate( 'test3' )->test3($admin, $czas, $serwer, $nick);
    }    
}
 
{$admin}
{$nick}
{$czas}
{$serwer}
Edytowano przez TeeZ

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ogarnąłem. Wróciłem do tablic, a później w zmiennych dałem samo $data. Dzięki Duke!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tego mi było trzeba. Dzięki wielkie :P Teraz już wiem, o co w tych rozszerzeniach chodzi. Jeszcze raz dzięki :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziękuje Ci,

dzięki Tobie napisałem swój pierwszy hook w życiu.

Nawet nie wiedziałem, że to jest takie proste. :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość
Temat jest zablokowany i nie można w nim pisać.

  • Podobna zawartość

    • Przez Spanner
      W niniejszym artykule chciałbym kontynuować dalej opis tworzenia własnych hooków. Teraz zajmiemy się hookiem przeładowującym funkcjonalność skinów. Mówiąc prościej, dzięki takim hookom, możemy zmienić zupełnie wygląd np. postów dla wybranych grup. Artykuł ten będzie opisywać jak dodać własną wiadomość błędu pod każdym postem.

      Proces tworzenia hooków jest taki sam jak w artykule Tworzenie własnego hooka dlatego pominę tutaj sam proces dodawania hooka w ACP.

      [ghide]
      Jedyną różnicą podczas dodawania hooka w ACP jest ostatnia zakładka Pliki hook’a. Z menu rozwijanego wybieramy przeładowanie skina a w inpucie, który się pojawi wpisujemy skin_topic.



      Przejdźmy teraz stworzenia pliku. Tworzymy nowy plik wiadomoscWPoscie.php w katalogu hooks i wklejamy taką zawartość:


      /**
      * SolutionrDEVs Application
      * wiadomoscWPoscie
      *
      * @author Dawid Baruch <dawid.baruch@solutiondevs.pl>
      * @copyright (c) 2005 - 2012 SolutionDEVs
      * @package SolutionDEVs Apps
      * @subpackage PHP
      * @link http://www.solutiondevs.pl
      * @version 1.0.0
      *
      */



      class wiadomoscWPoscie extends skin_topic(~id~)
      {
      function __construct( ipsRegistry $registry )
      {
      parent::__construct( $registry );

      IPSText::getTextClass( 'bbcode' )->parse_html = 0;
      IPSText::getTextClass( 'bbcode' )->parse_bbcode = 1;
      IPSText::getTextClass( 'bbcode' )->parse_smilies = 1;
      IPSText::getTextClass( 'bbcode' )->parsing_section = 'sd32_post_message';

      $this->settings[ 'sd32_post_message' ] = IPSText::getTextClass( 'bbcode' )->preDisplayParse( $this->settings[ 'sd32_post_message' ] );
      }

      function post($post, $displayData, $topic, $forum=array())
      {

      $post['post']['post'] .= "
      <p class="\&quot;message" error="" rounded\"="">{$this->settings[ 'sd32_post_message' ]}</p>";

      return parent::post( $post, $displayData, $topic, $forum );
      }
      }
      [/CODE]

      Zasada tworzenia jest dość prosta podajemy nazwę naszej klasy zgodnie z tym co podaliśmy w ACP i po słowie extends podajemy nazwę szablonu jaki chcemy przeładować czyli skin_topic a po nim dajemy magiczne (~id~) co poinformuje IP.Board, że dla każdego skina będzie następować przeładowanie.

      Metoda __construct() nie jest niezbędna, ale ponieważ przeładowujemy metodę post(), która jest za każdym razem wywoływana w pętli to w celach optymalizacyjnych lepiej jest zrobić parsowanie BBCodów z naszej wiadomości na początku wywoływania skryptu a nie za każdym razem w pętli.

      Metoda post() na początku dodaje na końcu każdego posta wiadomość typu error z naszą wiadomością. Następnie wywoływana jest właściwa metoda post(), która ubierze w całą htmlową okładkę dane. Jeśli nie wywołalibyśmy parent::post wtedy post wyglądałby tak, jak zaprojektowaliśmy to w naszej metodzie post().
      [/ghide]

      [b][color=red]Zakaz rozpowszechniania bez zgody i wiedzy autora[/color][/b]
  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×

Ważne informacje

Kontynuując przeglądanie strony, wyrażasz zgodę na używanie przez nas plików cookies.