Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Integracja z inną bazą danych


Rekomendowane odpowiedzi

Cześć. Mam pytanie. Otóż planuję zrobić integrację forum z inną bazą danych. O co mi dokładniej chodzi? Chodzi mi o to że po stworzeniu konta wykonuje się dane zapytanie do innej bazy danych. Teraz mam pytanie w jakim pliku mogę znaleźć funkcję, która wykonuje się po utworzeniu konta przez użytkownika. Potrzebuję jeszcze funkcję, która tworzy konto użytkownikowi. W IPS 3 była bodajże taka funkcja:

IPSMember::create

 

Z góry dziękuję za odpowiedź.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Lepiej zrobić aplikację i skorzystać z MemberSync: https://invisioncommunity.com/developers/docs/development/extensions/coremembersync-r147/

 When creating a MemberSync extension you need only use the methods that are relevant for your application. Any methods that are not relevant can be deleted. The possible methods are outlined below:

    /**
     * Member account has been created
     *
     * @param    $member    \IPS\Member    New member account
     * @return    void
     */
    public function onCreateAccount( $member )
    {
    
    }
    

 

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

7 godzin temu, DawPi napisał:

Lepiej zrobić aplikację i skorzystać z MemberSync: https://invisioncommunity.com/developers/docs/development/extensions/coremembersync-r147/


 When creating a MemberSync extension you need only use the methods that are relevant for your application. Any methods that are not relevant can be deleted. The possible methods are outlined below:

    /**
     * Member account has been created
     *
     * @param    $member    \IPS\Member    New member account
     * @return    void
     */
    public function onCreateAccount( $member )
    {
    
    }
    

 

 

Dziękuję za odpowiedź. Masz może poradnik w którym jest wytłumaczone jak tworzyć aplikację pod ten silnik?

Odnośnik do komentarza
Udostępnij na innych stronach

@DawPi Napisałem coś takiego. Mógłbyś wskazać co jest nie tak? To jest mój pierwszy plugin i nie wiem gdzie popełniłem błąd.

<?xml version="1.0" encoding="UTF-8"?>

<plugin name="Creating an account in the game" version_long="10000" version_human="1.0.0" author=".WhiteBlue" website="https://og-rpg.eu/" update_check=""><hooks><hook type="C" class="\IPS\Member" filename="createAccountInGame"><![CDATA[//<?php

 

/* To prevent PHP errors (extending class does not exist) revealing path */

if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )

{

  exit;

}

 

class hook20 extends _HOOK_CLASS_

{

 

public function onCreateAccount( $member )

{

  try

  {

   die('sss');

  }

  catch ( \RuntimeException $e )

  {

    if ( method_exists( get_parent_class(), __FUNCTION__ ) )

    {

      return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );

    }

    else

    {

      throw $e;

    }

  }

}

 

}

]]></hook></hooks><tasks/><widgets/><htmlFiles/><cssFiles/><jsFiles/><resourcesFiles/><lang/><versions/></plugin>
Edytowane przez maxerxxl
Odnośnik do komentarza
Udostępnij na innych stronach

@DawPi Błąd:

Fatal error: Uncaught Error: Call to undefined method IPS\Member::loggedIn() in .../forum/system/Log/Log.php:107 Stack trace: #0 .../forum/init.php(659): IPS\_Log::log('Error: Class 'I...', 'uncaught_except...') #1 [internal function]: IPS\IPS::exceptionHandler(Object(Error)) #2 {main} thrown in .../forum/system/Log/Log.php on line 107

 

Kod:

//<?php

namespace IPS;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
    exit;
}

class hook22 extends \IPS\Patterns\ActiveRecord
{
    private $connection;

    public function __construct()
    {
        $this->connection = new PDO('mysql:host=xxx;dbname=xxx;charset=utf8', 'xxx', 'xxx');
    }

    /**
    * Member account has been created
    *
    * @param $member \IPS\Member New member account
    * @return void
    */
    public function onCreateAccount($member)
    {
        $query = $this->connection->prepare('INSERT INTO innaBaza SET id = ?, username = ?, email = ?, password = ?, ip = ?, added = DATE_FORMAT(FROM_UNIXTIME(?), "%Y-%m-%d %H:%i:%s")');

        $query->execute(array(
            $member->member_id,
            $member->name,
            $member->email,
            $member->members_pass_hash,
            $member->ip_address,
            $member->joined
        ));
    }
}
Edytowane przez maxerxxl
Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

I to cały kod jaki napisałeś do tego moda?

Edytowane przez DawPi
co -> to

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

Przy developer mode błąd:

Call to undefined method IPS\Member::loggedIn()

 

Kod:

//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
    exit;
}

namespace IPS;

class hook22 extends \IPS\Patterns\ActiveRecord
{
    private $connection;

    public function __construct()
    {
        $this->connection = new PDO('mysql:host=xxx;dbname=xxxx;charset=utf8', 'xxxx', 'xxxx');
    }

    /**
    * Member account has been created
    *
    * @param $member \IPS\Member New member account
    * @return void
    */

