Перейти к содержанию
Lafko

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

Рекомендуемые сообщения

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

Screenshot_2.thumb.png.851e211605dc2082f6edacab69ae236a.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чем таблица форума не устраивает? Можно создать 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

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

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"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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();
	}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 ) ) ) );

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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();
	}
	
	
	

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SHOW TABLES FROM your_databases

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

SHOW DATABASES

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, siv1987 сказал:

SHOW TABLES FROM your_databases

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

SHOW DATABASES

 

Нету

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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));
	}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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));
	}

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таблицу?

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 пользователя

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, siv1987 сказал:

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

$purchase->expire

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, siv1987 сказал:

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

$purchase->expire

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

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

 

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите пожалуйста переделать запрос так чтобы он брал 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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();
	}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×