Jump to content

Recommended Posts

Привет!
Пишу свое дополнение. И все действия происходят в /system/library/response.php
Понадобилось использовать($this->request->get['product_id']) класс request.php.
Как его подключить в response? 
class Response extends Controller выдает 
PHP Fatal error: Call to a member function get() on null in ../system/engine/controller.php on line 10

Share this post


Link to post
Share on other sites

Для того чтобы использовать контекст движка в каком-либо классе, нужно передать в него этот самый контекст. Есть и более простое решение, в конце.

 

1. Смотрим где подключается Response; и передаем ему $registry. 

$Response = new Response($registry = false);

2. В классе Response пописываем private $registry; и конструктор, который примет и проверит $registry, а затем назначит $this->$registry = $registry;

 

Здесь обязательно стоит добавить проверку на существование $registry. Т.к. в зависимости от версий движка, инициализация Response может быть в нескольких файла. Например, в каталоге мы добавили передачу $registry, а в admin/index.php ее нет и на странице admin может быть ошибка.

 

3. Получить product_id можно так:

$request = $this->registry->get('request');
$product_id = $request->get['product_id'];

А вообще можно получить все это без внедрения регистра в класс.

$route = isset($_GET['route']) ? $_GET['route'] : (isset($_GET['_route_']) ? $_GET['_route_'] : '');
$product_id = 0;
if ($route == 'product/product'){
	$product_id = (int)$_GET['product_id'];
}

 

Share this post


Link to post
Share on other sites
1 минуту назад, halfhope сказал:

Для того чтобы использовать контекст движка в каком-либо классе, нужно передать в него этот самый контекст. Есть и более простое решение, в конце.

 

1. Смотрим где подключается Response; и передаем ему $registry. 


$Response = new Response($registry = false);

 

 

Не особо "красиво".  А вдруг кто то модификаторами тоже так захочет "передать" - будет конфликт
Лучше завести свою кастомную переменную класса 
и в неё передавать registry, а потом из неё вызывать

Share this post


Link to post
Share on other sites
22 минуты назад, halfhope сказал:

А вообще можно получить все это без внедрения регистра в класс.

при включенном сео $_GET и $this->request->get разные пространства
 

$this->get = $this->clean($_GET);

 

Share this post


Link to post
Share on other sites

решил не портить response.php своим кодом. в нем только создаю экземпляр своего класса и вызываю один метод.

как в своем классе использовать например $this->db->query("...") ?
если $db = new DB; то надо все указывать как для нового подключения.
в примерах посмотрел \system\library\openbay\etsy.php там конструкция $this->db->query работает.

Share this post


Link to post
Share on other sites
4 минуты назад, stydent сказал:

как в своем классе использовать например $this->db->query("...") ?

Зависит от того, где ваш класс.

Если где-то в system, то в конструкторе делаете:

$this->db = $registry->get('db');

А затем используете, как и везде.

И не забудьте передать в конструктор $registry при создании экземпляра класса.

 

Если же ваш класс в контроллерах, то там это и так будет работать из коробки (если вы наследуетесь от Controller).

Share this post


Link to post
Share on other sites
23 часа назад, Dotrox сказал:

Если где-то в system, то в конструкторе делаете:

да у меня он в system/library

Такой способ вызывает PHP Fatal error:  Call to a member function get() on string

class className {
	
	private $registry;
	
	public function __construct($registry) {
		$this->db = $registry->get('db');
	}
.....
}

 

Share this post


Link to post
Share on other sites
В 18.06.2019 в 13:45, Dotrox сказал:

А затем используете, как и везде.

в response нет registry

Share this post


Link to post
Share on other sites
Posted (edited)
3 часа назад, stydent сказал:

Такой способ вызывает PHP Fatal error:  Call to a member function get() on string

А где и как вы свой класс инициализируете?

 

2 часа назад, chukcha сказал:

в response нет registry

Так речь же идёт сейчас уже про отдельный класс, в который registry будет передаваться при инициализации.

Edited by Dotrox

Share this post


Link to post
Share on other sites
19 часов назад, Dotrox сказал:

А где и как вы свой класс инициализируете?

в /system/library/response.php 

$mc = new className('');
echo $mc->output($output);

 

Share this post


Link to post
Share on other sites
20 часов назад, Dotrox сказал:

А где и как вы свой класс инициализируете?

 

Так речь же идёт сейчас уже про отдельный класс, в который registry будет передаваться при инициализации.

Видишь?
Т.е. нигде нет registry

Я предлагал добавить сеттер для registry, а можно добавить сеттер и для db

Share this post


Link to post
Share on other sites
2 часа назад, stydent сказал:

в /system/library/response.php 


$mc = new className('');
echo $mc->output($output);

 

 

Что я выше написал?

В 18.06.2019 в 13:45, Dotrox сказал:

И не забудьте передать в конструктор $registry при создании экземпляра класса.

А что вы передаёте? Пустую строку!

И если вы свой класс инициализируете в response, то, как уже сказал Чукча, там нет registry, так что вам сначала его нужно передать в response, а затем уже в свой класс.

 

 

2 часа назад, chukcha сказал:

Видишь?
Т.е. нигде нет registry

Его туда передать совсем не проблема.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.