Jump to content
  • 0
TENAZ

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

Question

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.

Edited by TENAZ

Share this post


Link to post
Share on other sites

19 answers to this question

Recommended Posts

  • 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

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 0

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

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

i tak samo z postami?

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 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
         ) );

 

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 0

Dzięki wielkie! :)

Share this post


Link to post
Share on other sites
  • 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.

Edited by TENAZ

Share this post


Link to post
Share on other sites
  • 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?

Share this post


Link to post
Share on other sites
  • 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;
}

 

Share this post


Link to post
Share on other sites
  • 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 );

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 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?

Share this post


Link to post
Share on other sites
  • 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 ) );

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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