Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Партнерская программа Ошибки


Recommended Posts

Хотел переделать партнерку, в итоге в версии ocStore 3.0.2.0 нашел ошибки.

В контроллере account/tracking.php в методе autocomplete идет генерация ссылки. Если включен СЕОПРО и у продукта есть СЕО ссылка то партнерский код обрезается.

Долго не думая, заменил вот это

foreach ($results as $result) {
				
			
				$json[] = array(
					'name' => strip_tags(html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8')),
					'link' => $links
				);
			}

на вот это

          foreach ($results as $result) {
				
				if( $this->config->get('config_seo_pro') ) {
				    $links = str_replace('&', '&', $this->url->link('product/product', 'product_id=' . $result['product_id'])) . '?tracking=' . $tracking;
			    } else {
				    $links = str_replace('&', '&', $this->url->link('product/product', 'product_id=' . $result['product_id'] . '&tracking=' . $tracking));
			    }
			
				$json[] = array(
					'name' => strip_tags(html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8')),
					'link' => $links
				);
			}

по сути конечно же нужно бы еще проверить есть ли у продукта сео ссылка. думаю кто в теме разработки сделать труда не составит

 

Далее

 

При регистрации в партнерке в контроллере mail/affiliate строка

$customer_group_id = $args[1]['customer_group_id'];

возникает ошибка, так как в массиве $args нет такого значения.

Можно код выше заменить на этот

$customer_group_id = $this->config->get('config_customer_group_id');

 

Не знаю вносились ли эти изменения по партнерке, но факт в том что у кого более ранняя версия опенкарта эта ошибка есть

Надіслати
Поділитися на інших сайтах

27 минут назад, Designer сказал:

 

Тогда уж, сделайте правильно


if (isset($args[1]['customer_group_id'])){
	$customer_group_id = (int)$args[1]['customer_group_id'];
} else {
	$customer_group_id = (int)$this->config->get('config_customer_group_id');
}

 

в контроллере стоит вот так

		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getGroupId();
		} else {
			$customer_group_id = $args[1]['customer_group_id'];
		}

заменить на так

		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getGroupId();
		} else {
			$customer_group_id = $this->config->get('config_customer_group_id'); 
		}

вроде выше написал что куда заменить. 

Надіслати
Поділитися на інших сайтах

Еще один нюанс в парнерке. вроде как считает переходы по ссылке с партнерским кодом

в файле Startup есть такие строки

		// Tracking Code
		if (isset($this->request->get['tracking'])) {
			setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
		
			$this->db->query("UPDATE `" . DB_PREFIX . "marketing` SET clicks = (clicks + 1) WHERE code = '" . $this->db->escape($this->request->get['tracking']) . "'");
		}

но перед тем как обновлять нужно же добавить в бд. а вот где добавляется не нашел или вообще по ходу нету

Надіслати
Поділитися на інших сайтах

5 часов назад, Designer сказал:

 

Так я и исправляю то, что Вы пишете не верно!

 

Вот полный код:


if ($this->customer->isLogged()) {
	$customer_group_id = (int)$this->customer->getGroupId();
} else {
  if (isset($args[1]['customer_group_id'])){
      $customer_group_id = (int)$args[1]['customer_group_id'];
  } else {
      $customer_group_id = (int)$this->config->get('config_customer_group_id');
  }
}

 

 

Да что тут исправлять а???? Вот это  

if (isset($args[1]['customer_group_id']))

ЗАЧЕМ???? в массиве нет ключа customer_group_id. 

в 

$this->config->get('config_customer_group_id')

и так стоит дефолтная группа

 

Змінено користувачем Venter
Убрал грубость
Надіслати
Поділитися на інших сайтах

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

Еще один нюанс в парнерке. вроде как считает переходы по ссылке с партнерским кодом

в файле Startup есть такие строки


		// Tracking Code
		if (isset($this->request->get['tracking'])) {
			setcookie('tracking', $this->request->get['tracking'], time() + 3600 * 24 * 1000, '/');
		
			$this->db->query("UPDATE `" . DB_PREFIX . "marketing` SET clicks = (clicks + 1) WHERE code = '" . $this->db->escape($this->request->get['tracking']) . "'");
		}

