我有这个Artist
对象模型类:
class Artist extends ObjectModel
{
/**
* @var string
*/
public $first_name;
/**
* @var string
*/
public $last_name;
/**
* @var string
*/
public $pseudonym;
/**
* @var string
*/
public $letter;
/**
* @see ObjectModel::$definition
*/
public static $definition = [
'table' => 'artist',
'primary' => 'id_artist',
'fields' => [
'first_name' => ['type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => false, 'size' => 64],
'last_name' => ['type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => false, 'size' => 64],
'pseudonym' => ['type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => false, 'size' => 64],
'letter' => ['type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => false, 'size' => 1],
],
];
public function update($null_values = false)
{
$this->autoUpdateLetter();
return parent::update(true);
}
public function add($auto_date = true, $null_values = false)
{
$this->autoUpdateLetter();
return parent::add($auto_date, true);
}
private function autoUpdateLetter()
{
if (null === $this->letter || '' === $this->letter) {
if (null !== $this->last_name && '' !== $this->last_name) {
$this->letter = strtoupper($this->last_name[0]);
} elseif (null !== $this->pseudonym && '' !== $this->pseudonym) {
$this->letter = strtoupper($this->pseudonym[0]);
}
}
}
}
在管理员CRUD
系统上,我需要last_name
或pseudonym
,但不是必需的。
我知道如何逐个设置必填字段,但我仍然坚持进行全局对象验证。
最好的方法是什么?
答案 0 :(得分:0)
您可以将此字段设置为required => false,并在您用于CRUD的管理控制器中的postProcess函数中验证这些字段。
在调用parent :: postProcess之前的postProcess中,您可以分别验证这些字段中的任何一个并设置错误。
希望这会有所帮助;)
答案 1 :(得分:0)
我终于找到了一种感谢Sergii P和Divyesh P线索的方法。
_childValidation
来自validateRules
的{{1}}方法有AdminController
方法。此方法特定于自定义验证。
所以这是AdminArtistsController
下的工作代码:
public function _childValidation()
{
$object = new Artist();
if ('' === Tools::getValue('last_name') && '' === Tools::getValue('pseudonym')) {
$this->errors[] = sprintf(
Tools::displayError('You have to fill at least %1$s or %2$s field.'),
$object->displayFieldName('last_name', Artist::class),
$object->displayFieldName('pseudonym', Artist::class)
);
}
}
我希望在Artist
课程下有这个逻辑,但我不知道它是否真的有可能。
如果你有更好/更合适的解决方案,请不要犹豫告诉我!