Перейти к публикации

[Не для нубов] Реализация метода в модуле blockpro


Рекомендованные сообщения

Всем привет!

Пост предназначен прежде всего для программистов, знающих 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-доступ, чтобы пощупать модуль в живую.

Ссылка на сообщение
Поделиться на других сайтах

{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 строку

не проверял так как не ставил ваш модуль попробуйте если заработает то по аналогии с остальными тегами делайте.

Изменено пользователем dlehack
Ссылка на сообщение
Поделиться на других сайтах

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 )) всё зааботало.

Спасибо огромное за помощь!

Изменено пользователем ПафНутиЙ
Ссылка на сообщение
Поделиться на других сайтах

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]

Изменено пользователем a1ex
Ссылка на сообщение
Поделиться на других сайтах

dlehack

Видимо глянул на код вскольз.

так и есть

"'{title limit=\"(.*?)\"}'ie" => '$this -> textLimit($newsItem["title"], "\\1")',[/CODE]

не должен работать так как textLimit будет браться из класса dle_template а его там нет

Изменено пользователем dlehack
Ссылка на сообщение
Поделиться на других сайтах

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]

Ссылка на сообщение
Поделиться на других сайтах

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 не проверял но вроде должно работать вообщем решать вам.

Изменено пользователем dlehack
Ссылка на сообщение
Поделиться на других сайтах

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 метод описать

Ссылка на сообщение
Поделиться на других сайтах


foreach ($blck as $value) {

eval($value);

}

не опасно?

чем это может быть опасно вы же не пользовательские данные в eval отправляете

"'{title limit="(.*?)"}'ie" тот же eval посути

есть особенность в обработке ошибок а так в вашем случае думаю можно eval хотя я им стараюсь не пользоваться

у вас есть три варианта решения вашей проблемы я уже написал что сделал бы по второму а там вам решать

Изменено пользователем dlehack
Ссылка на сообщение
Поделиться на других сайтах


foreach ($blck as $value) {

eval($value);

}

не опасно?

чем это может быть опасно вы же не пользовательские данные в eval отправляете

"'{title limit="(.*?)"}'ie" тот же eval посути

есть особенность в обработке ошибок а так в вашем случае думаю можно eval хотя я им стараюсь не пользоваться

у вас есть три варианта решения вашей проблемы я уже написал что сделал бы по второму а там вам решать

Спасибо большое за представленные решения, буду пробовать и надеюсь удастся добиться результатов))

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...