Jump to content

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

Featured Replies

Posted
comment_155828

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

Screenshot_2.thumb.png.851e211605dc2082f6edacab69ae236a.png

  • Author
comment_155829

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

 

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

 

comment_155830

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

comment_155831

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

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.

comment_155833

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

comment_155835

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

 

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

 

comment_155839

SHOW TABLES FROM your_databases

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

SHOW DATABASES

 

  • Author
comment_155840
2 минуты назад, siv1987 сказал:

SHOW TABLES FROM your_databases

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


SHOW DATABASES

 

Нету

comment_155841
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
comment_155842
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
comment_155843

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

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

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

 

comment_155844

В таблицу?

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

 

  • Author
comment_155845
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 пользователя

comment_155846

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

 

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

  • Author
comment_155847
4 минуты назад, siv1987 сказал:

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

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

 

comment_155848

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

$purchase->expire

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

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

 

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

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

$purchase->expire

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


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

 

 

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

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

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

  • Author
comment_155860

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

comment_155864

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

  • Author
comment_155866
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.