но перед тем как обновлять нужно же добавить в бд. а вот где добавляется не нашел или вообще по ходу нету

 

по поводу вот этого, это как я понял не относиться к той партнерке про которую писал выше

Надіслати
Поділитися на інших сайтах

По сути партнерская ссылка работает на весь магазин, не важно какой товар сгенерить в лк. Зачем это нужно вообще не знаю, эта генерация, 

Люди думают что теперь на каждый товар нужно отдельную ссылку генерить.

В общем хотел прикрутить партнерский код к главной странице. Для этого нужно будет править catalog/controller/startup/seo_url.php

 

И так, смотрим в метод rewrite и находим строки

				if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
					$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");

					if ($query->num_rows && $query->row['keyword']) {
						$url .= '/' . $query->row['keyword'];

						unset($data[$key]);
					}
				} elseif ($key == 'path') {
					$categories = explode('_', $value);

					foreach ($categories as $category) {
						$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = 'category_id=" . (int)$category . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");

						if ($query->num_rows && $query->row['keyword']) {
							$url .= '/' . $query->row['keyword'];
						} else {
							$url = '';

							break;
						}
					}

					unset($data[$key]);
				}

и заменяем на

				if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
					$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");

					if ($query->num_rows && $query->row['keyword']) {
						$url .= '/' . $query->row['keyword'];

						unset($data[$key]);
					}
				} elseif ($key == 'path') {
					$categories = explode('_', $value);

					foreach ($categories as $category) {
						$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = 'category_id=" . (int)$category . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");

						if ($query->num_rows && $query->row['keyword']) {
							$url .= '/' . $query->row['keyword'];
						} else {
							$url = '';

							break;
						}
					}

					unset($data[$key]);
				}
				elseif( $data['route'] == 'common/home' && isset($this->request->get['tracking']) ) {
					
					$url .= '/'; 					
					unset($data[$key]);
				}
				elseif( !isset($data['route']) && isset($this->request->get['tracking']) ) {
					
					$url .= '/'; 					
					unset($data[$key]);
				}

 

В итоге у вас будет два варианта партнерской ссылки на главную страницу

 

1) sait.ru/index.php?route=common/home&tracking=здесь реферальный код

 

2)  sait.ru/index.php?tracking=здесь реферальный код

 

 

 

Обязательно обновить модификаторы!!!

Змінено користувачем Venter
Новый вариант
Надіслати
Поділитися на інших сайтах

Так же я заменил генерацию реферального кода, а то генерирует целую портянку

Добавил в хелпер system/helper/general.php свою функцию

function randStr($len = 8, $default = '') { 
    $arr = array_merge(range(0, 9), range('a', 'z'));
    shuffle($arr);
	
	$arr_to = array_slice($arr, 0, $len);
	
	if( empty($default) ) {
		$default = array(rand(1, 99));
	} else {
		$default = array($default);
	}
	
	$arr_new = array_merge($arr_to, $default);
	shuffle($arr_new);
	
    return implode('', $arr_new);
}

 

В модели catalog/model/account/customer.php в методе addAffiliate заменил вот это

`tracking` = '" . $this->db->escape(token(64)) . "',

на

`tracking` = '" . $this->db->escape(randStr(10, $customer_id)) . "',

В итоге выходит уникальный код и не целая портянка как до этого

Надіслати
Поділитися на інших сайтах

5 часов назад, Venter сказал:

 

Да что тут исправлять а???? Вот это  


if (isset($args[1]['customer_group_id']))

ЗАЧЕМ???? в массиве нет ключа customer_group_id. 

в 


$this->config->get('config_customer_group_id')

и так стоит дефолтная группа

 

 

По поводу получения дефолтной группы в контроллере mail/affiliate.php

Немного посовещавшись с mpn2005 в телеграмм чате пришли к выводу что там получение дефолтной группы вообще не к чему

 

В итоге вот весь файл контроллера с удалением не нужного

