Jump to content
Lafko

Выполнение php после покупки продукта

Recommended Posts

Добрый день.
Подскажите как мне сделать так чтобы IPS после покупки определенного продукта выполнил php скрипт?
Или как сделать так чтобы после покупки IPS внёс лицензионный ключ в другую таблицу? По умолчанию он вносит ключ в таблицу _nexus_licensekeys

Screenshot_2.thumb.png.851e211605dc2082f6edacab69ae236a.png

Share this post


Link to post
Share on other sites

Или помогите написать скрипт для внесения данных в другую БД вот в этот метод

 

	public function save()
	{
		if ( !$this->key )
		{
			do
			{
				$this->key = $this->generate();
			}
			while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );
		}
		return parent::save();
	}

 

Share this post


Link to post
Share on other sites

В какую таблицу нужно внести данные? Создать новую запись в таблице или обновить существующую?

Share this post


Link to post
Share on other sites

Если нужно добавить новую запись в определённую таблицу, то добавьте это после условия:

if ( !\IPS\Db::i()->select( 'COUNT(*)', 'your_table', array( 'license_key=?', $this->key ) )->first() )
{
	\IPS\Db::i()->insert( 'your_table', array(
		'license_key' => $this->key
	) );
}

Замените your_table на название своей таблицы, а license_key на название колонки с ключами. Так же добавьте другие данные (помимо license_key) в insert.

Share this post


Link to post
Share on other sites

А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы.

wanted, достаточно будет в конце условия добавить 

\IPS\Db::i()->insert( 'your_table', array(
		'license_key' => $this->key
	) );

Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table

Share this post


Link to post
Share on other sites
1 час назад, siv1987 сказал:

А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы.

wanted, достаточно будет в конце условия добавить 

\IPS\Db::i()->insert( 'your_table', array(
		'license_key' => $this->key
	) );

Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table

Совершенно верно, мне надо скопировать ключ в другую БД

1 час назад, siv1987 сказал:

А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы.

wanted, достаточно будет в конце условия добавить 

\IPS\Db::i()->insert( 'your_table', array(
		'license_key' => $this->key
	) );

Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table

Очень напрягает что на этом форуме нельзя редактировать свой текст.
Дело в том что в том php я не могу почему то создать новое подключение
использую

$mysqli_key = new mysqli("****", "****", "****", "****");

 

1 час назад, siv1987 сказал:

А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы.

wanted, достаточно будет в конце условия добавить 

\IPS\Db::i()->insert( 'your_table', array(
		'license_key' => $this->key
	) );

Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table

Может быть ты в курсе где искать "использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table"

Share this post


Link to post
Share on other sites

mysql пользователь который использует форум имеет доступ к этой базе данных? Если да, то запрос можно выполнить от текущего подключения.
Если нет то http://ipbskins.ru/forum/topic15779.html#entry105651
 

/* create external connect */
\IPS\Db::i(
    'remote_database_name', 
    array(
        'sql_host'      => 'host',
        'sql_user'      => 'user',
        'sql_pass'      => 'pass',
        'sql_database'      => 'database',
    ) 
);

\IPS\Db::i('remote_database_name')->insert('you_table', array('license_key' => $this->key));

 

Share this post


Link to post
Share on other sites
2 минуты назад, siv1987 сказал:

mysql пользователь который использует форум имеет доступ к этой базе данных? Если да, то запрос можно выполнить от текущего подключения.
Если нет то http://ipbskins.ru/forum/topic15779.html#entry105651
 

/* create external connect */
\IPS\Db::i(
    'remote_database_name', 
    array(
        'sql_host'      => 'host',
        'sql_user'      => 'user',
        'sql_pass'      => 'pass',
        'sql_database'      => 'database',
    ) 
);

\IPS\Db::i('remote_database_name')->insert('you_table', array('license_key' => $this->key));

 

Не совсем понял вопрос про пользователя который имеет доступ но я думаю что нет? Мне надо создать новое подключение.
А куда код вставлять?
Вот весь код файла LicenseKey.php если я всё плавильно понял в конце функция save() отвечает за кол-во ключей которое купили
 

<?php
/**
 * @brief		License Key Model
 * @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	Nexus
 * @since		30 Apr 2014
 */

