crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вопросы по основам PHP
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2012, 17:40
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Есть строка в коде:
<?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
  опции профиля:
сообщение 26.12.2012, 18:09
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


у тебя какая-то извращённая фантазия :) тут всё точно как в С++ написано: объявлен класс ControllerModuleCategory, который наследует от класса Controller. в нём private поле с неким списком error и метод index, который обращается к самому объекту через this.
всё проще пареной репы. но это в 5-м PHP. в более ранних там с классами особые заморочки и надо очень внимательно про них читать. я не уверена, что в 5-м они достигли полного аналога сишных классов. просто я не особо следила за развитием PHP последние годы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2012, 18:37
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Litkevich Yuriy @ 26.12.2012, 19:40) *
что такое model_setting_setting?
он не объявлен ни в классе ControllerModuleCategory ни в базовом


не могу врубится вообще как этот PHP и openCart, на его основе, работает. У меня глюк странный в магазине, а как выловить даже не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 26.12.2012, 20:06
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


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

очевидно, что model_setting_setting - член базового класса. но в PHP полно глобальных переменных и прочего всего, так что лучше не зная туда не лезть. тем более, если это Карт. потому что самая большая проблема PHP - это безопасность и я тебе не рекомендую тыкать настройки на сервере без особой необходимости, а то наделаешь себе проблем :)
а в чём заключается глюк в магазине? может, что подскажу. я много работала с PHP одно время.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2012, 20:53
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
  опции профиля:
сообщение 26.12.2012, 21:27
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


я нашла код этого 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
  опции профиля:
сообщение 27.12.2012, 8:08
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

и ещё не понятно, как само имя (model_setting_setting) получается, за это отвечает строка:
Цитата
'model_' . str_replace('/', '_', $model)
да?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.12.2012, 13:59
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(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
  опции профиля:
сообщение 28.12.2012, 3:26
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Iron Bug, может ты мне ещё подскажешь, как в вебе можно отлаживатся без каких либо IDE (я использовал echo, но он суёт текст перед веб страницей из-за этого браузер кодировку определить не может - не удобно)? Есть ли какая-нибудь бесплатная IDE, в которой можно было точки останова ставить в php-коде?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 28.12.2012, 15:39
Сообщение #10


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Litkevich Yuriy @ 28.12.2012, 6:26) *
Есть ли какая-нибудь бесплатная IDE, в которой можно было точки останова ставить в php-коде?

не знаю. бесплатных, кажется, нет. все воруют Zend.
а я вообще отлаживаюсь с помощью вывода всяких тестовых сообщений или записей в базу. как-то отладчики PHP меня не привлекают, тем более, что многие темплейт-энджины имеют свои средства отладки.
ну и логи апача и мускуля ещё - тоже неплохой метод поиска багов.

Сообщение отредактировал Iron Bug - 28.12.2012, 15:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


10 чел. читают эту тему (гостей: 10, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 5:41