Jump to content

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

Featured Replies

Posted

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

Screenshot_2.thumb.png.851e211605dc2082f6edacab69ae236a.png

  • Author

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

 

	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

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

 

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

 

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

 

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

 

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

 

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

  • Author

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

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

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

 

  • Author
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 что? Смотрели?
 

  • Author
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;

 

  • Author
10 часов назад, siv1987 сказал:

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

$purchase->expire

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


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

 

 

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

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

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

  • Author

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

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

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.