public function execute($request)
 {
     $this->resource = $request->getAttribute('sf_route')->resource;
     $criteria = new Criteria();
     $criteria->add(QubitEvent::ACTOR_ID, $this->resource->id);
     $criteria->addJoin(QubitEvent::INFORMATION_OBJECT_ID, QubitInformationObject::ID);
     $criteria->addAscendingOrderByColumn(QubitEvent::TYPE_ID);
     // Sort info objects alphabetically (w/ fallback)
     $criteria->addAscendingOrderByColumn('title');
     $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitInformationObject');
     // Filter draft descriptions
     $criteria = QubitAcl::addFilterDraftsCriteria($criteria);
     $this->relatedInfoObjects = array();
     foreach (QubitEvent::get($criteria) as $item) {
         $this->relatedInfoObjects[$item->type->getRole()][] = $item->informationObject;
     }
     // Get "subject of" information objects (name access point)
     $criteria = new Criteria();
     $criteria->add(QubitRelation::OBJECT_ID, $this->resource->id);
     $criteria->add(QubitRelation::TYPE_ID, QubitTerm::NAME_ACCESS_POINT_ID);
     $this->subjectInfoObjects = array();
     foreach (QubitRelation::get($criteria) as $item) {
         $this->subjectInfoObjects[] = $item->subject;
     }
 }
 protected function addField($name)
 {
     switch ($name) {
         case 'creators':
             $criteria = new Criteria();
             $this->resource->addEventsCriteria($criteria);
             $criteria->add(QubitEvent::ACTOR_ID, null, Criteria::ISNOTNULL);
             $criteria->add(QubitEvent::TYPE_ID, QubitTerm::CREATION_ID);
             $value = $choices = array();
             foreach ($this->events = QubitEvent::get($criteria) as $item) {
                 $choices[$value[] = $this->context->routing->generate(null, array($item->actor, 'module' => 'actor'))] = $item->actor;
             }
             $this->form->setDefault('creators', $value);
             $this->form->setValidator('creators', new sfValidatorPass());
             $this->form->setWidget('creators', new sfWidgetFormSelect(array('choices' => $choices, 'multiple' => true)));
             break;
         case 'appraisal':
             $this->form->setDefault('appraisal', $this->resource['appraisal']);
             $this->form->setValidator('appraisal', new sfValidatorString());
             $this->form->setWidget('appraisal', new sfWidgetFormTextarea());
             break;
         default:
             return parent::addField($name);
     }
 }
    public function __get($name)
    {
        switch ($name) {
            case 'biogHist':
                return self::toDiscursiveSet($this->resource->history);
            case 'entityType':
                switch ($this->resource->entityTypeId) {
                    case QubitTerm::CORPORATE_BODY_ID:
                        return 'corporateBody';
                    case QubitTerm::FAMILY_ID:
                        return 'family';
                    case QubitTerm::PERSON_ID:
                        return 'person';
                }
                return;
            case 'existDates':
                // TODO <date/>, <dateRange/>, <dateSet/>, <descriptiveNote/>, simple
                // natural language parsing?
                return '<date>' . esc_specialchars($this->resource->datesOfExistence) . '</date>';
            case 'generalContext':
                return self::toDiscursiveSet($this->resource->generalContext);
            case 'maintenanceHistory':
                ProjectConfiguration::getActive()->loadHelpers('Date');
                $createdAt = format_date($this->resource->createdAt, 's');
                $updatedAt = format_date($this->resource->updatedAt, 's');
                $createdDisplay = format_date($this->resource->createdAt, 'F');
                $updatedDisplay = format_date($this->resource->updatedAt, 'F');
                return <<<return
<maintenanceEvent>
  <eventType>created</eventType>
  <eventDateTime standardDateTime="{$createdAt}">{$createdDisplay}</eventDateTime>
  <agentType>human</agentType>
  <agent/>
</maintenanceEvent>

<maintenanceEvent>
  <eventType>revised</eventType>
  <eventDateTime standardDateTime="{$updatedAt}">{$updatedDisplay}</eventDateTime>
  <agentType>human</agentType>
  <agent/>
</maintenanceEvent>

return;
            case 'maintenanceStatus':
                switch (strtolower($this->resource->descriptionStatus)) {
                    case 'revised':
                        return 'revised';
                    default:
                        return 'new';
                }
            case 'publicationStatus':
                return 'approved';
            case 'resourceRelation':
                $criteria = new Criteria();
                $criteria->add(QubitEvent::ACTOR_ID, $this->resource->id);
                $criteria->addJoin(QubitEvent::INFORMATION_OBJECT_ID, QubitInformationObject::ID);
                return QubitEvent::get($criteria);
            case 'functionRelation':
                $criteria = new Criteria();
                $criteria->addAlias('subj', QubitObject::TABLE_NAME);
                $criteria->addJoin(QubitRelation::SUBJECT_ID, 'subj.id');
                $criteria->add(QubitRelation::OBJECT_ID, $this->resource->id);
                $criteria->add('subj.class_name', 'QubitFunction');
                return QubitRelation::get($criteria);
            case 'structureOrGenealogy':
                return self::toDiscursiveSet($this->resource->internalStructures);
        }
    }
 public static function geteventsById($id, array $options = array())
 {
     $criteria = new Criteria();
     self::addeventsCriteriaById($criteria, $id);
     return QubitEvent::get($criteria, $options);
 }
 public function setDates($date, $options = array())
 {
     // parse the normalized dates into an Event start and end date
     $normalizedDate = array();
     if (isset($options['normalized_dates'])) {
         preg_match('/(?P<start>\\d{4}(-\\d{2})?(-\\d{2})?)\\/?(?P<end>\\d{4}(-\\d{2})?(-\\d{2})?)?/', $options['normalized_dates'], $matches);
         $normalizedDate['start'] = new DateTime($this->getDefaultDateValue($matches['start']));
         if (isset($matches['end'])) {
             $normalizedDate['end'] = new DateTime($this->getDefaultDateValue($matches['end']));
         } else {
             $normalizedDate['end'] = null;
         }
     } else {
         $normalizedDate['start'] = null;
         $normalizedDate['end'] = null;
     }
     // determine the Event type
     if (isset($options['date_type'])) {
         $eventType = $options['date_type'];
         // see if Event Type already exists, if so use it
         $criteria = new Criteria();
         $criteria->add(QubitTerm::TAXONOMY_ID, QubitTaxonomy::EVENT_TYPE_ID);
         $criteria->addJoin(QubitTerm::ID, QubitTermI18n::ID);
         $criteria->add(QubitTermI18n::NAME, $eventType);
         if ($term = QubitTermI18n::getOne($criteria)) {
             $eventTypeId = $term->id;
         } else {
             // if the Event Type does not already exist, create a new type and use it
             $term = new QubitTerm();
             $term->setTaxonomyId(QubitTaxonomy::EVENT_TYPE_ID);
             $term->setName($eventType);
             $term->setRoot();
             $term->save();
             $eventTypeId = $term->id;
         }
     } else {
         // set event type to 'creation' by default
         $eventTypeId = QubitTerm::CREATION_ID;
     }
     // assign the dates to the same event as the creator for this information object
     // if there is more than one creator, assign it to the first one that is returned
     if (count($creationEvents = $this->getCreationEvents()) > 0) {
         $event = $creationEvents[0];
         $event->setIndexOnSave(false);
         $event->setStartDate($normalizedDate['start']);
         $event->setEndDate($normalizedDate['end']);
         $event->setTypeId($eventTypeId);
         $event->setDate($date);
         $event->save();
     } else {
         // if this information object is not linked to a creator, create an event object
         // and link it to the information object
         $event = new QubitEvent();
         $event->setTypeId($eventTypeId);
         $event->setStartDate($normalizedDate['start']);
         $event->setEndDate($normalizedDate['end']);
         $event->setDate($date);
         $this->events[] = $event;
     }
 }