    public function onCreateAccount($member)
    {
        $query = $this->connection->prepare('INSERT INTO og_users SET id = ?, username = ?, email = ?, password = ?, ip = ?, added = DATE_FORMAT(FROM_UNIXTIME(?), "%Y-%m-%d %H:%i:%s")');

        $query->execute(array(
            $member->member_id,
            $member->name,
            $member->email,
            $member->members_pass_hash,
            $member->ip_address,
            $member->joined
        ));
    }
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

W dniu 27.04.2019 o 14:19, DawPi napisał:

Otwórz logi w ACP i wklej pełną treść tego błędu.

 

Bardzo dziękuję Ci za pomoc. To był mój błąd bo zamiast stworzyć aplikację stworzyłem hook. A teraz utworzyłem ją uruchomiłem dodatek Membersync i tam wprowadziłem w odpowiedniej funkcji kod. Problem rozwiązany.

Odnośnik do komentarza
Udostępnij na innych stronach

55 minut temu, maxerxxl napisał:

 

Bardzo dziękuję Ci za pomoc. To był mój błąd bo zamiast stworzyć aplikację stworzyłem hook. A teraz utworzyłem ją uruchomiłem dodatek Membersync i tam wprowadziłem w odpowiedniej funkcji kod. Problem rozwiązany.

 

Jednak mam jeszcze jedno pytanie. Dlaczego wywala mi błąd z tego pliku gdzie mam połączenie do zewnętrznej bazy danych?

<?php
/**
 * @brief		serverSync Task
 * @author		<a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright	(c) Invision Power Services, Inc.
 * @license		https://www.invisioncommunity.com/legal/standards/
 * @package		Invision Community
 * @subpackage	serversync
 * @since		28 Apr 2019
 */

namespace IPS\serversync\tasks;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * serverSync Task
 */
class _serverSync extends \IPS\Task
{
	public $_connection;

	public function _getConnection()
	{
		return $this->_connection;
	}

	/**
	 * Execute
	 *
	 * If ran successfully, should return anything worth logging. Only log something
	 * worth mentioning (don't log "task ran successfully"). Return NULL (actual NULL, not '' or 0) to not log (which will be most cases).
	 * If an error occurs which means the task could not finish running, throw an \IPS\Task\Exception - do not log an error as a normal log.
	 * Tasks should execute within the time of a normal HTTP request.
	 *
	 * @return	mixed	Message to log or NULL
	 * @throws	\IPS\Task\Exception
	 */
	public function execute()
	{
		try {
			$this->_connection = \IPS\Db::i('external', array(
				'sql_host'        => 'xxx',
				'sql_user'        => 'xxxx',
				'sql_pass'        => 'xxx',
				'sql_database'    => 'xxx',
				'sql_port'        => 3306,
				'sql_socket'    => '/var/lib/mysql.sock',
				'sql_utf8mb4'    => true,
			));
		}

		catch( \IPS\Db\Exception $e ){}
	}
	
	/**
	 * Cleanup
	 *
	 * If your task takes longer than 15 minutes to run, this method
	 * will be called before execute(). Use it to clean up anything which
	 * may not have been done
	 *
	 * @return	void
	 */
	public function cleanup()
	{
		
	}
}

 

Błąd

Using $this when not in object context

Odnośnik do komentarza
Udostępnij na innych stronach

Metoda \IPS\Task nie posiada konstruktora, więc nie możesz użyć $this.

 

PS: Nie musisz przypisywać połączenia do zmiennej, jęsli używasz \IPS\Db, ustawiłeś połączenie i identyfikator na 'external', więc w każdym zapytaniu używaj \IPS\Db::i('external'), to jest Twoja 'zmienna' identyfikująca właśnie to połączenie.

  • Dziękuję 1
Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager
11 godzin temu, maxerxxl napisał:

To był mój błąd bo zamiast stworzyć aplikację stworzyłem hook.

 

W dniu 23.04.2019 o 10:05, DawPi napisał:

 

 

 

  • Zmieszany 1

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

12 godzin temu, Da Ruś napisał:

Metoda \IPS\Task nie posiada konstruktora, więc nie możesz użyć $this.

 

PS: Nie musisz przypisywać połączenia do zmiennej, jęsli używasz \IPS\Db, ustawiłeś połączenie i identyfikator na 'external', więc w każdym zapytaniu używaj \IPS\Db::i('external'), to jest Twoja 'zmienna' identyfikująca właśnie to połączenie.

 

Czy podczas wykonywania zapytania muszę dodawać warunek czy istnieje połączenie czy po prostu jeżeli nie połączy się z inną bazą danych to nie wyświetli błędu?


        $connection = \IPS\Db::i('test');

 

        if (isset($connection)) {

            $connection->insert('users', array(

                'id' => $member->member_id,

                'username' => $member->name,

                'email' => $member->email,

                'password' => $member->members_pass_hash,

                'ip' => $member->ip_address,

            ));

        }

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

To ustawienie dajesz na FALSE:

\IPS\Settings::i()->site_online

Resztę popatrz w: applications/core/modules/admin/settings/general.php

  • Dziękuję 1

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.