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

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

Рекомендуемые сообщения

привет!

Дорабатываю админку магазина 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

Поделиться сообщением


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

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

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

 

  • +1 1

Поделиться сообщением


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

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

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

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)

...

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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();
			}
		}
	}

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

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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?

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

 

Изменено пользователем smirnoww

Поделиться сообщением


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

до
 

$sesion_name = 'temp_session_' . uniqid();

добавить
 

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

 

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

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

 

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

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

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

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

 

 

Изменено пользователем thentru

Поделиться сообщением


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

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

<?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>

 

Поделиться сообщением


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

Точнее так:

Если сразу после добавленной строчки посмотреть $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)

 

Поделиться сообщением


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

А в 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

Поделиться сообщением


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

 

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

в index.php не помогло.

А как поможет "загрузка библиотеки"?

 

Поделиться сообщением


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

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

Цитата

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

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

Цитата

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

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

 

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

Поделиться сообщением


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

Спасибо за участие. Не совладал я с user_id в API. Передал его в POST запросе по кнопке "Добавить историю"

Поделиться сообщением


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

user_id в API.

его там нет :(

 

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

 

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

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

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.