Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по основам PHP
Форум на CrossPlatform.RU > Разработка > Интерпретируемые языки
Litkevich Yuriy
Есть строка в коде:
<?php
class ControllerModuleCategory extends Controller {
    private $error = array();
    
    public function index() {
        $this->model_setting_setting->editSetting('category', $this->request->post); // <------------------
    }
}
?>

1) что такое $this в PHP?
2) что такое model_setting_setting?


---
предположения:
1) указатель/ссылка на объект (экземпляр класса) ControllerModuleCategory;
2) член (поле) класса ControllerModuleCategory, однако я не вижу чтоб его где-то объявили, в базовом тоже не вижу.

как это всё работает?
Iron Bug
у тебя какая-то извращённая фантазия :) тут всё точно как в С++ написано: объявлен класс ControllerModuleCategory, который наследует от класса Controller. в нём private поле с неким списком error и метод index, который обращается к самому объекту через this.
всё проще пареной репы. но это в 5-м PHP. в более ранних там с классами особые заморочки и надо очень внимательно про них читать. я не уверена, что в 5-м они достигли полного аналога сишных классов. просто я не особо следила за развитием PHP последние годы.
Litkevich Yuriy
Цитата(Litkevich Yuriy @ 26.12.2012, 19:40) *
что такое model_setting_setting?
он не объявлен ни в классе ControllerModuleCategory ни в базовом


не могу врубится вообще как этот PHP и openCart, на его основе, работает. У меня глюк странный в магазине, а как выловить даже не знаю.
Iron Bug
Цитата(Litkevich Yuriy @ 26.12.2012, 21:37) *
не могу врубится вообще как этот PHP и openCart, на его основе, работает. У меня глюк странный в магазине, а как выловить даже не знаю.

очевидно, что model_setting_setting - член базового класса. но в PHP полно глобальных переменных и прочего всего, так что лучше не зная туда не лезть. тем более, если это Карт. потому что самая большая проблема PHP - это безопасность и я тебе не рекомендую тыкать настройки на сервере без особой необходимости, а то наделаешь себе проблем :)
а в чём заключается глюк в магазине? может, что подскажу. я много работала с PHP одно время.
Litkevich Yuriy
Цитата(Iron Bug @ 26.12.2012, 22:06) *
член базового класса

Цитата(Litkevich Yuriy @ 26.12.2012, 20:37) *
ни в классе ControllerModuleCategory ни в базовом

Controller

<?php
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);
    }
            
    protected function forward($route, $args = array()) {
        return new Action($route, $args);
    }

    protected function redirect($url, $status = 302) {
        header('Status: ' . $status);
        header('Location: ' . str_replace('&', '&', $url));
        exit();
    }
    
    protected function getChild($child, $args = array()) {
        $action = new Action($child, $args);
        $file = $action->getFile();
        $class = $action->getClass();
        $method = $action->getMethod();
    
        if (file_exists($file)) {
            require_once($file);

            $controller = new $class($this->registry);
            
            $controller->$method($args);
            
            return $controller->output;
        } else {
            trigger_error('Error: Could not load controller ' . $child . '!');
            exit();                    
        }        
    }
    
    protected function render() {
        foreach ($this->children as $child) {
            $this->data[basename($child)] = $this->getChild($child);
        }
        
        if (file_exists(DIR_TEMPLATE . $this->template)) {
            extract($this->data);
            
              ob_start();
      
              require(DIR_TEMPLATE . $this->template);
      
              $this->output = ob_get_contents();

              ob_end_clean();
              
            return $this->output;
        } else {
            trigger_error('Error: Could not load template ' . DIR_TEMPLATE . $this->template . '!');
            exit();                
        }
    }
}
?>


ControllerModuleCategory

<?php
class ControllerModuleCategory extends Controller {
    private $error = array();
    
    public function index() {  
        $this->load->language('module/category');

        $this->document->setTitle($this->language->get('heading_title'));
        
        $this->load->model('setting/setting');
                
        if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
            echo "REQUEST_METHOD == POST";
            $this->model_setting_setting->editSetting('category', $this->request->post);        
                    
            $this->session->data['success'] = $this->language->get('text_success');
                        
            $this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));
        }
                
        $this->data['heading_title'] = $this->language->get('heading_title');

        $this->data['text_enabled'] = $this->language->get('text_enabled');
        $this->data['text_disabled'] = $this->language->get('text_disabled');
        $this->data['text_content_top'] = $this->language->get('text_content_top');
        $this->data['text_content_bottom'] = $this->language->get('text_content_bottom');        
        $this->data['text_column_left'] = $this->language->get('text_column_left');
        $this->data['text_column_right'] = $this->language->get('text_column_right');
        
        $this->data['entry_layout'] = $this->language->get('entry_layout');
        $this->data['entry_position'] = $this->language->get('entry_position');
        $this->data['entry_count'] = $this->language->get('entry_count');
        $this->data['entry_status'] = $this->language->get('entry_status');
        $this->data['entry_sort_order'] = $this->language->get('entry_sort_order');
        
        $this->data['button_save'] = $this->language->get('button_save');
        $this->data['button_cancel'] = $this->language->get('button_cancel');
        $this->data['button_add_module'] = $this->language->get('button_add_module');
        $this->data['button_remove'] = $this->language->get('button_remove');
        
        if (isset($this->error['warning'])) {
            $this->data['error_warning'] = $this->error['warning'];
        } else {
            $this->data['error_warning'] = '';
        }

          $this->data['breadcrumbs'] = array();

           $this->data['breadcrumbs'][] = array(
               'text'      => $this->language->get('text_home'),
            'href'      => $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL'),
              'separator' => false
           );

           $this->data['breadcrumbs'][] = array(
               'text'      => $this->language->get('text_module'),
            'href'      => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'),
              'separator' => ' :: '
           );
        
           $this->data['breadcrumbs'][] = array(
               'text'      => $this->language->get('heading_title'),
            'href'      => $this->url->link('module/category', 'token=' . $this->session->data['token'], 'SSL'),
              'separator' => ' :: '
           );
        
        $this->data['action'] = $this->url->link('module/category', 'token=' . $this->session->data['token'], 'SSL');
        
        $this->data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL');
        
        $this->data['modules'] = array();
        
        if (isset($this->request->post['category_module'])) {
            echo "POST category_module";
            $this->data['modules'] = $this->request->post['category_module'];
        } elseif ($this->config->get('category_module')) {
            echo "CONFIG category_module";
            $this->data['modules'] = $this->config->get('category_module');
            
        }else{
            echo "EMPTY information_module";
        }    
                
        $this->load->model('design/layout');
        
        $this->data['layouts'] = $this->model_design_layout->getLayouts();

        $this->template = 'module/category.tpl';
        $this->children = array(
            'common/header',
            'common/footer'
        );
                
        $this->response->setOutput($this->render());
    }
    
    private function validate() {
        if (!$this->user->hasPermission('modify', 'module/category')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }
        
        if (!$this->error) {
            return true;
        } else {
            return false;
        }    
    }
}
?>

