public static function getTaxonomyTerms($taxonomyId, $options = array())
 {
     $criteria = new Criteria();
     $criteria->add(QubitTerm::TAXONOMY_ID, $taxonomyId);
     // Only include top-level terms if option is set
     if (isset($options['level']) && $options['level'] == 'top') {
         $criteria->add(QubitTerm::PARENT_ID, QubitTerm::ROOT_ID);
     }
     // Sort alphabetically
     $criteria->addAscendingOrderByColumn('name');
     // Do source culture fallback
     $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitTerm');
     return QubitTerm::get($criteria);
 }
 /**
  * Execute digitalobject list action
  *
  * @param sfWebRequest $request
  */
 public function execute($request)
 {
     // Build funky join query to get a count of top level digital objects
     // for each media type (term)
     $criteria = new Criteria();
     $criteria->add(QubitTerm::TAXONOMY_ID, QubitTaxonomy::MEDIA_TYPE_ID);
     $criteria->addJoin(QubitTerm::ID, QubitDigitalObject::MEDIA_TYPE_ID, Criteria::LEFT_JOIN);
     $criteria->addAsColumn('hits', 'COUNT(' . QubitDigitalObject::ID . ')');
     $criteria->addGroupByColumn(QubitTerm::ID);
     // Add I18n fallback
     $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitTerm');
     $criteria->addAscendingOrderByColumn('name');
     // Filter drafts
     $criteria->addJoin(QubitDigitalObject::INFORMATION_OBJECT_ID, QubitInformationObject::ID);
     $criteria = QubitAcl::addFilterDraftsCriteria($criteria);
     $this->terms = QubitTerm::get($criteria);
 }
 protected function addField($name)
 {
     switch ($name) {
         case 'searchFields':
             break;
         case 'repository':
             // Get list of repositories
             $criteria = new Criteria();
             // Do source culture fallback
             $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitActor');
             $criteria->addAscendingOrderByColumn('authorized_form_of_name');
             $choices = array('' => '');
             foreach (QubitRepository::get($criteria) as $repository) {
                 $choices[$repository->id] = $repository;
             }
             $this->form->setValidator($name, new sfValidatorChoice(array('choices' => array_keys($choices))));
             $this->form->setWidget($name, new sfWidgetFormSelect(array('choices' => $choices), array('style' => 'min-width: 50%; width: auto')));
             break;
         case 'mediatype':
             // Get list of media types
             $criteria = new Criteria();
             $criteria->add(QubitTerm::TAXONOMY_ID, QubitTaxonomy::MATERIAL_TYPE_ID);
             // Do source culture fallback
             $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitTerm');
             $criteria->addAscendingOrderByColumn('name');
             $choices = array('' => '');
             foreach (QubitTerm::get($criteria) as $mediatype) {
                 $choices[$mediatype->id] = $mediatype;
             }
             $this->form->setValidator($name, new sfValidatorChoice(array('choices' => array_keys($choices))));
             $this->form->setWidget($name, new sfWidgetFormSelect(array('choices' => $choices), array('style' => 'width: auto')));
             break;
         case 'hasDigitalObject':
             $choices = array('' => '', 'true' => 'Yes', 'false' => 'No');
             $this->form->setValidator($name, new sfValidatorChoice(array('choices' => array_keys($choices))));
             $this->form->setWidget($name, new sfWidgetFormSelect(array('choices' => $choices), array('style' => 'width: auto')));
             break;
     }
 }
 public function execute($request)
 {
     if (!isset($request->limit)) {
         $request->limit = sfConfig::get('app_hits_per_page');
     }
     // For term module show only preferred term
     $params = $this->context->routing->parse(Qubit::pathInfo($request->getReferer()));
     if ('term' == $params['module']) {
         $criteria = new Criteria();
         // Exclude the calling object and it's descendants from the list (prevent
         // circular inheritance)
         if (isset($params['id'])) {
             // TODO Self join would be ideal
             $term = QubitTerm::getById($params['id']);
             if (isset($term)) {
                 $criteria->add($criteria->getNewCriterion(QubitTerm::LFT, $term->lft, Criteria::LESS_THAN)->addOr($criteria->getNewCriterion(QubitTerm::RGT, $term->rgt, Criteria::GREATER_THAN)));
             }
         }
         $params = $this->context->routing->parse(Qubit::pathInfo($request->taxonomy));
         $criteria->add(QubitTerm::TAXONOMY_ID, $params['_sf_route']->resource->id);
         $criteria->addJoin(QubitTerm::ID, QubitTermI18n::ID);
         $criteria->add(QubitTermI18n::CULTURE, $this->context->user->getCulture());
         // Narrow results by query
         if (isset($request->query)) {
             $criteria->add(QubitTermI18n::NAME, "{$request->query}%", Criteria::LIKE);
         }
         // Sort by name
         $criteria->addAscendingOrderByColumn(QubitTermI18n::NAME);
         $criteria->setLimit(10);
         $this->terms = QubitTerm::get($criteria);
     } else {
         $s1 = 'SELECT qt.id, null, qti.name
     FROM ' . QubitTerm::TABLE_NAME . ' qt
       LEFT JOIN ' . QubitTermI18n::TABLE_NAME . ' qti
         ON qt.id = qti.id
     WHERE taxonomy_id = :p1
       AND qti.culture = :p2';
         $s2 = 'SELECT qt.id, qon.id as altId, qoni.name
     FROM ' . QubitOtherName::TABLE_NAME . ' qon
       INNER JOIN ' . QubitOtherNameI18n::TABLE_NAME . ' qoni
         ON qon.id = qoni.id
       INNER JOIN ' . QubitTerm::TABLE_NAME . ' qt
         ON qon.object_id = qt.id
     WHERE qt.taxonomy_id = :p1
       AND qoni.culture = :p2';
         // Narrow results by query
         if (isset($request->query)) {
             $s1 .= ' AND qti.name LIKE :p3';
             $s2 .= ' AND qoni.name LIKE :p3';
         }
         $connection = Propel::getConnection();
         $statement = $connection->prepare("({$s1}) UNION ALL ({$s2}) ORDER BY name LIMIT 10");
         $params = $this->context->routing->parse(Qubit::pathInfo($request->taxonomy));
         $statement->bindValue(':p1', $params['_sf_route']->resource->id);
         $statement->bindValue(':p2', $this->context->user->getCulture());
         if (isset($request->query)) {
             $statement->bindValue(':p3', "{$request->query}%");
         }
         $statement->execute();
         $this->terms = array();
         $rows = $statement->fetchAll();
         foreach ($rows as $row) {
             if (isset($row[1])) {
                 // Alternative term
                 $this->terms[] = array(QubitTerm::getById($row[0]), $row[2]);
             } else {
                 // Preferred term
                 $this->terms[] = QubitTerm::getById($row[0]);
             }
         }
     }
 }
 private static function getFullTree($currentNode, $limit)
 {
     $tree = array();
     // Get direct ancestors
     $ancestors = $currentNode->getAncestors()->orderBy('lft');
     foreach ($ancestors as $ancestor) {
         $tree[$ancestor->id] = $ancestor;
     }
     // Get siblings (with limit) - but don't show sibling collection roots
     $totalSiblings = 0;
     $criteria = new Criteria();
     $criteria->add(QubitTerm::PARENT_ID, $currentNode->parentId);
     if (QubitTerm::ROOT_ID == $currentNode->parentId) {
         $criteria->add(QubitTerm::TAXONOMY_ID, $currentNode->taxonomyId);
     }
     $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitTerm');
     $criteria->addAscendingOrderByColumn('name');
     if (0 < $limit) {
         $criteria->setLimit($limit);
     }
     foreach (QubitTerm::get($criteria) as $item) {
         // Keep track of position of $currentNode in array
         if ($item === $currentNode) {
             $curIndex = count($tree);
         }
         $tree[] = $item;
     }
     $totalSiblings = intval(BasePeer::doCount($criteria->setLimit(0))->fetchColumn(0));
     // Add current object to $tree if it wasn't added as a sibling
     if (!isset($curIndex)) {
         if ($totalSiblings >= $limit) {
             // replace last sibling with current object
             array_splice($tree, -1, 1, array($currentNode));
         } else {
             $tree[] = $currentNode;
         }
         $curIndex = count($tree) - 1;
     }
     if ($totalSiblings > $limit) {
         $tree[] = array('total' => $totalSiblings, 'limit' => $limit, 'parentId' => $currentNode->parentId);
     }
     // Get children (with limit)
     $totalChildren = 0;
     $criteria = new Criteria();
     $criteria->add(QubitTerm::PARENT_ID, $currentNode->id);
     $criteria = QubitCultureFallback::addFallbackCriteria($criteria, 'QubitTerm');
     $criteria->addAscendingOrderByColumn('name');
     if (0 < $limit) {
         $criteria->setLimit($limit);
     }
     if (0 < count($children = QubitTerm::get($criteria))) {
         foreach ($children as $item) {
             $childs[] = $item;
         }
         $totalChildren = intval(BasePeer::doCount($criteria->setLimit(0))->fetchColumn(0));
         if ($totalChildren > $limit) {
             $childs[] = array('total' => $totalChildren, 'limit' => $limit, 'parentId' => $currentNode->id);
         }
         // Insert children right AFTER current info object in array
         if ($curIndex == count($tree) - 1) {
             $tree = array_merge($tree, $childs);
         } else {
             array_splice($tree, $curIndex + 1, 0, $childs);
         }
     }
     return $tree;
 }
 public static function gettermsById($id, array $options = array())
 {
     $criteria = new Criteria();
     self::addtermsCriteriaById($criteria, $id);
     return QubitTerm::get($criteria, $options);
 }
 protected function addFormFields()
 {
     // Media type field
     $choices = array();
     $criteria = new Criteria();
     $criteria->add(QubitTerm::TAXONOMY_ID, QubitTaxonomy::MEDIA_TYPE_ID);
     foreach (QubitTerm::get($criteria) as $item) {
         $choices[$item->id] = $item->getName(array('cultureFallback' => true));
     }
     asort($choices);
     // Sort media types by name
     $this->form->setValidator('mediaType', new sfValidatorChoice(array('choices' => array_keys($choices))));
     $this->form->setWidget('mediaType', new sfWidgetFormSelect(array('choices' => $choices)));
     $this->form->setDefault('mediaType', $this->resource->mediaTypeId);
     // Only display "compound digital object" toggle if we have a child with a
     // digital object
     $this->showCompoundObjectToggle = false;
     foreach ($this->informationObject->getChildren() as $item) {
         if (null !== $item->getDigitalObject()) {
             $this->showCompoundObjectToggle = true;
             break;
         }
     }
     if ($this->showCompoundObjectToggle) {
         $this->form->setValidator('displayAsCompound', new sfValidatorBoolean());
         $this->form->setWidget('displayAsCompound', new sfWidgetFormSelectRadio(array('choices' => array('1' => $this->context->i18n->__('Yes'), '0' => $this->context->i18n->__('No')))));
         // Set "displayAsCompound" value from QubitProperty
         $criteria = new Criteria();
         $criteria->add(QubitProperty::OBJECT_ID, $this->resource->id);
         $criteria->add(QubitProperty::NAME, 'displayAsCompound');
         if (null != ($compoundProperty = QubitProperty::getOne($criteria))) {
             $this->form->setDefault('displayAsCompound', $compoundProperty->getValue(array('sourceCulture' => true)));
         }
     }
     // Add rights component
     $this->rightEditComponent = new RightEditComponent($this->context, 'right', 'edit');
     $this->rightEditComponent->resource = $this->resource;
     $this->rightEditComponent->execute($this->request);
     $maxUploadSize = QubitDigitalObject::getMaxUploadSize();
     ProjectConfiguration::getActive()->loadHelpers('Qubit');
     // If reference representation doesn't exist, include upload widget
     foreach ($this->representations as $usageId => $representation) {
         if (null === $representation) {
             $repName = "repFile_{$usageId}";
             $derName = "generateDerivative_{$usageId}";
             $this->form->setValidator($repName, new sfValidatorFile());
             $this->form->setWidget($repName, new sfWidgetFormInputFile());
             if (-1 < $maxUploadSize) {
                 $this->form->getWidgetSchema()->{$repName}->setHelp($this->context->i18n->__('Max. size ~%1%', array('%1%' => hr_filesize($maxUploadSize))));
             } else {
                 $this->form->getWidgetSchema()->{$repName}->setHelp('');
             }
             // Add "auto-generate" checkbox
             $this->form->setValidator($derName, new sfValidatorBoolean());
             $this->form->setWidget($derName, new sfWidgetFormInputCheckbox(array(), array('value' => 1)));
         } else {
             $this["rightEditComponent_{$usageId}"] = new RightEditComponent($this->context, 'right', 'edit');
             $this["rightEditComponent_{$usageId}"]->resource = $representation;
             $this["rightEditComponent_{$usageId}"]->nameFormat = 'editRight' . $usageId . '[%s]';
             $this["rightEditComponent_{$usageId}"]->execute($this->request);
         }
     }
 }