我目前正在使用ZF2开发会议系统。我为此使用了两种模式,叫做“会议”。和' meetingTime'。 会议与MeetingTime有一对多的关系。
会议包含与日期/时间相关的以下字段:
public $slotDuration;
public $meetingTimes;
SlotDuration是每分钟的会议时间。 MeetingTimes包含MeetingTime对象。
MeetingTime具有以下与日期/时间相关的字段:
public $slots;
public $dateTimeStart;
广告位是这个'块中的会议数量。会议DateTimeStart是不言自明的。为了确定此会议的结束时间,我们采用插槽持续时间并将其乘以此会议时间对象中的插槽数量。由于每个会议块可能在不同的时间结束,因此这在会议时间对象中完成。然后将结果转换为DateTime对象。
在创建表单中,如果用户认为有必要,我们会为meetingTimes动态添加新的字段集。我们的业务模式尽可能灵活,因此用户可能会在会议之间暂停或在需要时延长多天。每个字段集包含一个用于开始日期和时间的HTML5 DateTime元素,一个用于插槽的HTML5 Number元素和一个用于保留房间的选择框。这些字段集包含在另一个字段集中,包含在表单中。
现在,我的问题是,关于验证,我如何确保这些时间中没有一个重叠(它们必须是连续的)?我在将信息发送到数据库之前在控制器中创建对象,这可能是有用的。 我希望我可以使用ZF2验证管道,但如果不可能,我可以开放任何其他解决方案。
编辑: 顺便说一句,表格看起来像这样。 http://puu.sh/9yJri/12422b8231.png
答案 0 :(得分:0)
如果没有更多信息,我无法正确编写,但您需要编写一个自定义验证器,它有点像这样:
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
中存在该对象的插槽