我目前正在使用ZF2开发会议系统。为此,我使用两个模型,分别称为“会议”和“会议时间”。Meeting与MeetingTime有一对多关系。
会议包含与日期/时间有关的以下字段:
public $slotDuration;
public $meetingTimes;
SlotDuration是每次会议的时间,以分钟为单位。MeetingTimes包含MeetingTime对象。
MeetingTime具有以下与日期/时间有关的字段:
public $slots;
public $dateTimeStart;
插槽数是此“会议”块中应容纳的会议数量。DateTimeStart是不言自明的。为了确定该会议的结束时间,我们将时段持续时间乘以该meetingtime对象中的时段数量。由于每个会议块可能在不同的时间结束,因此这是在Meetingtime对象中完成的。然后将结果转换为DateTime对象。
在创建表单中,如果用户认为有必要,我们会为MeetingTimes动态添加新的字段集。我们的业务模型被设计为尽可能灵活,因此用户可能会在会议之间停顿一下,或者在需要时将其延长几天。每个单个字段集都包含一个用于开始日期和时间的HTML5 DateTime元素,一个用于插槽的HTML5 Number元素以及一个用于保留房间的选择框。这些字段集包含在另一个字段集中,并包含在表单中。
现在,我的问题是关于验证,我如何确保这些时间中没有一个重叠(它们必须是连续的)?我在将信息发送到数据库之前在控制器中创建了对象,也许这可能有用。我希望我可以为此使用ZF2验证管道,但是,如果这不可能,那么我欢迎其他解决方案。
编辑:顺便说一句,表单看起来像这样。http://puu.sh/9yJri/12422b8231.png
如果没有更多信息,我将无法正确编写此代码,但是您将需要编写一个自定义验证器,该验证器将如下所示:
LocationAvailabilityValidator.php
<?php
namespace MeetingModuleThang\Validator;
use Zend\Validator\AbstractValidator;
class LocationAvailabilityValidator extends AbstractValidator
/**
* (non-PHPdoc)
* @see Zend\Validator.ValidatorInterface::isValid()
*/
public function isValid($value, $context=array())
{
//Get the location object from db by name
$location = $this->getObjectManager()->findByName('\Application\Entity\Location', $context['location']);
//Get your datetime of end properly this is likely ridiculous
// But I don't know the metrics and types you are using
$endTime = $value + $slotDuration;
$meetingStartDateTime = DateTime::createFromFormat($yourFormat, $value);
$meetinEndDateTime = DateTime::createFromFormat($yourFormat, $endTime);
return $location->isAvailableBetween($meetingStart, $meetingEnd);
}
然后,您可以仅检查定位方法,是否在db中为该对象存在插槽
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句