Jump to content
Sign in to follow this  
fanatic

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
// Language    
$language = new Language($languages[$code]['directory']);
$language->load($languages[$code]['filename']);    
$registry->set('language', $language);

А здесь есть

Share this post


Link to post
Share on other sites

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

  • +1 1

Share this post


Link to post
Share on other sites
// Language    
$language = new Language($languages[$code]['directory']);
$language->load($languages[$code]['filename']);    
$registry->set('language', $language);

А здесь есть

 

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

Share this post


Link to post
Share on other sites

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

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 - подключаются нужные классы.

Share this post


Link to post
Share on other sites

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

  • +1 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

вы о чем?

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

$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

Share this post


Link to post
Share on other sites

 

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

дело в родителе и его 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Пытаюсь в карусели вывести описание баннера. В файле 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 ?

 

Share this post


Link to post
Share on other sites

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

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

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

 $value = reset($array);

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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.

Sign in to follow this  

  • 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.