Jump to content
Spanner

Tworzenie własnego hooka

Recommended Posts

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

Share this post


Link to post
Share on other sites

Przydatny poradnik! Chętnie nauczę się pisać modyfikacje.

Share this post


Link to post
Share on other sites

Będziesz kontynuował poradnik? Coraz to inne modyfikacje? ;)

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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ń.

Share this post


Link to post
Share on other sites

Jak dodać kod PHP?

 

gdzie ?

 

Jak zrobić wybór grup?

 

gdzie ? w ustawieniach czy w pliku .php ?

 

Jak zrobić enable / disable hooka?

 

j.w.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Ok, ok. Dzięki Ci bardzo.

Edited by TeeZ

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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}
Edited by TeeZ

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Dziękuje Ci,

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

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Similar Content

    • By 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]
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

W celu świadczenie usług przez nasz Serwis na najwyższym poziomie, w ramach Serwisu wykorzystujemy pliki Cookies (tzw. ciasteczka). Korzystając ze stron Serwisu IPSBEYOND.PL bez zmiany ustawień przeglądarki będą one zapisane w pamięci urządzenia. Jeżeli nie dokonacie Państwo zmiany ustawień przeglądarki internetowej to wyrażacie zgodę na zapisywanie plików Cookies.