我想在TYPO3中为TCA中的特定字段实现eval,如果BE用户输入限制值(如果没有输入任何内容或输入包含特定字符),则阻止将记录保存在后端。到目前为止,我只能更改eval函数中的值,如果不允许的话,但我希望如果BE用户在字段具有限制值时单击“保存”,则不会保存记录。这甚至可以通过评估吗?
编辑:一个廉价的方法是在eval函数中将$ value设置为NULL,如果输入是受限制的值,但这绝对不是优雅的方法,因为它会抛出可能会混淆BE用户的SQL错误。
所以我基本上需要一种方法来阻止TYPO3持久存储库...或者将记录设置回BE用户点击“保存”之前的状态...
编辑2:这就是我所拥有的...没有什么令人兴奋的,只是一个IPv4评估。但同样,它只将值更改为其他值,如果输入不是IPv4,则不会阻止创建或编辑记录。
<?php
namespace Cjk\Icingaconfgen\Evaluation;
use TYPO3\CMS\Core\Messaging\FlashMessage;
use TYPO3\CMS\Core\Messaging\FlashMessageService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* Class for field value validation/evaluation to be used in 'eval' of TCA
*/
class IPv4Evaluation
{
/**
* @param string $value
* @param string $is_in
* @param bool $set
* @return string
*/
public function evaluateFieldValue($value, $is_in, &$set)
{
if (!filter_var($value, FILTER_VALIDATE_IP)){
$value = 'Fehlerhafte Eingabe (IPv4)';
/** @var FlashMessage $message */
$message = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessage',
'Fehlerhafte Eingabe: .conf Datei wird nicht erstellt/editiert. Neue services können nicht hinzugefügt oder editiert werden.',
\TYPO3\CMS\Core\Messaging\FlashMessage::ERROR,
TRUE
);
/** @var $flashMessageService FlashMessageService */
$flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
$flashMessageService->getMessageQueueByIdentifier()->enqueue($message);
}
return $value;
}
}
所以基本上,如果我错了,请纠正我,eval发生在BE用户的输入(在他点击保存按钮之后)和记录的持久性之间。因此必须有一种方法来防止新数据的持久存在,而不仅仅是随意改变它。
我希望这使我的问题现在更清楚了,我不知道还有什么要写的来解释它。
我向您展示了TCA验证的一个例子。如果验证失败,则记录无法保存。
文件myextension / Classes / Validation / Validator / MinReferencesValidator.php
<?php
namespace Vendor\Myextension\Validation\Validator;
/**
* Validator for min references
*/
class MinReferencesValidator extends \TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator {
/**
* @var array
*/
protected $supportedOptions = [
'min' => [0, 'The minimum references to accept', 'integer'],
];
/**
* The given value is valid if it contains more then min items
*
* @param mixed $value The value that should be validated
* @return void
*/
public function isValid($value) {
if (!is_object($value)) {
$this->addError(
$this->translateErrorMessage(
'LLL:EXT:myextension/Resources/Private/Language/locallang.xlf:validator_object_notvalid',
'myextension'
), 1489870657);
return;
}
$minimum = $this->options['min'];
$countItems = count($value);
if ($countItems < $minimum) {
$this->addError(
$this->translateErrorMessage(
'LLL:EXT: myextension/Resources/Private/Language/locallang.xlf:validator_min_references',
'myextension',
[
$minimum
]
), 1489872300, [$minimum]);
return;
}
}
}
文件myextension / Classes / Domain / Model / Youritem.php
/**
* Image of supplier (image reference)
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
* @validate NotEmpty, \Vendor\Yourextension\Validation\Validator\MinReferencesValidator(min=1)
*/
protected $images;