echo - я уже натолкал, т.к. не представляю, как отлаживатся в PHP.


Цитата(Iron Bug @ 26.12.2012, 22:06) *
а в чём заключается глюк в магазине?
В админке есть настройки размещения "модулей" на витрине (где какой блок находится), для модуля "категория" выглядит так:
Нажмите для просмотра прикрепленного файла
это единственный модуль, который глючит.
1) я могу поменять здесь что угодно, хоть все строчки (страницы магазина) удалить. Но ничего не сохраняется. В других модулях всё нормально сохраняется, проверял, в БД данные не обновляются.

Мало того, Рсположение "Правая колонка" я поменял вчера (экспериментируя с компоновкой) до этого было "Левая колонка".

2) Удаляю соответствующие записи в БД руками - захожу в настройки модуля, там опять эти же три строки, лезу сразу в БД - пусто!

Откуда он настройки эти берёт, зараза?


ОФФ:

вчера отладил взаимодействие с Робокассой, отправил им документы на подключение. В новом году буду разные способы оплаты принимать, в том числе и банковские карточки
Iron Bug
я нашла код этого OpenCart в сети. это динамически создаваемый член класса (я же говорю, что это не классы нифига, а, скорее, массивы. раньше они и были массивами, по типу javascript, а потом их стали делать более похожими на классы).
в общем, это динамический элемент, грузится он в функции
     public function model($model) {
        $file  = DIR_APPLICATION . 'model/' . $model . '.php';
        $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $model);
        
        if (file_exists($file)) {
            include_once($file);
            
            $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry));
        } else {
            exit('Error: Could not load model ' . $model . '!');
        }
    }

в файле system/engine/loader.php.
конкретно тут он грузит какие-то файлы настроек из каталога model/$model.php, а уж что там в вызове за $model - это надо смотреть на месте.

в случае model_setting_setting это, скорее всего, файл model/setting/setting.php. там вызов editSetting - запрос к базе.
Litkevich Yuriy
Цитата(Iron Bug @ 26.12.2012, 23:27) *
это динамически создаваемый член класса
Спасибо огромное! Может ты мне сможешь объяснить, как такие вещи разыскивать? Какова последовательность рассуждений у тебя была, чтобы найти model_setting_setting.

и ещё не понятно, как само имя (model_setting_setting) получается, за это отвечает строка:
Цитата
'model_' . str_replace('/', '_', $model)
да?
Iron Bug
Цитата(Litkevich Yuriy @ 27.12.2012, 11:08) *
да?

именно. и получается она из пути до имени файла. я внизу дописала, что это файл model/setting/setting.php. а в нём определён этот самый editSetting

Цитата(Litkevich Yuriy @ 27.12.2012, 11:08) *
Может ты мне сможешь объяснить, как такие вещи разыскивать?

с этим сложнее. начинаешь смотреть с класса, с загрузки этого конкретного скрипта. проблема в том, что в PHP могут include'иться любые файлы и они становятся частью кода. а классы на самом деле не совсем классы, они могут расширяться "на ходу". по сути, это именованные массивы. поэтому надо проверять всю цепочку загрузки до конкретного класса, чтобы понять, что туда попадает, в итоге.
я сначала смотрела исходный класс, потом Control, потом - Model. собственно, я вряд ли смогу формально изложить ход своих мыслей при исследовании этого вопроса. просто я поняла, как эта машина работает и тогда сразу нашла, где примерно собираются эти пути. тут чисто опыт программирования на PHP, наверное.
Litkevich Yuriy
Iron Bug, может ты мне ещё подскажешь, как в вебе можно отлаживатся без каких либо IDE (я использовал echo, но он суёт текст перед веб страницей из-за этого браузер кодировку определить не может - не удобно)? Есть ли какая-нибудь бесплатная IDE, в которой можно было точки останова ставить в php-коде?
Iron Bug
Цитата(Litkevich Yuriy @ 28.12.2012, 6:26) *
Есть ли какая-нибудь бесплатная IDE, в которой можно было точки останова ставить в php-коде?

не знаю. бесплатных, кажется, нет. все воруют Zend.
а я вообще отлаживаюсь с помощью вывода всяких тестовых сообщений или записей в базу. как-то отладчики PHP меня не привлекают, тем более, что многие темплейт-энджины имеют свои средства отладки.
ну и логи апача и мускуля ещё - тоже неплохой метод поиска багов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.