Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

$this->user->getId() не работает в модулях папки catalog/model?


Recommended Posts

привет!

Дорабатываю админку магазина 2.1.0.2.1. Надо фиксировать пользователя, который изменил статус заказа и сделал запись в историю.

Когда мы нажимаем в админке кнопку "Добавить историю", то происходит POST запрос домен/index.php?route=api/order/history&order_id=277

 

запись в таблицу oc_order_history делает метод addOrderHistory класса ModelCheckoutOrder (catalog/model/checkout/order.php)

делаю соответствующие изменения в этом файле. Залогиненого пользователя пытаюсь получить $this->user->getId(). Безуспешно. Получаю NULL.

При этом эта же конструкция в модели из папки /admin/model/... работает.

 

Итого вопросы:

  • Как получить залогиненого пользователя в классе ModelCheckoutOrder (catalog/model/checkout/order.php)?
  • $this->user->getId() в классах  из папки catalog/... не работает или я что-то не так делаю?
  • Есть ли обходной путь для получения залогиненого пользователя в классах из папки catalog/...?

 

help, please

Link to comment
Share on other sites


Попробуйте сначала создать класс User, а потом выполняйте GetID. В каталоге, по умолчанию, он не создается, только в админке.

// User
$registry->set('user', new User($registry));

 

Link to comment
Share on other sites

Спасибо за отклик, но не помогло.

Кстати смотрел

var_dump($this->user);

он и так был создан, без 

$registry->set('user', new User($registry));

результат такой:

object(User)#242 (6) {
  ["user_id":"User":private]=>
  NULL
  ["username":"User":private]=>
  NULL
  ["permission":"User":private]=>
  array(0) {
  }
  ["db"]=>
  object(DB)#210 (1) {
    ["db":"DB":private]=>
    object(DB\MySQLi)#211 (1) {
      ["link":"DB\MySQLi":private]=>
      object(mysqli)#212 (19) {
        ["affected_rows"]=>
        int(1)

...

 

Может ещё что подскажете?

Link to comment
Share on other sites


var_dump($this->session);

При этом выглядит так

object(Session)#215 (1) {
  ["data"]=>
  &array(3) {
    ["api_id"]=>
    string(1) "1"
    ["language"]=>
    string(2) "ru"
    ["currency"]=>
    string(3) "RUB"
  }
}