class ControllerMailAffiliate extends Controller {
	public function index(&$route, &$args, &$output) {
		$this->load->language('mail/affiliate');
        
		$data['text_welcome'] = sprintf($this->language->get('text_welcome'), html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8'));
		$data['text_login'] = $this->language->get('text_login');
		$data['text_approval'] = $this->language->get('text_approval');
		$data['text_service'] = $this->language->get('text_service');
		$data['text_thanks'] = $this->language->get('text_thanks');

		
		$data['approval'] = '';
				
		
		$data['login'] = $this->url->link('affiliate/login', '', true);
		$data['store'] = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');

		$mail = new Mail($this->config->get('config_mail_engine'));
		$mail->parameter = $this->config->get('config_mail_parameter');
		$mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname');
		$mail->smtp_username = $this->config->get('config_mail_smtp_username');
		$mail->smtp_password = html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8');
		$mail->smtp_port = $this->config->get('config_mail_smtp_port');
		$mail->smtp_timeout = $this->config->get('config_mail_smtp_timeout');

		if ($this->customer->isLogged()) {
			$mail->setTo($this->customer->getEmail());
		} else {
			$mail->setTo($args[1]['email']);
		}
		
		$mail->setFrom($this->config->get('config_email'));
		$mail->setSender(html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8'));
		$mail->setSubject(sprintf($this->language->get('text_subject'), html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8')));
		$mail->setText($this->load->view('mail/affiliate', $data));
		$mail->send();
 	}
	
	public function alert(&$route, &$args, &$output) {
		// Send to main admin email if new affiliate email is enabled
		if (in_array('affiliate', (array)$this->config->get('config_mail_alert'))) {
			$this->load->language('mail/affiliate');
			
			$data['text_signup'] = $this->language->get('text_signup');
			$data['text_website'] = $this->language->get('text_website');
			$data['text_firstname'] = $this->language->get('text_firstname');
			$data['text_lastname'] = $this->language->get('text_lastname');
			$data['text_customer_group'] = $this->language->get('text_customer_group');
			$data['text_email'] = $this->language->get('text_email');
			$data['text_telephone'] = $this->language->get('text_telephone');
			
			if ($this->customer->isLogged()) {
				
				$data['firstname'] = $this->customer->getFirstName();
				$data['lastname'] = $this->customer->getLastName();
				$data['email'] = $this->customer->getEmail();
				$data['telephone'] = $this->customer->getTelephone();
			} else {	
				
				$data['firstname'] = $args[1]['firstname'];
				$data['lastname'] = $args[1]['lastname'];	
				$data['email'] = $args[1]['email'];
				$data['telephone'] = $args[1]['telephone'];		
			}
			
			$data['website'] = html_entity_decode($args[1]['website'], ENT_QUOTES, 'UTF-8');
			$data['company'] = $args[1]['company'];
							
			$data['customer_group'] = '';
			
			$mail = new Mail($this->config->get('config_mail_engine'));
			$mail->parameter = $this->config->get('config_mail_parameter');
			$mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname');
			$mail->smtp_username = $this->config->get('config_mail_smtp_username');
			$mail->smtp_password = html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8');
			$mail->smtp_port = $this->config->get('config_mail_smtp_port');
			$mail->smtp_timeout = $this->config->get('config_mail_smtp_timeout');

			$mail->setTo($this->config->get('config_email'));
			$mail->setFrom($this->config->get('config_email'));
			$mail->setSender(html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8'));			
			$mail->setSubject(html_entity_decode($this->language->get('text_new_affiliate'), ENT_QUOTES, 'UTF-8'));
			$mail->setText($this->load->view('mail/affiliate_alert', $data));
			$mail->send();

			// Send to additional alert emails if new affiliate email is enabled
			$emails = explode(',', $this->config->get('config_mail_alert_email'));

			foreach ($emails as $email) {
				if (utf8_strlen($email) > 0 && filter_var($email, FILTER_VALIDATE_EMAIL)) {
					$mail->setTo($email);
					$mail->send();
				}
			}
		}		
	}
}		

 

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.