Prestashop对象模型双字段验证

时间:2016-02-27 16:28:10

标签: php prestashop prestashop-1.6

我有这个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_namepseudonym,但不是必需的。

我知道如何逐个设置必填字段,但我仍然坚持进行全局对象验证。

最好的方法是什么?

2 个答案:

答案 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课程下有这个逻辑,但我不知道它是否真的有可能。

如果你有更好/更合适的解决方案,请不要犹豫告诉我!