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

Выполнение 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;

 

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

Если так же в методе save(), то $this->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();
	}

 

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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