валидация тега <cut>

Сейчас занимаюсь созданием сайта на базе данной CMS. Может кто-то обвинит меня в излишней скурпулезности, но я люблю чтобы мои сайты были валидными. Вопрос в тэге
<cut>
, дело в том что этот тэг является не HTML тэгом, а внутренним тэгом CMS, и поэтому в коде страниц этого тэга быть не должно во избежание всяческих эксцессов. При добавлении или редактировании топика данный тэг не удаляется из текста топика после разбиения его на анонс и полный текст. Я поступил следующим образом:

открываем файл classes/actions/ActionTopic.class.php
в этом файле есть два интересующих нас метода:
— SubmitAdd() — обработка добавления топика
— SubmitEdit($oTopic) — обработка редактирования топика
необходимо внести в них небольшую поправку.
SubmitAdd()
так выглядит метод

		/**
		 * Создаёт анонс топика(обрезаем по тег <cut>)
		 */		
		$sTestShort=$sText;
		$sTextTemp=str_replace("\r\n",'[<rn>]',$sText);
		$sTextTemp=str_replace("\n",'[<n>]',$sTextTemp);
		if (preg_match("/^(.*)<cut(.*)>(.*)$/Ui",$sTextTemp,$aMatch)) {			
			$sTestShort=$aMatch[1];				
			if (preg_match('/^\s*name\s*=\s*"(.+)"\s*$/Ui',$aMatch[2],$aMatchCut)) {				
				$oTopic->setCutText(trim($aMatchCut[1]));
			}				
		}
		
		$sTestShort=str_replace('[<rn>]',"\r\n",$sTestShort);
		$sTestShort=str_replace('[<n>]',"\r\n",$sTestShort);
		$oTopic->setText($sText);
		$oTopic->setTextShort($sTestShort);
		$oTopic->setTextSource(getRequest('topic_text'));		
		$oTopic->setTags(getRequest('topic_tags'));
		$oTopic->setDateAdd(date("Y-m-d H:i:s"));
		$oTopic->setUserIp(func_getIp());



		/**
		 * Создаёт анонс топика(обрезаем по тег <cut>)
		 */		
		$sTestShort=$sText;
		$sTextTemp=str_replace("\r\n",'[<rn>]',$sText);
		$sTextTemp=str_replace("\n",'[<n>]',$sTextTemp);
		if (preg_match("/^(.*)<cut(.*)>(.*)$/Ui",$sTextTemp,$aMatch)) {			
			$sTestShort=$aMatch[1];				
			if (preg_match('/^\s*name\s*=\s*"(.+)"\s*$/Ui',$aMatch[2],$aMatchCut))     {				
				$oTopic->setCutText(trim($aMatchCut[1]));
			}				
		}
		
		$sTestShort=str_replace('[<rn>]',"\r\n",$sTestShort);
		$sTestShort=str_replace('[<n>]',"\r\n",$sTestShort);
		//вот эту строчку нужно добавить
                $sText=preg_replace("/<cut(.*)>/Ui","",$sText);
		
                $oTopic->setText($sText);
		$oTopic->setTextShort($sTestShort);
		$oTopic->setTextSource(getRequest('topic_text'));		
		$oTopic->setTags(getRequest('topic_tags'));
		$oTopic->setDateAdd(date("Y-m-d H:i:s"));
		$oTopic->setUserIp(func_getIp());


добавили строчку $sText=preg_replace("/<cut(.*)>/Ui","",$sText); которая как раз и уберет ненужный нам тэг.

аналогичную операцию нужно осуществить в методе SubmitEdit($oTopic)

/**
		 * Парсим на предмет ХТМЛ тегов
		 */
		$sText=$this->Text_Parser(getRequest('topic_text'));	
		$sTestShort=$sText;
		$sTextTemp=str_replace("\r\n",'[<rn>]',$sText);
		$sTextTemp=str_replace("\n",'[<n>]',$sTextTemp);
		if (preg_match("/^(.*)<cut(.*)>(.*)$/Ui",$sTextTemp,$aMatch)) {			
			$sTestShort=$aMatch[1];				
			if (preg_match('/^\s*name\s*=\s*"(.+)"\s*$/Ui',$aMatch[2],$aMatchCut)) {				
				$oTopic->setCutText(trim($aMatchCut[1]));
			}				
		}
		$sTestShort=str_replace('[<rn>]',"\r\n",$sTestShort);
		$sTestShort=str_replace('[<n>]',"\r\n",$sTestShort);
		//вот эту строчку нужно добавить
                $sText=preg_replace("/<cut(.*)>/Ui","",$sText);

		$oTopic->setText($sText);
		$oTopic->setTextShort($sTestShort);
		$oTopic->setTextSource(getRequest('topic_text'));
		$oTopic->setTags(getRequest('topic_tags'));		
		$oTopic->setUserIp(func_getIp());

теперь проблем с валидацией тега «cut» нет.
Надеюсь что кому-то помог, в следующей статье расскажу как свалидировать видео, так как flash проигрыватели иногда не проходят валидацию.

13 комментариев

avatar
не нужно по нескольку раз постить одно и тоже в разные блоги
  • ort
  • 0
avatar
я удалю это из другого блога. Вы же сами мне посоветовали сюда запостить
avatar
топики можно переносить в другие блоги при его редактировании
avatar
спасибо, учту
avatar
А как вы поступите если я вызову топик на редактирование и потом сохраню?
avatar
топик отредактируется и сохранится. Дело в том что в базе данных хранится 3 варианта текста:
-короткий(анонс) — то что до тэга
-полный — тот который выводится
-редактируемый — это полный текст со всеми тегами

вот в редактируемом тег остается, а в полном вырезается. Таким образом мы убираем тег только из выдачи в браузер.
avatar
Ну там совсем source вроде, но да, можно переставить строки если что. У ас выполз этот вопрос когда на входе картинки имели вншние адреса, мы их грузили к себе и меняли путь. Потом редактировать, они опять внешние. Разобрались конечно.
avatar
дело в том что методы которые я правил вызываются при преобразовании source в text. поэтому это никак не влияет на исходный текст.
avatar

Да, да.
Вот тут

        $oTopic->setTextSource(getRequest('topic_text'));    
 
avatar
у меня ваш код несработал, видимо попричине того, что вы удаляете у меня 105ревизия там
avatar
у меня ваш код несработал, видимо попричине того, что вы удаляете [cut] у меня 105 ревизия там [cut/]
avatar
хотя нет, точней так вставляется код [cut] в топик

а уже когда просматриваешь исходный код сформированной страницы там [cut/]
avatar
Финал такой — чтобы уже добавленные посты корректно отображались их напрмер нужно перепостить, что кат корректно обработался

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