Phalcon更新的唯一性

时间:2015-09-08 07:31:14

标签: forms validation unique phalcon

人。我的表单中的唯一性验证器在添加新记录时按预期工作,但在更新现有记录时,它会抛出该URL已存在的错误。事实上,它只存在于当前记录中。

这是我的控制器:

$feed = Feeds::findFirst($id);
$feedForm = new FeedForm($feed, array('edit' => true));

if ($this->request->isPost() == true) {
    $feedData = $this->request->getPost();
    if ($feedForm->isValid($feedData, $feed)) {
        if ($feed->save()) {
            $this->flash->success("Feed successfuly updated.");
            } else {
                $this->flash->error("Update failed.");
            }
       } else {
           foreach ($feedForm->getMessages() as $message) {
               $this->flash->error($message);
           }
    }
}

我的表格类:

class FeedForm extends FormBase {

    public $options;

    public function initialize($entity = null, $options = null) {
        parent::initialize();
        $this->setEntity($entity);
        $this->options = $options;

        $status = new Radio('status');
        $status->addValidator(
                new PresenceOf(
                array(
            'message' => 'The status is required.'
                )
        ));
        $this->add($status);

        $name = new Text('name');
        $name->addValidator(
                new PresenceOf(
                array(
            'message' => 'The name is required.'
                )
        ));
        $name->addValidator(
                new StringLength(
                array(
            'max' => 50,
            'messageMaximum' => 'The name you entered is too long.'
                )
        ));
        $this->add($name);

        $xml = new Text('xml');
        $xml->addValidator(
                new PresenceOf(
                array(
            'message' => 'The URL address is required.'
                )
        ));
        $xml->addValidator(
                new StringLength(
                array(
            'max' => 2048,
            'messageMaximum' => 'The URL address you entered is too long.'
                )
        ));
        $xml->addValidator(
                new Url(
                array(
            'message' => 'The URL you entered is invalid.'
                )
        ));
        $xml->addValidator(
                new Uniqueness(
                array(
            'model' => 'Sravnisite\Admin\Models\Feeds',
            'table' => 'feeds',
            'column' => 'xml',
            'message' => 'The entered URL address already exists.'
                )
        ));

        $periodOptions = array();
        for ($i = 4; $i <= 24; $i++) {
            array_push($periodOptions, $i);
        }
        $this->add($xml);

        $period = new Select('period', $periodOptions);
        $period->addValidator(
                new PresenceOf(
                array(
            'message' => 'The period is required.'
                )
        ));
        $this->add($period);

        $shopID = new Select('shop_id', Shops::find(), array('using' => array('id', 'name')));
        $shopID->addValidator(
                new PresenceOf(
                array(
            'message' => 'The shop is required.'
                )
        ));
        $this->add($shopID);
    }

}

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

表单验证并不知道忽略您正在更新的记录 - 因此,为了唯一性,它会找到您尝试更新的记录并给出错误。您可以执行一些复杂的查找逻辑来保持表单中的唯一性验证,但最好将其移动到模型中。你的结果最终会像:

控制器

$feed = Feeds::findFirst($id);
$feedForm = new FeedForm($feed, array('edit' => true));

if ($this->request->isPost() == true) {
    $feedData = $this->request->getPost();
    if ($feedForm->isValid($feedData, $feed)) {
        if ($feed->save()) {
            $this->flash->success("Feed successfuly updated.");
            } else {
                $this->flash->error("Update failed.");
                // Get each of the validation messages from the model
                foreach ($feed->getMessages() as $message) {
                    $this->flash->error($message);
                }
            }
       } else {
           foreach ($feedForm->getMessages() as $message) {
               $this->flash->error($message);
           }
    }
}

表格

// Exactly the same as you currently have but without the Uniqueness Validator

模型

class Feeds extends Phalcon\Mvc\Model

/**
 * Validate that xml URLs are unique
 */
public function validation()
{
    $this->validate(new Uniqueness(array(
        "field" => "xml",
        "message" => "The url must be unique."
    )));

    return $this->validationHasFailed() != true;
}