Skocz do zawartości
  • Zarejestruj się
  • 0
TENAZ

Po napisaniu posta/tematu wyślij cyfre do bazy danych.

Pytanie

Witam,

Mam pytanie, jak zrobić coś takiego, aby po napisaniu posta/tematu wysyłało się zapytanie do nowej tabeli i 'jakąś' cyfrą/liczbą, obojętnie z czym.

Np. mam tabele ptcounter - i w niej chce, aby w kolumnie counter wysyłało zapytanie po napisaniu posta/tematu.

Edytowano przez TENAZ

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

19 odpowiedzi na to pytanie

Polecane posty

  • 0
14 godzin temu, TENAZ napisał:

@Spanner

takie coś?:


		 \IPS\Db::createTable( array(
             'name'            => 'points',    // Table name
       		'columns' => array ( 0 => 'points2' ),
             'comment'        => '',            // (Optional) Table comment
             'engine'        => 'MEMORY',        // (Optional) Engine to use - will default to not specifying one, unless a FULLTEXT index is specified, in which case MyISAM is forced
             'temporary'        => TRUE,            // (Optional) Will sepcify CREATE TEMPORARY TABLE - defaults to FALSE
             'if_not_exists'    => TRUE,            // (Optional) Will sepcify CREATE TABLE name IF NOT EXISTS - defaults to FALSE
         ) );

 

Mniej więcej, tylko jak użyjesz memory table to jak będzie reset serwera to ta tabela straci dane. Jedna kolumna w tabeli to też lipa bo nic te dane nie będą odzwierciedlać ale mogę się mylić.

 

13 godzin temu, TENAZ napisał:

Dobra, mam.

A jeszcze jak z tymi postami zrobić? Bo tematy działają, lecz posty już nie. Dawałem do postów to:


processAfterCreate

Jak i


create

 W przypadku postów tworzysz hook na \IPS\forums\Topic\Post i dodajesz metodę:

public static function create( $item, $comment, $first=FALSE, $guestName=NULL, $incrementPostCount=NULL, $member=NULL, \IPS\DateTime $time=NULL, $ipAddress=NULL, $hiddenStatus=NULL )
{
    $comment = call_user_func_array( 'parent::create', func_get_args() );

zapytanie

    return $coment;
}

 

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Musisz utworzyć hook i stworzyć odpowiednie akcje. np. dla tematu nadpisać \IPS\forums\Topic::processAfterCreate() a dla posta \IPS\forums\Topic\Post::create() to tak dla przykładu oczywiście

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner to wiem, a można dać tak:

if( \IPS\forums\Topic::processAfterCreate() ){
//Zapytanie
}

i tak samo z postami?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

nie. musisz utworzyć hook, który będzie rozszerzał daną klasę  w tym przypadku \IPS\forums\Topic i tam w kodzie dajesz:

protected function processAfterCreate( $comment, $values )
{
    parent::processAfterCreate( $comment, $values );

zapytanie
}

i analogicznie dla postów

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner a masz gdzieś dokumentację jak dodawać tabele oraz kolumny w hooku? Bo jakoś nie mogę znaleźć na ich stronie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

W sensie jak utworzyć czystą tabelę w bazie, czy zmienić istniejącą?

ogólnie w katalogu /plugins/x/dev/setup/install.php masz metodę step1() i tam normalnie dajesz tak jak wszędzie

\IPS\Db::i()->createTable(...);

i tyle.

Możesz sobie zobaczyć w aplikacji core znajdziesz przykład użycia tego dokładniejszy jeśli potrzebujesz

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner chce utworzyć nową tabele, a w niej kilka kolumn. W aplikacji jest chyba lekko inaczej niż w hookach.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

w aplikacji sobie wyklikujesz, tutaj musisz użyć tego co podałem. ale zarówno aplikacja jak i hook korzystają z tego samego ;)

\IPS\Db::i()->createTable( array ( 'name' => 'core_theme_resources', 'columns' => $columns, 'indexes' => array ( 'PRIMARY' => array ( 'type' => 'primary', 'name' => 'PRIMARY', 'length' => array ( 0 => NULL, ), 'columns' => array ( 0 => 'resource_id', ), ), 'resource_set_id' => array ( 'type' => 'key', 'name' => 'resource_set_id', 'length' => array ( 0 => NULL, ), 'columns' => array ( 0 => 'resource_set_id', ), ), 'resource_app' => array ( 'type' => 'key', 'name' => 'resource_app', 'length' => array ( 0 => NULL, ), 'columns' => array ( 0 => 'resource_app', ), ), ), 'collation' => 'utf8mb4_unicode_ci', 'engine' => 'InnoDB', ) );
		

 

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner

takie coś?:

		 \IPS\Db::createTable( array(
             'name'            => 'points',    // Table name
       		'columns' => array ( 0 => 'points2' ),
             'comment'        => '',            // (Optional) Table comment
             'engine'        => 'MEMORY',        // (Optional) Engine to use - will default to not specifying one, unless a FULLTEXT index is specified, in which case MyISAM is forced
             'temporary'        => TRUE,            // (Optional) Will sepcify CREATE TEMPORARY TABLE - defaults to FALSE
             'if_not_exists'    => TRUE,            // (Optional) Will sepcify CREATE TABLE name IF NOT EXISTS - defaults to FALSE
         ) );

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Dobra, mam.

A jeszcze jak z tymi postami zrobić? Bo tematy działają, lecz posty już nie. Dawałem do postów to:

processAfterCreate

Jak i

create

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner po dodaniu postów i tematów to podczas dodawania tematu jest błąd:

