Jump to content

Hosting dHosting.pl - 10% rabat!

Sign in to follow this  
maxerxxl

Integracja z inną bazą danych

Recommended Posts

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

Share this post


Link to post
Share on other sites

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.

Share this post


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

Share this post


Link to post
Share on other sites
Posted (edited)

@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>
Edited by maxerxxl

Share this post


Link to post
Share on other sites

Coś nie działa?


intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


Link to post
Share on other sites
Posted (edited)

@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
        ));
    }
}
Edited by maxerxxl

Share this post


Link to post
Share on other sites
Posted (edited)

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

Edited by DawPi
co -> to

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


Link to post
Share on other sites
1 minutę temu, DawPi napisał:

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

 

Nie rozumiem

Share this post


Link to post
Share on other sites

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
        ));
    }
}

 

Share this post


Link to post
Share on other sites
W dniu 25.04.2019 o 23:24, maxerxxl napisał:

 

Nie rozumiem

Edytowałem.


intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


Link to post
Share on other sites
35 minut temu, DawPi napisał:

Edytowałem.

 

Zdaje mi się że tak.

Share this post


Link to post
Share on other sites

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


intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


Link to post
Share on other sites

Dlaczego nie wykorzystasz metody:

\IPS\Db::i('xx')->query

?

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites

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.

  • Thanks 1

Share this post


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

 

 

 

  • Confused 1

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


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

            ));

        }

Share this post


Link to post
Share on other sites

Takie sprawy po prostu najlepiej testować i sprawdzać na bieżąco.


intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


Link to post
Share on other sites

Jeszcze mam ostatnie pytanie. Jak jest zdefiniowane połączenie z zewnętrzną bazą danych jeżeli ustawię połączenie w kategorii Logowanie i rejestracja kont?

 

\IPS\Db::i('external_database')

Share this post


Link to post
Share on other sites

Ok dzięki za pomoc. A wiesz może w jaki sposób mogę wyłączyć stronę przez plik php? Bo chciałbym zrobić że jak zewnętrza baza danych nie będzie odpowiadać to forum ma być niedostępne.

Share this post


Link to post
Share on other sites

To ustawienie dajesz na FALSE:

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

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

  • Thanks 1

intermedia - profesjonalne rozwiązania Invision Power Board

---

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

Share this post


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

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.