Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

$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));

 

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

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

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

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 = new User($this->registry);

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

Цитата

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

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

 

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

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


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

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


user_id в API.

его там нет :(

 

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

 

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

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

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

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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

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

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