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

[Решено] объясните код

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

здравствуйте.
если не сложно, объясните следующую строку
$this->language->load(‘product/category’);
насколько я знаю, $this предоставляет доступ к методам и свойствам в контексте класса. Допустим, вышеприведенная строка используется в классе ControllerProductCategory который наследуется от Controller, но в этих классах нет свойствв language. Или я что-то неправильно понимаю?

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


Ссылка на сообщение
Поделиться на другие сайты
// Language    
$language = new Language($languages[$code]['directory']);
$language->load($languages[$code]['filename']);    
$registry->set('language', $language);

А здесь есть

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


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

$this->{Подключить класс языка из папки system\library\language.php}language->{public function load в этом классе подгружает указанный каталог\файл для загрузки языковых переменных из него в контроллер}load(‘product/category’);

  • +1 1

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


Ссылка на сообщение
Поделиться на другие сайты
// Language    
$language = new Language($languages[$code]['directory']);
$language->load($languages[$code]['filename']);    
$registry->set('language', $language);

А здесь есть

 

я знаю, что здесь есть, я не пойму, как в контроллере появляется  возможность обращаться к language при помощи $this

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


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

Это класс регистра:

final class Registry {
	private $data = array();

	public function get($key) {
		return (isset($this->data[$key]) ? $this->data[$key] : NULL);
	}

	public function set($key, $value) {
		$this->data[$key] = $value;
	}

	public function has($key) {
    	return isset($this->data[$key]);
  	}
}

а теперь посмотрите index.php как он обрабатывает обращения + в startup.php - подключаются нужные классы.

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


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

Васо, првильно ли я понял - когда в методе класса  ControllerProductCategory мы обращаемся к несуществующему свойству   $this->language, срабатывает __get родительского класса (abstract class Controller), который возвращает экземпляр класса Language, а затем запускаем метод load этого класса $this->language->load(‘product/category’);

  • +1 1

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


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

О, мама-миа, fanatic, зачем вам это нужно?

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


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

О, мама-миа, fanatic, зачем вам это нужно?

вы о чем?

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


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

Васо, првильно ли я понял - когда в методе класса  ControllerProductCategory мы обращаемся к несуществующему свойству   $this->language, срабатывает __get родительского класса (abstract class Controller), который возвращает экземпляр класса Language, а затем запускаем метод load этого класса $this->language->load(‘product/category’);

Понятия не имею, о чем Вы  :-D  я самоучка, и вижу всю логику немного другими глазами, описывать же терминологией ВУЗ-а - не имею возможности, но примерно по такой логике, что Вы описали.

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


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

здравствуйте.

если не сложно, объясните следующую строку

$this->language->load(‘product/category’);

насколько я знаю, $this предоставляет доступ к методам и свойствам в контексте класса. Допустим, вышеприведенная строка используется в классе ControllerProductCategory который наследуется от Controller, но в этих классах нет свойствв language. Или я что-то неправильно понимаю?

хороший вопрос

дело в родителе и его Magic Methods

abstract class Controller {
    protected $registry;    
    protected $id;
    protected $layout;
    protected $template;
    protected $children = array();
    protected $data = array();
    protected $output;
    
    public function __construct($registry) {
        $this->registry = $registry;
    }
    
    public function __get($key) {
        return $this->registry->get($key);
    }
    
    public function __set($key, $value) {
        $this->registry->set($key, $value);
    }

т.е. по сути

$this->language->load(‘product/category’);

 равнозначно

$this->registry->get('language')->load(‘product/category’);
  • +1 2

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


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

 

хороший вопрос

дело в родителе и его Magic Methods

abstract class Controller {
    protected $registry;    
    protected $id;
    protected $layout;
    protected $template;
    protected $children = array();
    protected $data = array();
    protected $output;
    
    public function __construct($registry) {
        $this->registry = $registry;
    }
    
    public function __get($key) {
        return $this->registry->get($key);
    }
    
    public function __set($key, $value) {
        $this->registry->set($key, $value);
    }

т.е. по сути

$this->language->load(‘product/category’);

 равнозначно

$this->registry->get('language')->load(‘product/category’);

Спасибо, я так и понял (разобрал что происходит от indexa до контроллера)

  • +1 1

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


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

fanatic, хороший подход к изучению движка, сам поначалу разбирался с этим. успехов!

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


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

Подскажите как в массиве сделать выбор первой записи?

Пытаюсь в карусели вывести описание баннера. В файле catalog/view/theme/default/template/module/carousel.tpl в самом начале добавляю код

<?php echo $banners['title']; ?>

Получается ошибка Notice: Undefined index: title in/catalog/view/theme/default/template/module/carousel.tpl on line 1

 

В самом файле catalog/view/theme/default/template/module/carousel.tpl есть такой код

<?php foreach ($banners as $banner) { ?>
<li><a href="<?php echo $banner['link']; ?>"><img src="<?php echo $banner['image']; ?>" alt="<?php echo $banner['title']; ?>" title="<?php echo $banner['title']; ?>" /></a></li>
<?php } ?>

Здесь получается идет перебор массива. Как сделать вывод только 1 раз вначале заголовка title ?

 

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


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

так пробовали?

<?php echo $banners[0]['title']; ?>

если массив ассоциативный

 $value = reset($array);

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


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

так пробовали?

<?php echo $banners[0]['title']; ?>

Спасибо! Заработало.

Только я немного с полем ошибся. Получается что берется заголовок картинки баннера, а не название самого баннера.

Название баннера хранится в переменной $name в файле /admin/view/template/design/banner_form.tpl

Непонятно тогда что прописать в catalog/view/theme/default/template/module/carousel.tpl чтобы при отображении появилось значение $name

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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