Имхо, там должен быть user_id, которого нет :( , т.к. В конструкторе класса User пользователь берётся из $this->session->data['user_id']

class User {
	private $user_id;
	private $username;
	private $permission = array();

	public function __construct($registry) {
		$this->db = $registry->get('db');
		$this->request = $registry->get('request');
		$this->session = $registry->get('session');

		if (isset($this->session->data['user_id'])) {
			$user_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "user WHERE user_id = '" . (int)$this->session->data['user_id'] . "' AND status = '1'");

			if ($user_query->num_rows) {
				$this->user_id = $user_query->row['user_id'];
				$this->username = $user_query->row['username'];
				$this->user_group_id = $user_query->row['user_group_id'];

				$this->db->query("UPDATE " . DB_PREFIX . "user SET ip = '" . $this->db->escape($this->request->server['REMOTE_ADDR']) . "' WHERE user_id = '" . (int)$this->session->data['user_id'] . "'");

				$user_group_query = $this->db->query("SELECT permission FROM " . DB_PREFIX . "user_group WHERE user_group_id = '" . (int)$user_query->row['user_group_id'] . "'");

				$permissions = json_decode($user_group_query->row['permission'], true);

				if (is_array($permissions)) {
					foreach ($permissions as $key => $value) {
						$this->permission[$key] = $value;
					}
				}
			} else {
				$this->logout();
			}
		}
	}

снова взываю о помощи

Link to comment
Share on other sites


Создайте новый объект класса User до создания cессии в
catalog/controller/api/login.php

Link to comment
Share on other sites


33 минуты назад, thentru сказал:

Создайте новый объект класса User до создания cессии в
catalog/controller/api/login.php

Будьте добры, по конкретнее, пожалуйста. Вот файл login.php. Куда там и что вставлять?

<?php
class ControllerApiLogin extends Controller {
	public function index() {
		$this->load->language('api/login');

		$json = array();

		$this->load->model('account/api');

		// Check if IP is allowed
		$ip_data = array();

		$results = $this->model_account_api->getApiIps($this->config->get('config_api_id'));

		foreach ($results as $result) {
			$ip_data[] = $result['ip'];
		}

		if (!in_array($this->request->server['REMOTE_ADDR'], $ip_data)) {
			$json['error']['ip'] = sprintf($this->language->get('error_ip'), $this->request->server['REMOTE_ADDR']);
		}

		if (!$json) {
			// Login with API Key
			$api_info = $this->model_account_api->getApiByKey($this->request->post['key']);

			if ($api_info) {
				$json['success'] = $this->language->get('text_success');

				$sesion_name = 'temp_session_' . uniqid();

				$session = new Session($this->session->getId(), $sesion_name);

				// Set API ID
				$session->data['api_id'] = $api_info['api_id'];

				// Create Token
				$json['token'] = $this->model_account_api->addApiSession($api_info['api_id'], $sesion_name, $session->getId(), $this->request->server['REMOTE_ADDR']);
			} else {
				$json['error']['key'] = $this->language->get('error_key');
			}
		}

		if (isset($this->request->server['HTTP_ORIGIN'])) {
			$this->response->addHeader('Access-Control-Allow-Origin: ' . $this->request->server['HTTP_ORIGIN']);
			$this->response->addHeader('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
			$this->response->addHeader('Access-Control-Max-Age: 1000');
			$this->response->addHeader('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
		}

		$this->response->addHeader('Content-Type: application/json');
		$this->response->setOutput(json_encode($json));
	}
}

И для общего развития - как это решит мою задачу?

Кстати, это нормальное поведение:

* user не доступен в моделях из папки catalog?

* страница из админки добавляет запись в историю заказа через интерфейс покупателя?

 

Edited by smirnoww
Link to comment
Share on other sites


до
 

$sesion_name = 'temp_session_' . uniqid();

добавить
 

$this->user = new User($this->registry);

 

6 минут назад, smirnoww сказал:

И для общего развития - как это решит мою задачу?

 

При использовании апи, создается новая сессия, в которой нет данных об администраторе.
Вы создаете новый объект для работы с админом до того, как сессия изменилась

6 минут назад, smirnoww сказал:

user не доступен в моделях из папки catalog?

только при апи. В остальных случаях сессия одна и достаточно только создать объект класса user в контроллере или модели каталога

 

 

Edited by thentru
Link to comment
Share on other sites


Не завелось :( 

<?xml version="1.0" encoding="UTF-8"?>
<modification>
    <name>Пользователь в истории заказа</name>
    <code>off-def.order_history_user</code>
    <version>201702xx for opencart 2.0.x - 2.1.x</version>
    <author>e.smirnov</author>
    <link>http://off-def.ru</link>

	<file path="catalog/controller/api/login.php">
		<operation>
		  <search><![CDATA[$sesion_name = 'temp_session_' . uniqid();]]></search>
		  <add position="before"><![CDATA[
				$this->user = new User($this->registry);
		  ]]></add>
		</operation>
	</file>

	<file path="catalog/model/checkout/order.php">
		<operation>
			<search><![CDATA[$this->db->query("INSERT INTO " . DB_PREFIX . "order_history SET order_id = '" . (int)$order_id . "', order_status_id = '" . (int)$order_status_id . "', notify = '" . (int)$notify . "', comment = '" . $this->db->escape($comment) . "', date_added = NOW()");]]></search>
			<add position="replace"><![CDATA[
			ob_start();
			var_dump($this->session);
			var_dump($this->user);
			$var_dump_result = ob_get_clean();
			file_put_contents('user_id.log', $var_dump_result  );
				$sql_insert_history = "INSERT INTO " . DB_PREFIX . "order_history 
										SET 
											order_id = '" . (int)$order_id . "', 
											order_status_id = '" . (int)$order_status_id . "', 
											notify = '" . (int)$notify . "', 
											comment = '" . $this->db->escape($comment) . "', 
											date_added = NOW(),
											user_id = ".(int)$this->user->getId();
				$this->db->query($sql_insert_history);
			]]></add>
		</operation>
	</file>
</modification>

 

Link to comment
Share on other sites


Точнее так:

Если сразу после добавленной строчки посмотреть $this->user, то в нём всё заполнено

  ["user_id":"User":private]=>  string(1) "1"
  ["username":"User":private]=>  string(5) "admin"
  ["permission":"User":private]=> ...

Но к моменту, когда выполнение доходит до кода модели, то там снова грусть

["user_id":"User":private]=>  NULL
["username":"User":private]=> NULL
["permission":"User":private]=> array(0)

 

Link to comment
Share on other sites


А в index.php пробовали добавить:

// User
$registry->set('user', new User($registry));

По аналогии с admin/index.php?

 

Еще есть вариант с загрузкой библиотеки:

    public function compatibleLoadLibrary($route){
        // Sanitize the call
        $route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);

        $file = DIR_SYSTEM . 'library/' . $route . '.php';
        $class = str_replace('/', '\\', $route);

        if (is_file($file)) {
            if (version_compare('2', VERSION) >= 0) {
                include_once($file);
            } else {
                include_once(modification($file));
            }

            $this->registry->set(basename($route), new $class($this->registry));

        } else {
            throw new \Exception('Error: Could not load library ' . $route . '!');
        }
    }

Приведенный код загрузки работает в моделях и контроллерах от 1.5.x до 3.x

Link to comment
Share on other sites

Похожая задача была решена сред образом
до создания сессии, как я писал выше добавить
 

Цитата

$user = new User($this->registry);

после создания сессии поместить в сессию нужные данные
 

Цитата

$session->data['user_id'] = $user->getId();

и после этого в нужном месте создать еще один объект класса User

 

Повторюсь, что подобное поведение наблюдается только при работе с api

Link to comment
Share on other sites


user_id в API.

его там нет :(

 

Вернее оно там есть, но совсем в другом месте

 

32 минуты назад, smirnoww сказал:

Передал его в POST запросе по кнопке "Добавить историю"

Тоже верное решения

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.