namespace IPS\nexus\Purchase;

/* 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;
}

/**
 * License Key Model
 */
abstract class _LicenseKey extends \IPS\Patterns\ActiveRecord
{
	/**
	 * License Key Types
	 *
	 * @return	array
	 */
	public static function licenseKeyTypes()
	{
		return array(
			'Standard'	=> 'IPS\nexus\Purchase\LicenseKey\Standard',
			'Mdfive'	=> 'IPS\nexus\Purchase\LicenseKey\Mdfive',
		);
	}
		
	/**
	 * @brief	Multiton Store
	 */
	protected static $multitons;

	/**
	 * @brief	Database Table
	 */
	public static $databaseTable = 'nexus_licensekeys';
	
	/**
	 * @brief	Database Prefix
	 */
	public static $databasePrefix = 'lkey_';
	
	/**
	 * @brief	[ActiveRecord] Database ID Column
	 */
	public static $databaseColumnId = 'key';
	
	/**
	 * @brief	[ActiveRecord] Database ID Fields
	 */
	protected static $databaseIdFields = array( 'lkey_purchase' );
	
	/**
	 * @brief	[ActiveRecord] Multiton Map
	 */
	protected static $multitonMap	= array();
	
	/**
	 * Construct ActiveRecord from database row
	 *
	 * @param	array	$data							Row from database table
	 * @param	bool	$updateMultitonStoreIfExists	Replace current object in multiton store if it already exists there?
	 * @return	static
	 */
	public static function constructFromData( $data, $updateMultitonStoreIfExists = TRUE )
	{
		$classname = 'IPS\nexus\Purchase\LicenseKey\\' . mb_ucfirst( $data['lkey_type'] );

		/* Initiate an object */
		$obj = new $classname;
		$obj->_new = FALSE;
		
		/* Import data */
		foreach ( $data as $k => $v )
		{
			if( static::$databasePrefix AND mb_strpos( $k, static::$databasePrefix ) === 0 )
			{
				$k = \substr( $k, \strlen( static::$databasePrefix ) );
			}

			$obj->_data[ $k ] = $v;
		}
		$obj->changed = array();
		
		/* Init */
		if ( method_exists( $obj, 'init' ) )
		{
			$obj->init();
		}
				
		/* Return */
		return $obj;
	}
	
	/**
	 * Set Default Values
	 *
	 * @return	void
	 */
	public function setDefaultValues()
	{
		$exploded = explode( '\\', \get_class( $this ) );
		$this->type = mb_strtolower( array_pop( $exploded ) );
		$this->active = TRUE;
		$this->uses = 0;
		$this->activate_data = array();
		$this->generated = new \IPS\DateTime;
	}
	
	/**
	 * Set purchase
	 *
	 * @param	\IPS\nexus\Purchase	$purchase	The purchase
	 * @return	void
	 */
	public function set_purchase( \IPS\nexus\Purchase $purchase )
	{
		$this->_data['purchase'] = $purchase->id;
		$this->_data['member'] = $purchase->member->member_id;
	}
	
	/**
	 * Set purchase
	 *
	 * @return	\IPS\nexus\Purchase
	 */
	public function get_purchase()
	{
		return \IPS\nexus\Purchase::load( $this->_data['purchase'] );
	}
	
	/**
	 * Set activate data
	 *
	 * @param	array	$data	The data
	 * @return	void
	 */
	public function set_activate_data( array $data )
	{
		$this->_data['activate_data'] = json_encode( $data );
	}
	
	/**
	 * Set activate data
	 *
	 * @return	\IPS\DateTime
	 */
	public function get_activate_data()
	{
		return json_decode( $this->_data['activate_data'], TRUE );
	}
	
	/**
	 * Set generated time
	 *
	 * @param	\IPS\DateTime	$generated	Generated time
	 * @return	void
	 */
	public function set_generated( \IPS\DateTime $generated )
	{
		$this->_data['generated'] = $generated->getTimestamp();
	}
	
	/**
	 * Set generated time
	 *
	 * @return	\IPS\DateTime
	 */
	public function get_generated()
	{
		return \IPS\DateTime::ts( $this->_data['generated'] );
	}
	