Call to a member function attachmentIds() on null

 call_user_func_array( array( 'IPS\File', 'claimAttachments' ), array_merge( array( 'newContentItem-' . static::$application . '/' . static::$module  . '-' . ( $container ? $container->_id : 0 ) ), $comment->attachmentIds() ) );

ale jak są same tematy to działa wszystko i tak samo jest z postami, jak są same to działają, a jak się doda tematy to już nie.

Edytowano przez TENAZ

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0
7 minut temu, TENAZ napisał:

@Spanner po dodaniu postów i tematów to podczas dodawania tematu jest błąd:

Call to a member function attachmentIds() on null


 call_user_func_array( array( 'IPS\File', 'claimAttachments' ), array_merge( array( 'newContentItem-' . static::$application . '/' . static::$module  . '-' . ( $container ? $container->_id : 0 ) ), $comment->attachmentIds() ) );

ale jak są same tematy to działa wszystko i tak samo jest z postami, jak są same to działają, a jak się doda tematy to już nie.

Ale błąd wali z czego z klasy Topic czy Topic\Post?

Najlepiej debuguj kod i w jednym i drugim, może coś gdzieś źle napisałeś i dlatego?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner sprawdzałem wszystko 6 razy i robiłem wszystko od nowa i dalej to samo. Gdy dodaje temat, więc to chyba przez Topics, aczkolwiek nie wiem, bo jak jest samo Topics to działa i tak samo jak jest sam Topic\Post to też działa.

        /* Create the comment */
        $comment = NULL;
        if ( isset( static::$commentClass ) and static::$firstCommentRequired )
        {
            $commentClass = static::$commentClass;
            
            $comment = $commentClass::create( $obj, $values[ static::$formLangPrefix . 'content' ], TRUE, ( !$member->real_name ) ? NULL : $member->real_name, $obj->hidden() ? FALSE : NULL, $member );
            
            $idColumn = static::$databaseColumnId;
            $commentIdColumn = $commentClass::$databaseColumnId;
            call_user_func_array( array( 'IPS\File', 'claimAttachments' ), array_merge( array( 'newContentItem-' . static::$application . '/' . static::$module  . '-' . ( $container ? $container->_id : 0 ) ), $comment->attachmentIds() ) );
            
            if ( isset( static::$databaseColumnMap['first_comment_id'] ) )
            {
                $firstCommentIdColumn = static::$databaseColumnMap['first_comment_id'];
                $obj->$firstCommentIdColumn = $comment->$commentIdColumn;
                $obj->save();
            }
        }

 

W Topics:
rotected function processAfterCreate( $comment, $values )
{
	try
	{
	    parent::processAfterCreate( $comment, $values );
	
		\IPS\Db::i()->insert( 'test', array('pointscounter' => 5, 'member_id' => $comment->author()->member_id ) );
	}
	catch ( \RuntimeException $e )
	{
		if ( method_exists( get_parent_class(), __FUNCTION__ ) )
		{
			return call_user_func_array( 'parent::' . __FUNCTION__, func_get_args() );
		}
		else
		{
			throw $e;
		}
	}
}


W Topics/Post:

public static function create( $item, $comment, $first=FALSE, $guestName=NULL, $incrementPostCount=NULL, $member=NULL, \IPS\DateTime $time=NULL, $ipAddress=NULL, $hiddenStatus=NULL )
{
    $comment = call_user_func_array( 'parent::create', func_get_args() );

	\IPS\Db::i()->insert( 'test', array('pointscounter' => 2, 'member_id' => $comment->author()->member_id ) );

    return $coment;
}

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

To jeszcze możesz spróbować zamienić to:

$comment = call_user_func_array( 'parent::create', func_get_args() );

na

$comment = parent::create( $item, $comment, $first, $guestName, $incrementPostCount, $member, $time, $ipAddress, $hiddenStatus );

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner nadal to samo, na PW wyślę Ci wtyczkę, może faktycznie coś źle robię.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Ok mam. Czeski błąd :D

public static function create( $item, $comment, $first=FALSE, $guestName=NULL, $incrementPostCount=NULL, $member=NULL, \IPS\DateTime $time=NULL, $ipAddress=NULL, $hiddenStatus=NULL )
{
    $comment = call_user_func_array( 'parent::create', func_get_args() );

	\IPS\Db::i()->insert( 'test', array('pointscounter' => 2, 'member_id' => $comment->author()->member_id ) );

    return $coment;
}

zauważ. na początku masz $comment a zwracasz $coment czyli brakuje jednego m :) ale że w trybie dev nie dostałeś błędu? Zbudowałem sobie z tego pluginu plugin dev i od razu dostałem błąd zmiennej

  • Like 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

@Spanner a i jeszcze mam pytanie, co zrobić, aby plik .phtml wgrał się do wtyczki (widget)?

Gdy mam włączony tryb dev. to wszystko fajnie chodzi z pliku .phtml, chcę pobrać wtyczkę, aby już w niej był ten kod .phtml, lecz nie ma go. Gdy wyłączę tryb dev. to jest błąd: [[Template core/front/widgets/pointswidget2 does not exist. This theme may be out of date. Run the support tool in the AdminCP to restore the default theme.]

Plik .phtml jest w core/dev/html/front/widgets/ jak i w tej wtyczke /dev/html/front/widgets

Nie da się automatycznie wgrać pliku do .xml, a zawsze mi się to robiło. O co chodzi?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Nie. piki szablonów musisz umieścić w /plugins/x/dev/html/yyy.phtml i tyle. żadnej struktury tam już nie robisz

a w widgecie używasz:

$this->template( array( \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' ), $this->key ) );

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

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