Skocz do zawartości
  • 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

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


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