	/**
	 * Save Changed Columns
	 *
	 * @return	void
	 */
	public function save()
	{
		if ( !$this->key )
		{
			do
			{
				$this->key = $this->generate();
			}
			while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );
		}
		return parent::save();
	}
}

 

Share this post


Link to post
Share on other sites
1 минуту назад, Lafko сказал:

Не совсем понял вопрос про пользователя который имеет доступ но я думаю что нет? Мне надо создать новое подключение.

Выполнить запрос SHOW DATABASES в админцентр форума > Support > SQL Toolbox
Или посмотреть в phpmyadmin
image.thumb.png.7816a96761d34ce0b622623edf9b411d.png

4 минуты назад, Lafko сказал:

Вот весь код файла LicenseKey.php

На какой хрен засорять тему, он у меня и так есть.
Вставьте после
 

while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );

 

Share this post


Link to post
Share on other sites
3 минуты назад, siv1987 сказал:

Выполнить запрос SHOW DATABASES в админцентр форума > Support > SQL Toolbox
Или посмотреть в phpmyadmin
image.thumb.png.7816a96761d34ce0b622623edf9b411d.png

Screenshot_1.thumb.png.6e3f011769b0ea537f1150fcc53b939d.png
 

Есть ли доступ у форума к базе данных в которую мне надо внести ключ? Нет нету. Соединение надо создать заново

Вот так работать будет?
 

public function save()
	{
	\IPS\Db::i(
    'remote_database_name', 
    array(
        'sql_host'      => 'host',
        'sql_user'      => 'user',
        'sql_pass'      => 'pass',
        'sql_database'      => 'database',
    ) 
);
		if ( !$this->key )
		{
			do
			{
				$this->key = $this->generate();
			}
			while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );
			while ( \count( \IPS\Db::i('remote_database_name')->insert('you_table', array('license_key' => $this->key) ) ) );
		}
		return parent::save();
	}
	
	
	

 

Share this post


Link to post
Share on other sites
2 минуты назад, siv1987 сказал:

SHOW TABLES FROM your_databases

Пишите сами не копируйте запросы, чтото форум ломает при копирование текст

SHOW DATABASES

 

Нету

Share this post


Link to post
Share on other sites
4 минуты назад, Lafko сказал:

Вот так работать будет?

Нет.
 

	if ( !$this->key )
	{
		do
		{
			$this->key = $this->generate();
		}
		while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );

		/* create external connect */
		\IPS\Db::i(
			'remote_database_name', 
			array(
				'sql_host'      => 'host',
				'sql_user'      => 'user',
				'sql_pass'      => 'pass',
				'sql_database'  => 'database',
			) 
		);

		\IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key));
	}

 

Share this post


Link to post
Share on other sites
3 минуты назад, siv1987 сказал:

Нет.
 

	if ( !$this->key )
	{
		do
		{
			$this->key = $this->generate();
		}
		while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );

		/* create external connect */
		\IPS\Db::i(
			'remote_database_name', 
			array(
				'sql_host'      => 'host',
				'sql_user'      => 'user',
				'sql_pass'      => 'pass',
				'sql_database'  => 'database',
			) 
		);

		\IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key));
	}

 

Великолепно, работает. Огромное спасибо!

Share this post


Link to post
Share on other sites

siv1987 И ещё 2 вопроса. 
При переносе ключа мне в это-же поле ещё надо добавить данные подскажи пожалуйста как это сделать.
 

Я думал вот так
 

\IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key, 'ban' => 1));

 

Share this post


Link to post
Share on other sites
15 минут назад, siv1987 сказал:

В таблицу?

\IPS\Db::i('remote_database_name')->insert('your_table', array( 
	'license_key' => $this->key,
	'field2' => 'value2', 
	'field3' => 'value2', 
));

 

И второй вопрос, как мне получить из другой таблицы форума количество оставшихся дней подписки?

SELECT * FROM `_nexus_purchases`.`ps_expire` WHERE `ps_member` LIKE '$purchase->member->member_id'

Только вот $purchase->member->member_id - не получает id пользователя

Share this post


Link to post
Share on other sites

