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

Создание и доступ к собственной системной библиотеке

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

Здравствуйте, уважаемые форумчане.

Требуется создать в папке system/library собственную модель, например "system/library/documents.php"

1. Нужно ли где-нибудь в движке её регистрировать, если да, то как?

2. Как подключать модель из контроллера? "this->documents->hello()" так правильно?

 

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


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

все по образцу. возьмите например customer

Ну и в разных версиях по разному.

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


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

amfsota, Модель должна лежать в папке catalog/model для пользовательской части и admin/model для админской.
А своя библиотека, это нечто иное и в контроллере подключается как $this->library->load('tvoya_liba');
и дальше используете $this->tvoya_liba->hello();

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


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

спасибо за ответы

19 минут назад, Waha сказал:

amfsota, Модель должна лежать в папке catalog/model для пользовательской части и admin/model для админской.
А своя библиотека, это нечто иное и в контроллере подключается как $this->library->load('tvoya_liba');
и дальше используете $this->tvoya_liba->hello();

дело в том, что системные библиотеки где-то подключаются один раз и дальше их использовать в любом контроллере можно так: this->documents->hello(), без отдельной загрузки.

Вопрос где происходит это подключение (в каком файле), никак найти не могу.

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


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

amfsota, Да что там искать, startup.php

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


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, Waha сказал:

amfsota, Да что там искать, startup.php

Прошу прощения за тупость.

Не нашёл там явного указания на конкретные файлы. Они регистрируются автоматически? Просто все файлы из директории library?

Вот здесь?

// Autoloader
function library($class) {
    $file = DIR_SYSTEM . 'library/' . str_replace('\\', '/', strtolower($class)) . '.php';

    if (is_file($file)) {
        include_once(modification($file));

        return true;
    } else {
        return false;
    }
}
 

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

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


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

Ничего не получается с библиотекой.

Что делал:

1. Создал контроллер "catalog/controller/calculators/main.php"

<?php
class ControllerCalculatorsMain extends Controller {
	public function start() {
		$this->load->library('calculators/testcalc');
		$json = array();
		$this->response->addHeader('Content-Type: application/json');
		$this->response->setOutput(json_encode($json));
	}
}
?>

2. Создал библиотеку с классом: "system/library/calculators/testcalc.php"

<?php
class Testcalc {
	public function calculate($data) {
		return $data;
	}
}
?>

3. Если в представлении происходит событие ajax-ом делается post запрос в контроллер:

function recalc() {
	msg="quantity="+document.getElementById("input-quantity").value+"&"+($('#calculator').serialize());
    $.ajax({
        url: 'index.php?route=calculators/main/start',
        type: 'post',
        data: msg,
        dataType: 'json',
        beforeSend: function() {
		},
        success: function(json) {
          		alert ('SUCCESS');
		if (json['error']) {
			alert (json['error']);
		}
		if (json['success']) {
			document.getElementById("input-quantity").value = json['quantity'];           
			document.getElementById("price").innerHTML = json['total']+' руб.<small> ('+json['price'] + ' р./шт)</small>';
		}
        },
        error: function(xhr, ajaxOptions, thrownError) {
			alert ('ERROR');
        }
    });
}

Проверяем.

В итоге ошибка 'ERROR'

 

Теперь комментируем эту строку в контроллере : "$this->load->library('calculators/testcalc');"

Опять запускаем, всё ОК, сообщение: 'SUCCESS'

 

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

Пробовал подключать системные библиотеки - то же самое.

Помогите, пожалуйста, уже запарился пробовать разные варианты.

 

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


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

 

1 час назад, amfsota сказал:

$this->load->library('calculators/testcalc');

 

1 час назад, amfsota сказал:

class Testcalc {

 

namespace Calculators

class Testcalc {

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


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

Спасибо за ссылки, но не получается ничего.

Блин что такое, ничего понят не могу???

<?php
class ControllerCalculatorsMain extends Controller {
	public function start() {
		$this->load->library('cart');//ЗДЕСЬ ОШИБКА!!! Что неправильно, подключаю ведь системную библиотеку.
		$json = array();
		$this->response->addHeader('Content-Type: application/json');
		$this->response->setOutput(json_encode($json));
	}
}
?>

 

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


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

Понятно... https://github.com/opencart/opencart/issues/3469

В opencart.pro 2 сделали автолоудер для всех библиотек, теперь 

$this->load->library('cart')

не работает

Чё делать совсем не пойму, ни один пример из инета не работает. А так надо сделать свою библиотеку. Не хочется плодить кучу дублирующегося кода для админки и каталога.

Ребята, может кто всё же знает как на новом движке подключать свои библиотеки?

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


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

УРАААА!!!!!

Целый день бьюсь.

$this->registry->set('mylibrary', new Mylibrary($this->registry));

Так заработало, может кому надо будет.

Всё, тему можно закрывать.

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


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

Я опять тут.

с подключением библиотеки из контроллеров и моделей разобрался.

Сейчас нарисовалась проблема, как подключить класс из системной библиотеки.

конструкция постом выше не работает.

Я из системной библиотеки 'cart.php' пытаюсь подключиться к своей таким методом:

$this->registry->set('calculators', new Calculators($this->registry));

В итоге получаю ошибку:

Notice: Undefined property: Cart::$registry in /var/www/u0328033/public_html/mymetab.ru/system/library/cart.php on line 39
Fatal error: Call to a member function set() on a non-object in /var/www/u0328033/public_html/mymetab.ru/system/library/cart.php on line 39

 

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


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

так вам же пишут черным по белому - нет такого свойства,

в конструктор registry передается, но нигде в свойствах не запоминается

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


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

Очень интересно. Как всё непросто с этим веб программированием, то ли дело на десктопе, любая библиотека, даже стороннего приложения прилепляется везде по одинаковому.

Решение-то какое-нибудь есть?

Почему этот же код прекрасно работает и в модулях админки и каталога, а здесь вдруг нет свойсва regisrty?

 

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


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

причем здесь вебпрограммирование?

 

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

Почему этот же код прекрасно работает и в модулях админки и каталога,

Потому что ООП

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


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

Да бог с ним с ООП...

Подскажите как профиксить?

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


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

В каком месте вы его хотите получить ?

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


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

Правлю файл: /public_html/mymetab.ru/system/library/cart.php (нужно, чтобы расчёт стоимости товара шёл по алгоритмам калькуляторов)

Есть своя библиотека: /public_html/mymetab.ru/system/library/calculators.php (здесь собраны методы с разными калькуляторами)

Нужно использовать методы из calculators.php в cart.php. А зарегистрировать класс calculators не получается.

Версия 2.1.0.1.10.

Помогите, пожалуйста.

 

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


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

Тогда вам не нужен ваш экземпляр класса в глобальном контейнере $registry
Вы просто можете его вызвать в нужном месте в классе Cart.

С помощью простой конструкции.

$this->load->library('calculators/testcalc');

$testcalc = New Testcalc();

 

И дальше к примеру.

 

$cost = $testcalc->method($cost );

 

 

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


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

теперь:

Notice: Undefined property: Cart::$load in /var/www/u0328033/public_html/mymetab.ru/system/library/cart.php on line 172

load насколько я понимаю в версии Pro не работает, там автолодер:

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


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

подключите библиотеку в конструкторе

 

public function __construct($registry) {
		$this->config = $registry->get('config');
		$this->customer = $registry->get('customer');
		$this->session = $registry->get('session');
		$this->db = $registry->get('db');
		$this->tax = $registry->get('tax');
		$this->weight = $registry->get('weight');
//!!!!!!!!
		$this->load = $registry->get('load');

 

  • +1 1

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


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

Не работает.

Файл /library/calculators.php:

<?php
class Calculators {
    private $data = array();

    public function __construct($registry) {
        $this->config = $registry->get('config');
        $this->customer = $registry->get('customer');
        $this->session = $registry->get('session');
        $this->db = $registry->get('db');
        $this->tax = $registry->get('tax');
        $this->weight = $registry->get('weight');
    }
.....

Файл /library/cart.php:

class Cart {
    private $data = array();

    public function __construct($registry) {
        $this->config = $registry->get('config');
        $this->customer = $registry->get('customer');
        $this->session = $registry->get('session');
        $this->db = $registry->get('db');
        $this->tax = $registry->get('tax');
        $this->weight = $registry->get('weight');
		$this->calculators = $registry->get('calculators');
....
    public function getProducts() {
....
		$calculators= new Calculators();
		$calcprice = $calculators->refreshPrice($cart);
....

Ошибка:

Warning: Missing argument 1 for Calculators::__construct(), called in /var/www/u0328033/public_html/mymetab.ru/system/library/cart.php on line 177 and defined in /var/www/u0328033/public_html/mymetab.ru/system/library/calculators.php on line 5Notice: Undefined variable: registry in /var/www/u0328033/public_html/mymetab.ru/system/library/calculators.php on line 6
Fatal error: Call to a member function get() on a non-object in /var/www/u0328033/public_html/mymetab.ru/system/library/calculators.php on line 6

 

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


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

Вы восклицательные знаки видели?

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


Ссылка на сообщение
Поделиться на другие сайты
class Cart {
    private $data = array();

    public function __construct($registry) {
        $this->config = $registry->get('config');
        $this->customer = $registry->get('customer');
        $this->session = $registry->get('session');
        $this->db = $registry->get('db');
        $this->tax = $registry->get('tax');
        $this->weight = $registry->get('weight');
	$this->load = $registry->get('load'); //вставил
...

		$this->load->library('calculators');
		$calculators= new Calculators();
...

Опять ошибка:

Fatal error: Call to undefined method Loader::library() in /var/www/u0328033/public_html/mymetab.ru/system/library/cart.php on line 173

 

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


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

ничего не понимаю. Вначале ТС показал себя как нормальный специалист. Вроде.

А потом как буд-то подменили и он стал писать 

$this->load = $registry->get('loa

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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