ПафНутиЙ 31 Опубликовано: 16 ноября 2012 Рассказать Опубликовано: 16 ноября 2012 Всем привет! Пост предназначен прежде всего для программистов, знающих DLE. Если кто не знает - я делаю полезный и бесплатный модуль. Но есть одно НО - я не программист, php никогда не изучал и считаю себя чуть лучше, чем полным нубом в области программирования, поэтому очень тяжко даются новые, отсутствующие в DLE функции и фишки. Вот и сейчас я зашёл в тупик, из которого без посторонней помощи выйти не получается. Итак, кому интересно покритиковать, помочь советом или делом - модуль живёт на GitHub имеет смысл рассматривать только файл /upload/engine/modules/blockpro/block.pro.3.php т.к. класс ресайза взят уже готовый, а шаблон ничем особенным не выделяется. Что не получается: Вывод: {title limit="XX"} {short-story limit="XX"} {full-story limit="XX"} {date=формат даты} и дополнительных полей. Т.е. по сути реализация всего, что проходит через $tpl->copy_template Моя попытка сделать метод выглядит вот так: public function copyTemplate($data = array()) { // заменяем в шаблоне теги foreach ($copyTemplate as $value) { global $tpl; if ($copyTemplateMetod) { $tpl->copy_template = preg_replace($value, $tpl->copy_template); } else { $tpl->copy_template = str_replace($value, $tpl->copy_template); } } } строка 598 и ниже. Но метод не работает, требуется помощь опытных товарищей, а заодно и критика кода модуля) P.S. Сильно интересующимся, но ленящимся запускать на локалке, могу дать ссылку на сайт и ftp-доступ, чтобы пощупать модуль в живую. Ссылка на сообщение Поделиться на других сайтах
Old_chekist 4 Опубликовано: 18 ноября 2012 Рассказать Опубликовано: 18 ноября 2012 глянул на код ,для начала подучи пхп Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 31 Опубликовано: 18 ноября 2012 Рассказать Опубликовано: 18 ноября 2012 Автор Был бы признателен за более развёрнутый комментарий. Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 19 ноября 2012 Рассказать Опубликовано: 19 ноября 2012 {title limit="XX"} {short-story limit="XX"} {full-story limit="XX"} {date=формат даты} в 353 строке вижу уже реализацию {title} {short-story} {full-story} {date} на мой взгляд все что нужно это переопределить элементы массива $vars в строке 646 до вызова $tpl->set('', $vars); как это сделать на примере {short-story limit="XX"} if ( preg_match( "#\\{short-story limit=['\"](.+?)['\"]\\}#i", $tpl->copy_template, $matches ) ) { $count= intval($matches[1]); $vars[$matches[0]] = $this->textLimit($vars['{short_story}'], $count); } вставить в 646 строку не проверял так как не ставил ваш модуль попробуйте если заработает то по аналогии с остальными тегами делайте. Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 31 Опубликовано: 19 ноября 2012 Рассказать Опубликовано: 19 ноября 2012 Автор dlehack, К сожалению способ не заработал. Но если после "'\[not-allow-comm\\](.*?)\[/not-allow-comm\]'si" => !$newsItem['allow_comm']?'\\1':'', вставляю "'{title limit=\"(.*?)\"}'si" => $this -> textLimit($newsItem['title'], '10'), "'{date=(.+?)\}'ie" => "langdate('\\1', '{$newsItem['date']}')",[/code] [/color][color=#000000] Всё работает, текст обрезается, дата представляется в нужном формате.[/color][color=#000000] однако если написать так[/color][color=#000000] [code]"'{title limit=\"(.*?)\"}'si" => $this -> textLimit($newsItem['title'], '\\1'),[/code] [/color][color=#000000] в метод передаётся заголовок и [color=#A52A2A][b]1 [/b][/color]поэтому он возвращает пустую строку.[/color] [color=#5A5A5A][font=helvetica, arial, sans-serif]{title limit="XX"} {short-story limit="XX"} {full-story limit="XX"} {date=формат даты}[/font][/color] [color=#5A5A5A][font=helvetica, arial, sans-serif]в 353 строке вижу уже реализацию [/font][/color][color=#5A5A5A][font=helvetica, arial, sans-serif]{title} {short-story} {full-story} {date} на мой взгляд все что нужно это переопределить элементы массива $vars в строке 646 до вызова [/font][/color][b]$tpl->set('', $vars);[color=#5A5A5A][font=helvetica, arial, sans-serif] [/font][/color][/b] [b][color=#5A5A5A][font=helvetica, arial, sans-serif]как это сделать на примере [/font][/color][/b][color=#5A5A5A][font=helvetica, arial, sans-serif]{short-story limit="XX"} [/font][/color] [code] if ( preg_match( "#\\{short-story limit=['\"](.+?)['\"]\\}#i", $tpl->copy_template, $matches ) ) { $count= intval($matches[1]); $vars[$matches[0]] = $this->textLimit($vars['{short_story}'], $count); } [/code] вставить в 646 строку не проверял так как не ставил ваш модуль попробуйте если заработает то по аналогии с остальными тегами делайте. Всему виной невнимательность)) заменил short_story на short[color=#ff0000][b]-[/b][/color]story )) всё зааботало. Спасибо огромное за помощь! Ссылка на сообщение Поделиться на других сайтах
a1ex 60 Опубликовано: 20 ноября 2012 Рассказать Опубликовано: 20 ноября 2012 dlehack Видимо глянул на код вскольз. и не догоняет, что тут как бы разделен модель от шаблона. и не надо его собирать, Приучайтесь уже к MVC. в 353 строке вижу уже реализацию {title} {short-story} {full-story} {date} на мой взгляд все что нужно это переопределить элементы массива $vars в строке 646 до вызова $tpl->set('', $vars); Оптимизации это не добавит, т.к. в шаблоне все равно прописан forech, а кидать массив ещё в одну функцию - не айс. А по поводу if ( preg_match( "#{short-story limit=['"](.+?)['"]}#i", $tpl->copy_template, $matches ) ) Ты область видимости смотрел? По существу проблемы пишите, хрень какуюто предлагаете. Ваши советы такие продвинутые, ух прям как... Дайте ссылку на хелп по обучению PHP где можно почерпнуть знания, исходя из вашего совета, где такой бред написан? Ps Попробуй: "'{title limit=\"(.*?)\"}'ie" => '$this -> textLimit($newsItem["title"], "\\1")',[/CODE][/color] Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 20 ноября 2012 Рассказать Опубликовано: 20 ноября 2012 dlehack Видимо глянул на код вскольз. так и есть "'{title limit=\"(.*?)\"}'ie" => '$this -> textLimit($newsItem["title"], "\\1")',[/CODE] не должен работать так как textLimit будет браться из класса dle_template а его там нет Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 31 Опубликовано: 20 ноября 2012 Рассказать Опубликовано: 20 ноября 2012 Автор dlehack Видимо глянул на код вскольз. так и есть "'{title limit=\"(.*?)\"}'ie" => '$this -> textLimit($newsItem["title"], "\\1")', не должен работать так как textLimit будет браться из класса dle_template а его там нет Так и есть "'{title limit=\"(.*?)\"}'ie" => '$this -> textLimit($newsItem["title"], "\\1")', Fatal error: Call to undefined method dle_template::textLimit() in ..\engine\classes\templates.class.php(315) : regexp code on line 1 [/code] 315 строка [CODE]$this->copy_template = preg_replace( $find_preg, $replace_preg, $this->copy_template );[/code] Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 20 ноября 2012 Рассказать Опубликовано: 20 ноября 2012 Fatal error: Call to undefined method dle_template::textLimit() in ..engineclassestemplates.class.php(315) : regexp code on line 1 результат ожидаем можно попробовать так "'{title limit="(.*?)"}'ie" => 'BlockPro::textLimit($newsItem["title"], "1")', правда последуют правки значительные или оставить все как есть и сделать как в 4 посте мне кажется этот вариант предпочтительным есть еще такой вариант http://yadi.sk/d/Rp1brz790qCOO не проверял но вроде должно работать вообщем решать вам. Ссылка на сообщение Поделиться на других сайтах
a1ex 60 Опубликовано: 21 ноября 2012 Рассказать Опубликовано: 21 ноября 2012 Fatal error: Call to undefined method dle_template::textLimit() in ..engineclassestemplates.class.php(315) : regexp code on line 1 результат ожидаем можно попробовать так "'{title limit="(.*?)"}'ie" => 'BlockPro::textLimit($newsItem["title"], "1")', правда последуют правки значительные или оставить все как есть и сделать как в 4 посте мне кажется этот вариант предпочтительным есть еще такой вариант http://yadi.sk/d/Rp1brz790qCOO не проверял но вроде должно работать вообщем решать вам. Да this получилось от темплейта, тогда этот вариант подойдёт, если ststic метод описать Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 31 Опубликовано: 21 ноября 2012 Рассказать Опубликовано: 21 ноября 2012 Автор foreach ($blck as $value) { eval($value); } не опасно? Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 21 ноября 2012 Рассказать Опубликовано: 21 ноября 2012 foreach ($blck as $value) { eval($value); } не опасно? чем это может быть опасно вы же не пользовательские данные в eval отправляете "'{title limit="(.*?)"}'ie" тот же eval посути есть особенность в обработке ошибок а так в вашем случае думаю можно eval хотя я им стараюсь не пользоваться у вас есть три варианта решения вашей проблемы я уже написал что сделал бы по второму а там вам решать Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 31 Опубликовано: 22 ноября 2012 Рассказать Опубликовано: 22 ноября 2012 Автор foreach ($blck as $value) { eval($value); } не опасно? чем это может быть опасно вы же не пользовательские данные в eval отправляете "'{title limit="(.*?)"}'ie" тот же eval посути есть особенность в обработке ошибок а так в вашем случае думаю можно eval хотя я им стараюсь не пользоваться у вас есть три варианта решения вашей проблемы я уже написал что сделал бы по второму а там вам решать Спасибо большое за представленные решения, буду пробовать и надеюсь удастся добиться результатов)) Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Архивировано
Эта тема находится в архиве и закрыта для публикации сообщений.