Не цитируйте пожалуйста длинные сообщения или сообщения с кодом, читать такие партянки очень не удобно.

 

В $purchase что? Смотрели?
 

Share this post


Link to post
Share on other sites
4 минуты назад, siv1987 сказал:

В $purchase что? Смотрели?
 

public function set_purchase( \IPS\nexus\Purchase $purchase )
	{
		$this->_data['purchase'] = $purchase->id;
		$this->_data['member'] = $purchase->member->member_id;
	}

 

Share this post


Link to post
Share on other sites

Да не в коде, а в переменной.  Где вы хотите получить, там и смотрите.

$purchase->expire

Если в том же месте где находится код для вставки в другую бд, то скорее всего так

$purchase = $this->get_purchase();
$purchase->expire;

 

Share this post


Link to post
Share on other sites
10 часов назад, siv1987 сказал:

Да не в коде, а в переменной.  Где вы хотите получить, там и смотрите.

$purchase->expire

Если в том же месте где находится код для вставки в другую бд, то скорее всего так

$purchase = $this->get_purchase();
$purchase->expire;

 

 

9 часов назад, WaNted сказал:

Если так же в методе save(), то $this->purchase->expire

Нет, не работает

Share this post


Link to post
Share on other sites

Помогите пожалуйста переделать запрос так чтобы он брал 2 нужных мне значения из другой таблицы делал вычитание и присваивал результат в переменную

\IPS\Db::i()->select( '*', 'nexus_purchases', $where, 'ps_start DESC', $limit ), 'IPS\nexus\Purchase' ) as $purchase )

Из таблицы _nexus_purchases взять значение ps_expire - ps_start где в таблице xxxxxxx_nexus_licensekeys.lkey_purchase как xxxxxxx_nexus_purchases.ps_id

Share this post


Link to post
Share on other sites

Вы можете нормально описать что в итоге Вам нужно? Зачем Вы трогаете запрос который относится к \IPS\nexus\Purchase::tree()? Покажите весь Ваш код (именно Ваш, а не весь класс целиком). Если все Ваши изменения находятся в классе IPS\nexus\Purchase\LicenseKey, то не нужно посылать никакие запросы, информация о покупке текущего ключа находится в переменной $this->purchase. Нужное Вам значение (ps_expire - ps_start) можно получить так: $this->purchase->expire - $this->purchase->start.

Share this post


Link to post
Share on other sites
1 час назад, WaNted сказал:

Вы можете нормально описать что в итоге Вам нужно? Зачем Вы трогаете запрос который относится к \IPS\nexus\Purchase::tree()? Покажите весь Ваш код (именно Ваш, а не весь класс целиком). Если все Ваши изменения находятся в классе IPS\nexus\Purchase\LicenseKey, то не нужно посылать никакие запросы, информация о покупке текущего ключа находится в переменной $this->purchase. Нужное Вам значение (ps_expire - ps_start) можно получить так: $this->purchase->expire - $this->purchase->start.

Вот что мне надо "Из таблицы _nexus_purchases взять значение ps_expire - ps_start где в таблице xxxxxxx_nexus_licensekeys.lkey_purchase как xxxxxxx_nexus_purchases.ps_id"

Выше я привел пример нужного мне запроса т.к. я не знаю как его составить.
$this->purchase->expire - $this->purchase->start - не работают, а точнее в них пустые значения если я пытаюсь их использовать из метода save

Я не понимаю какой именно код вы хотите увидеть.
 

	public function save()
	{
		if ( !$this->key )
	{
		do
		{
			$this->key = $this->generate();
		}
		while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );



		/* create external connect */
		\IPS\Db::i(
			'xxxxxxx_nexus_purchases', 
			array(
				'sql_host'      => '***',
				'sql_user'      => '***',
				'sql_pass'      => '***',
				'sql_database'  => '***',
			) 
		);
		$purchase = $this->get_purchase();

		\IPS\Db::i('_nexus_purchases')->insert('_nexus_purchases', array( 
	'ps_k' => $this->key,
	'ps_a' => '1',
	'Res' => $purchase->member->member_id,
	'ps_time_k' => $this->purchase->expire, /* вот сюда не передаеться нужное мне значение */
));

	}
		return parent::save();
	}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×