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

$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

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


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

его там нет :(

 

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

 

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

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

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

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

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

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

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

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

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

Вхід

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

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

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