Подключения класса в плагине.

#1 20 октября 2015 в 10:45
Здравствуйте. Хочу DOM библиотеку подключить к плагину. Пытаюсь так:
  1. class p_test extends cmsPlugin {
  2.  
  3. public $html;
  4. public function __construct(){
  5.  
  6. require_once('/simple_html_dom.php');
  7. $html = new simple_html_dom($text);
  8. $this->html = $html;
  9. ....................................................................
но при обращении к методу
  1. private function Link($text){
  2. .....
  3. $link = $this->html->find('a');
  4. .....
  5. }
  1. Fatal error: Call to a member function find() on a non-object in...
Подскажите ошибку.
#3 20 октября 2015 в 11:54

$this->html->find

Сергей Сергеевич
?
#4 20 октября 2015 в 12:06
Чет, дорогой друг, вы перемудрили с подключением класса. Если вы пишете
  1. $html = new simple_html_dom($text);
то тем самым создали экземпляр $html класса.
Доступ к методу find() будет тогда
  1. $a = $html-> find('a') ;
#5 20 октября 2015 в 12:13

Чет, дорогой друг, вы перемудрили

Странник
Он из разных методов работает.
По мне так phpQuery работает шустрее и приближено к js. Вызывать
  1. $html = new simple_html_dom($text);
лучше в том же методе, где и его обработка
  1. $a = $html->find('a');
#6 20 октября 2015 в 12:35

Чет, дорогой друг, вы перемудрили

Странник
Я и сам так думаю, но подумал, что может $html только в конструкторе видна будет, ну и ..., а изначально так и подключал как пишет Loadырь.
В конструкторе
  1. require_once('/simple_html_dom.php')
, в методе
  1. $html = new simple_html_dom($text);$link = $html->find('a');
, но что то не пашет. Грешу на $text.
#7 20 октября 2015 в 13:16
ну так посмотрите в коде класса, что должно быть в $text — переменная, массив, объект?
Я надеюсь, путь к классу правильно прописан?
#8 20 октября 2015 в 13:31
Колдую на примере плагина p_hidetext. Там в $text, как я понимаю передаётся $item['content_html']
  1. private function parseHide($text, $hidden = false){..}
  2. private function eventGetPost($item) {
  3. if (!is_array($item)){ return $item; }
  4. $item['content_html'] = $this->parseHide($item['content_html']);
  5. return $item;
  6. }
А сама $item['content_html'] из
  1. public function execute($event='', $item=array()){
  2.  
  3. switch ($event){
  4. case 'GET_POST': $item = $this->eventGetPost($item); break;
  5. ................
  6. }
Правильно?
#9 20 октября 2015 в 13:45

Подскажите ошибку.

Lora
У вас весь пример — ошибка, поймите правильно.

Lora, вам нужно научиться отлаживать. Запомните простое правило:
в любых непонятных ситуациях делайте
  1. print_r($var); die;
в icms можно воспользоваться более простой формой записи dump($var);

Т.е. в вашем случае нужно взять и посмотреть, что там
  1. dump($this->html);
Это первое. Второе, вам же php пишет что за ошибка, зачем дальше пальцем в небо тыкать.
И третье, откуда у вас в конструкторе переменная $text? Вы ее передаете в конструктор? Нет. А зачем вы необъявленную переменную используете? На этапе разработки всегда нужно включать показ ошибок и предупреждений php, если бы это было включено у вас, вы бы увидели нотис и возможно сразу поняли в чем ошибка.
Вам нужно в конструкторе просто подключить файл класса, без создания объекта. А объект создавать уже там, где у вас будет доступен текст, который вы хотите распарсить, т.е. в методе execute или в ином, который указан в execute для обрабатываемого эвента.

Кроме этого, зачем
  1. require_once('/simple_html_dom.php');
есть же метод cmsCore::includeFile()

И напоследок, зачем использовать какой-то сторонний класс, если есть нативный DOMDocument.
#10 20 октября 2015 в 15:46
Fuze, Благодарю за столь обширное пояснение.Возьму во внимание. Жаль нет ответа к посту №8. smile
#11 20 октября 2015 в 16:01

Жаль нет ответа к посту №8

Lora
Там был вопрос? smile

Массив $item пришел в execute, там он передается в eventGetPost, где один элемент массива content_html уже передается в первый параметр parseHide.
Для самообучения область видимости переменной.
#12 20 октября 2015 в 16:36
Сори.Конечно, разве это вопрс? rofl
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.