ПафНутиЙ 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 строку не проверял так как не ставил ваш модуль попробуйте если заработает то по аналогии с остальными тегами делайте. Изменено 19 ноября 2012 пользователем dlehack 1 Цитата Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 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 )) всё зааботало. Спасибо огромное за помощь! Изменено 19 ноября 2012 пользователем ПафНутиЙ Цитата Ссылка на сообщение Поделиться на других сайтах
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] Изменено 20 ноября 2012 пользователем a1ex Цитата Ссылка на сообщение Поделиться на других сайтах
dlehack 14 Опубликовано: 20 ноября 2012 Рассказать Опубликовано: 20 ноября 2012 (изменено) dlehack Видимо глянул на код вскольз. так и есть "'{title limit=\"(.*?)\"}'ie" => '$this -> textLimit($newsItem["title"], "\\1")',[/CODE] не должен работать так как textLimit будет браться из класса dle_template а его там нет Изменено 20 ноября 2012 пользователем dlehack Цитата Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 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 не проверял но вроде должно работать вообщем решать вам. Изменено 20 ноября 2012 пользователем dlehack Цитата Ссылка на сообщение Поделиться на других сайтах
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 хотя я им стараюсь не пользоваться у вас есть три варианта решения вашей проблемы я уже написал что сделал бы по второму а там вам решать Изменено 21 ноября 2012 пользователем dlehack Цитата Ссылка на сообщение Поделиться на других сайтах
ПафНутиЙ 31 Опубликовано: 22 ноября 2012 Рассказать Опубликовано: 22 ноября 2012 Автор foreach ($blck as $value) { eval($value); } не опасно? чем это может быть опасно вы же не пользовательские данные в eval отправляете "'{title limit="(.*?)"}'ie" тот же eval посути есть особенность в обработке ошибок а так в вашем случае думаю можно eval хотя я им стараюсь не пользоваться у вас есть три варианта решения вашей проблемы я уже написал что сделал бы по второму а там вам решать Спасибо большое за представленные решения, буду пробовать и надеюсь удастся добиться результатов)) Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.