[BUGFIX] Custom validators may be overriden by default validators
authorPhilipp Gampe <dev@philippgampe.info>
Wed, 14 Mar 2012 10:04:37 +0000 (11:04 +0100)
committerPhilipp Gampe <dev@philippgampe.info>
Sat, 24 Mar 2012 01:29:03 +0000 (02:29 +0100)
The softref parser always puts the type to 'db' for db records.
Due to the abstract validators fetchType method just returning this
type, the type gets overriden if any validator without own fetchType
method is evaluated later.
The solution is to store the type inside the record array, so that the
returned type is the last special type found.

Change-Id: I5d831c4f25c37da2606ad772e91bcfa11891e1df
Fixes: #34566
Releases: 4.5,4.6,4.7,6.0

typo3/sysext/linkvalidator/classes/class.tx_linkvalidator_processor.php

index 26a2d0e..8f950d3 100644 (file)
@@ -237,6 +237,7 @@ class tx_linkvalidator_Processor {
 
                        // Put together content of all relevant fields
                $haystack = '';
+                       /** @var t3lib_parsehtml $htmlParser */
                $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
 
                $idRecord = $record['uid'];
@@ -292,9 +293,14 @@ class tx_linkvalidator_Processor {
                        $type = '';
                        $idRecord = $record['uid'];
                        if (!empty($r)) {
-                                       // Parse string for special TYPO3 <link> tag:
+                                       /** @var tx_linkvalidator_linktype_Abstract $hookObj */
                                foreach ($this->hookObjectsArr as $keyArr => $hookObj) {
                                        $type = $hookObj->fetchType($r, $type, $keyArr);
+                                               // Store the type that was found
+                                               // This prevents overriding by internal validator
+                                       if (!empty($type)) {
+                                               $r['type'] = $type;
+                                       }
                                }
                                $results[$type][$table . ':' . $field . ':' . $idRecord . ':' . $r["tokenID"]]["substr"] = $r;
                                $results[$type][$table . ':' . $field . ':' . $idRecord . ':' . $r["tokenID"]]["row"] = $record;
@@ -321,6 +327,8 @@ class tx_linkvalidator_Processor {
                $currentR = array();
                $linkTags = $htmlParser->splitIntoBlock('link', $resultArray['content']);
                $idRecord = $record['uid'];
+               $type = '';
+               $title = '';
                for ($i = 1; $i < count($linkTags); $i += 2) {
                        $referencedRecordType = '';
                        foreach ($resultArray['elements'] as $element) {
@@ -347,8 +355,14 @@ class tx_linkvalidator_Processor {
                                        }
                                }
                        }
+                               /** @var tx_linkvalidator_linktype_Abstract $hookObj */
                        foreach ($this->hookObjectsArr as $keyArr => $hookObj) {
                                $type = $hookObj->fetchType($currentR, $type, $keyArr);
+                                       // Store the type that was found
+                                       // This prevents overriding by internal validator
+                               if (!empty($type)) {
+                                       $currentR['type'] = $type;
+                               }
                        }
 
                        $results[$type][$table . ':' . $field . ':' . $idRecord . ':' . $currentR["tokenID"]]["substr"] = $currentR;