/**
  * Display a paginated hitlist of information objects (top-level only)
  *
  * @param sfRequest $request
  */
 public function execute($request)
 {
     if (!isset($request->limit)) {
         $request->limit = sfConfig::get('app_hits_per_page');
     }
     $this->resource = QubitInformationObject::getById(QubitInformationObject::ROOT_ID);
     if (isset($this->getRoute()->resource)) {
         $this->resource = $this->getRoute()->resource;
     }
     $query = QubitSearch::getInstance()->addTerm($this->resource->id, 'parentId');
     if (isset($request->query)) {
         $query = $request->query;
     }
     $query = QubitAcl::searchFilterByRepository($query, 'read');
     $query = QubitAcl::searchFilterDrafts($query);
     $this->pager = new QubitArrayPager();
     $this->pager->hits = QubitSearch::getInstance()->getEngine()->getIndex()->find($query);
     $this->pager->setMaxPerPage($request->limit);
     $this->pager->setPage($request->page);
     $ids = array();
     foreach ($this->pager->getResults() as $hit) {
         $ids[] = $hit->getDocument()->id;
     }
     $criteria = new Criteria();
     $criteria->add(QubitInformationObject::ID, $ids, Criteria::IN);
     $this->informationObjects = QubitInformationObject::get($criteria);
 }
 public function save($connection = null)
 {
     // TODO: $cleanObject = $this->object->clean;
     $cleanObjectId = $this->__get('objectId', array('clean' => true));
     parent::save($connection);
     if ($this->indexOnSave()) {
         if ($this->objectId != $cleanObjectId && null !== QubitInformationObject::getById($cleanObjectId)) {
             QubitSearch::updateInformationObject(QubitInformationObject::getById($cleanObjectId));
         }
         if ($this->object instanceof QubitInformationObject) {
             QubitSearch::updateInformationObject($this->object);
         }
     }
     return $this;
 }
 public function execute($request)
 {
     parent::execute($request);
     $this->addFields();
     $this->title = $this->context->i18n->__('Global search/replace');
     if ($request->isMethod('post')) {
         // Make sure we have required information for search/replace
         if (empty($request->pattern) || empty($request->replacement)) {
             $this->error = $this->context->i18n->__('Both source and replacement fields are required.');
             return;
         } else {
             if (!isset($request->confirm)) {
                 $this->title = $this->context->i18n->__('Are you sure you want to replace "%1%" with "%2%" in %3%?', array('%1%' => $request->pattern, '%2%' => $request->replacement, '%3%' => sfInflector::humanize(sfInflector::underscore($request->column))));
                 return;
             }
         }
         // Process replacement on each IO
         // NB: could this be made faster by reading a batch of IDs?
         foreach ($this->pager->hits as $hit) {
             $io = QubitInformationObject::getById($hit->getDocument()->id);
             if (isset($request->allowRegex)) {
                 $pattern = '/' . strtr($request->pattern, array('/' => '\\/')) . '/';
                 if (!isset($request->caseSensitive)) {
                     $pattern .= 'i';
                 }
                 $replacement = strtr($request->replacement, array('/' => '\\/'));
                 $replaced = preg_replace($pattern, $replacement, $io->__get($request->column));
             } elseif (isset($request->caseSensitive)) {
                 $replaced = str_replace($request->pattern, $request->replacement, $io->__get($request->column));
             } else {
                 $replaced = str_ireplace($request->pattern, $request->replacement, $io->__get($request->column));
             }
             $io->__set($request->column, $replaced);
             $io->save();
         }
         // force refresh of index to keep sync
         QubitSearch::getInstance()->optimize();
         // When complete, redirect to GSR home
         $this->redirect(array('module' => 'search', 'action' => 'globalReplace'));
     }
 }
 /**
  * @see sfTask
  */
 public function execute($arguments = array(), $options = array())
 {
     $databaseManager = new sfDatabaseManager($this->configuration);
     $conn = $databaseManager->getDatabase('propel')->getConnection();
     sfConfig::set('app_upload_dir', self::getUploadDir($conn));
     if (false === ($fh = fopen($arguments['filename'], 'rb'))) {
         throw new sfException('You must specify a valid filename');
     }
     $this->logSection("Load digital objects from {$arguments['filename']}...");
     // Get header (first) row
     $header = fgetcsv($fh, 1000);
     if (!in_array('information_object_id', $header) || !in_array('filename', $header)) {
         throw new sfException('Import file must contain an \'information_object_id\' and \'filename\' column');
     }
     $idKey = array_search('information_object_id', $header);
     $fileKey = array_search('filename', $header);
     // Build hash on information_object.id, with array value if information
     // object has multiple digital objects attached
     while ($item = fgetcsv($fh, 1000)) {
         if (!isset($digitalObjects[$item[$idKey]])) {
             $digitalObjects[$item[$idKey]] = $item[$fileKey];
         } else {
             if (!is_array($digitalObjects[$item[$idKey]])) {
                 $digitalObjects[$item[$idKey]] = array($digitalObjects[$item[$idKey]], $item[$fileKey]);
             } else {
                 $digitalObjects[$item[$idKey]][] = $item[$fileKey];
             }
         }
     }
     // Loop through $digitalObject hash and add digital objects to db
     foreach ($digitalObjects as $key => $item) {
         if (null === ($informationObject = QubitInformationObject::getById($key))) {
             $this->log("Invalid information_object id {$key}");
             continue;
         }
         if (!is_array($item)) {
             self::addDigitalObject($informationObject, $item, $conn);
         } else {
             // If more than one digital object linked to this information object
             for ($i = 0; $i < count($item); $i++) {
                 // Create new information objects, to maintain one-to-one
                 // relationship with digital objects
                 $informationObject = new QubitInformationObject();
                 $informationObject->parent = QubitInformationObject::getById($key);
                 $informationObject->title = basename($item[$i]);
                 $informationObject->save($conn);
                 self::addDigitalObject($informationObject, $item[$i], $conn);
             }
         }
     }
     $this->logSection('Successfully Loaded ' . self::$count . ' digital objects.');
 }
 public function execute($request)
 {
     // Default items per page
     if (!isset($request->limit)) {
         $request->limit = sfConfig::get('app_hits_per_page');
     }
     $this->form = new sfForm();
     $this->resource = $this->getRoute()->resource;
     // Check that the object exists and that it is not the root
     if (!isset($this->resource) || !isset($this->resource->parent)) {
         $this->forward404();
     }
     // Check authorization
     if (!QubitAcl::check($this->resource, 'update')) {
         QubitAcl::forwardUnauthorized();
     }
     // "parent" form field
     $this->form->setValidator('parent', new sfValidatorString(array('required' => true)));
     $this->form->setWidget('parent', new sfWidgetFormInputHidden());
     // Root is default parent
     if ($this->resource instanceof QubitInformationObject) {
         $this->form->bind($request->getGetParameters() + array('parent' => $this->context->routing->generate(null, array(QubitInformationObject::getById(QubitInformationObject::ROOT_ID), 'module' => 'informationobject'))));
     } else {
         if ($this->resource instanceof QubitTerm) {
             $this->form->bind($request->getGetParameters() + array('parent' => $this->context->routing->generate(null, array(QubitTerm::getById(QubitTerm::ROOT_ID), 'module' => 'term'))));
         }
     }
     if ($request->isMethod('post')) {
         $this->form->bind($request->getPostParameters());
         if ($this->form->isValid()) {
             $params = $this->context->routing->parse(Qubit::pathInfo($this->form->parent->getValue()));
             // In term treeview, root node links (href) to taxonomy, but it represents the term root object
             if ($this->resource instanceof QubitTerm && QubitObject::getById($params['_sf_route']->resource->id) instanceof QubitTaxonomy) {
                 $this->resource->parentId = QubitTerm::ROOT_ID;
             } else {
                 $this->resource->parentId = $params['_sf_route']->resource->id;
             }
             $this->resource->save();
             if ($request->isXmlHttpRequest()) {
                 return $this->renderText('');
             } else {
                 if ($this->resource instanceof QubitInformationObject) {
                     $this->redirect(array($this->resource, 'module' => 'informationobject'));
                 } else {
                     if ($this->resource instanceof QubitTerm) {
                         $this->redirect(array($this->resource, 'module' => 'term'));
                     }
                 }
             }
         }
     }
     $params = $this->context->routing->parse(Qubit::pathInfo($this->form->parent->getValue()));
     $this->parent = QubitObject::getById($params['_sf_route']->resource->id);
     $query = QubitSearch::getInstance()->addTerm($this->parent->slug, 'parent');
     if (isset($request->query)) {
         $query = $request->query;
     }
     $this->pager = new QubitArrayPager();
     $this->pager->hits = QubitSearch::getInstance()->getEngine()->getIndex()->find($query);
     $this->pager->setMaxPerPage($request->limit);
     $this->pager->setPage($request->page);
     $ids = array();
     foreach ($this->pager->getResults() as $hit) {
         $ids[] = $hit->getDocument()->id;
     }
     $criteria = new Criteria();
     $criteria->add(QubitObject::ID, $ids, Criteria::IN);
     $this->results = QubitObject::get($criteria);
 }
 public function save($connection = null)
 {
     // TODO: $cleanInformationObject = $this->informationObject->clean;
     $cleanInformationObjectId = $this->__get('informationObjectId', array('clean' => true));
     // Write assets to storage device
     if (0 < count($this->assets)) {
         foreach ($this->assets as $asset) {
             if (null == $this->getChecksum() || $asset->getChecksum() != $this->getChecksum()) {
                 $this->writeToFileSystem($asset);
             }
             // TODO: allow setting multiple assets for different usage types
             // (e.g. a master, thumbnail and reference image)
             break;
         }
     }
     parent::save($connection);
     // Create child objects (derivatives)
     if (0 < count($this->assets) && $this->createDerivatives) {
         if (sfConfig::get('app_explode_multipage_files') && $this->getPageCount() > 1) {
             // If DO is a compound object, then create child objects and set to
             // display as compound object (with pager)
             $this->createCompoundChildren();
             // Set parent digital object to be displayed as compound
             $this->setDisplayAsCompoundObject(1);
             // We don't need reference image because a compound will be displayed instead of it
             // But thumbnails are necessary for image flow
             $this->createThumbnail($connection);
         } else {
             // If DO is a single object, create various representations based on
             // intended usage
             $this->createRepresentations($this->usageId, $connection);
         }
     }
     // Add watermark to reference image
     if (QubitTerm::REFERENCE_ID == $this->usageId && $this->isImage() && is_readable($waterMarkPathName = sfConfig::get('sf_web_dir') . '/watermark.png') && is_file($waterMarkPathName)) {
         $filePathName = $this->getAbsolutePath();
         $command = 'composite -dissolve 15 -tile ' . $waterMarkPathName . ' ' . escapeshellarg($filePathName) . ' ' . escapeshellarg($filePathName);
         exec($command);
     }
     // Update search index for related info object
     if ($this->indexOnSave) {
         if ($this->informationObjectId != $cleanInformationObjectId && null !== QubitInformationObject::getById($cleanInformationObjectId)) {
             QubitSearch::updateInformationObject(QubitInformationObject::getById($cleanInformationObjectId));
         }
         if (isset($this->informationObject)) {
             QubitSearch::updateInformationObject($this->informationObject);
         }
     }
     return $this;
 }
  <fieldset class="collapsible collapsed" id="informationObjectArea">

    <legend><?php 
echo __('Permissions by %1%', array('%1%' => sfConfig::get('app_ui_label_informationobject')));
?>
</legend>

    <?php 
if (0 < count($informationObjects)) {
    ?>
      <?php 
    foreach ($informationObjects as $informationObjectId => $permissions) {
        ?>
        <div class="form-item">
          <?php 
        echo get_component('aclGroup', 'aclTable', array('object' => QubitInformationObject::getById($informationObjectId), 'permissions' => $permissions, 'actions' => $basicActions));
        ?>
        </div>
      <?php 
    }
    ?>
    <?php 
}
?>

    <?php 
// Build dialog for adding new table
$tableTemplate = '<div class="form-item">';
$tableTemplate .= '<table id="acl_{objectId}">';
$tableTemplate .= '<caption/>';
$tableTemplate .= '<thead>';
                ?>
                  <em><?php 
                echo __('All %1%', array('%1%' => sfConfig::get('app_ui_label_informationobject')));
                ?>
</em>
                <?php 
            } elseif ('' != $repoId) {
                ?>
                  <?php 
                echo sfConfig::get('app_ui_label_repository') . ': ' . render_title(QubitRepository::getById($repoId));
                ?>
                <?php 
            } else {
                ?>
                  <?php 
                echo render_title(QubitInformationObject::getById($objectId));
                ?>
                <?php 
            }
            ?>
              </strong></td>
            </tr>
            <?php 
            $row = 0;
            ?>
            <?php 
            foreach ($actions as $action => $groupPermission) {
                ?>
              <tr class="<?php 
                echo 0 == @++$row % 2 ? 'even' : 'odd';
                ?>
 public static function renderYuiNodes($tree, $options = array())
 {
     ProjectConfiguration::getActive()->loadHelpers(array('Qubit', 'Text', 'Escaping'));
     $yuiTree = array();
     foreach ($tree as $key => $item) {
         $node = array();
         if ($item instanceof QubitInformationObject) {
             $label = render_title(new sfIsadPlugin($item));
             $node['label'] = truncate_text($label, 50);
             if (50 < strlen($label)) {
                 $node['title'] = esc_specialchars($label);
             }
             $node['href'] = sfContext::getInstance()->routing->generate(null, array($item, 'module' => 'informationobject'));
             $node['id'] = $item->id;
             $node['parentId'] = $item->parentId;
             $node['isLeaf'] = (string) (!$item->hasChildren());
             $node['moveUrl'] = sfContext::getInstance()->routing->generate(null, array($item, 'module' => 'default', 'action' => 'move'));
             $node['expandUrl'] = sfContext::getInstance()->routing->generate(null, array($item, 'module' => 'informationobject', 'action' => 'treeView'));
             if (isset($options['currentNode']) && $options['currentNode'] === $item) {
                 $node['style'] = 'ygtvlabel currentTextNode';
             }
         } else {
             $count = intval($item['total']) - intval($item['limit']);
             $node['label'] = sfContext::getInstance()->i18n->__('+%1% ...', array('%1%' => $count));
             $node['parentId'] = $item['parentId'];
             $node['href'] = sfContext::getInstance()->routing->generate(null, array(QubitInformationObject::getById($item['parentId']), 'module' => 'informationobject', 'action' => 'browse'));
             $node['isLeaf'] = 'true';
             $node['style'] = 'seeAllNode';
         }
         $yuiTree[] = $node;
     }
     return $yuiTree;
 }
 public function execute($request)
 {
     parent::execute($request);
     if ($request->hasParameter('csvimport')) {
         // if a parent ID is set, use that for parenting
         $parentId = $request->getParameter('parent', null);
         if (!empty($parentId)) {
             $request->getParameterHolder()->remove('parent');
         }
         // make sure we don't pass the import ID
         $request->getParameterHolder()->remove('id');
         $this->form->bind($request->getParameterHolder()->getAll());
         if ($this->form->isValid()) {
             $this->processForm();
             if (!empty($parentId)) {
                 $this->resource->parent = QubitInformationObject::getById($parentId);
             } else {
                 $this->resource->parent = QubitInformationObject::getById(QubitInformationObject::ROOT_ID);
             }
             $this->resource->save();
             return;
             // don't bother adding assets etc. for output
         }
     } elseif ($request->isMethod('post')) {
         $this->form->bind($request->getPostParameters());
         if ($this->form->isValid()) {
             $this->processForm();
             $this->resource->save();
             $this->redirect(array($this->resource, 'module' => 'informationobject'));
         }
     }
     QubitDescription::addAssets($this->response);
     QubitImageFlow::addAssets($this->response);
     QubitTreeView::addAssets($this->response);
 }
 public function execute($request)
 {
     ProjectConfiguration::getActive()->loadHelpers('Qubit');
     $uploadLimt = -1;
     $diskUsage = 0;
     $uploadFiles = array();
     $warning = null;
     $this->informationObject = QubitInformationObject::getById($request->informationObjectId);
     if (!isset($this->informationObject)) {
         $this->forward404();
     }
     // Check user authorization
     if (!QubitAcl::check($this->informationObject, 'update')) {
         throw new sfException();
     }
     $repo = $this->informationObject->getRepository(array('inherit' => true));
     if (isset($repo)) {
         $uploadLimit = $repo->uploadLimit;
         if (0 < $uploadLimit) {
             $uploadLimit *= pow(10, 9);
             // Convert to bytes
         }
         $diskUsage = $repo->getDiskUsage();
     }
     // Create tmp dir, if it doesn't exist already
     $tmpDir = sfConfig::get('sf_upload_dir') . '/tmp';
     if (!file_exists($tmpDir)) {
         mkdir($tmpDir);
         chmod($tmpDir, 0775);
     }
     foreach ($_FILES as $file) {
         if (null != $repo && 0 <= $uploadLimit && $uploadLimit < $diskUsage + $file['size']) {
             $uploadFiles = array('error' => $this->context->i18n->__('%1% upload limit of %2% GB exceeded for %3%', array('%1%' => sfConfig::get('app_ui_label_digitalobject'), '%2%' => round($uploadLimit / pow(10, 9), 2), '%4%' => $this->context->routing->generate(null, array($repo, 'module' => 'repository')), '%3%' => $repo->__toString())));
             continue;
         }
         // Get file extension
         $extension = substr($file['name'], strrpos($file['name'], '.'));
         // Get a unique file name (to avoid clashing file names)
         do {
             $uniqueString = substr(md5(time() . $file['name']), 0, 8);
             $tmpFileName = "TMP{$uniqueString}{$extension}";
             $tmpFilePath = "{$tmpDir}/{$tmpFileName}";
         } while (file_exists($tmpFilePath));
         // Thumbnail name
         $thumbName = "THB{$uniqueString}.jpg";
         $thumbPath = "{$tmpDir}/{$thumbName}";
         // Move file to web/uploads/tmp directory
         if (!move_uploaded_file($file['tmp_name'], $tmpFilePath)) {
             $errorMessage = $this->context->i18n->__('File %1% could not be moved to %2%', array('%1%' => $file['name'], '%2%' => $tmpDir));
             $uploadFiles = array('error' => $errorMessage);
             continue;
         }
         $tmpFileMd5sum = md5_file($tmpFilePath);
         $tmpFileMimeType = QubitDigitalObject::deriveMimeType($tmpFileName);
         if ($canThumbnail = QubitDigitalObject::canThumbnailMimeType($tmpFileMimeType) || QubitDigitalObject::isVideoFile($tmpFilePath)) {
             if (QubitDigitalObject::isImageFile($tmpFilePath) || 'application/pdf' == $tmpFileMimeType) {
                 $resizedObject = QubitDigitalObject::resizeImage($tmpFilePath, 150, 150);
             } else {
                 if (QubitDigitalObject::isVideoFile($tmpFilePath)) {
                     $resizedObject = QubitDigitalObject::createThumbnailFromVideo($tmpFilePath, 150, 150);
                 }
             }
             if (0 < strlen($resizedObject)) {
                 file_put_contents($thumbPath, $resizedObject);
                 chmod($thumbPath, 0644);
             }
             // Show a warning message if object couldn't be thumbnailed when it is
             // supposed to be possible
             if (!file_exists($thumbPath) && 0 >= filesize($thumbPath)) {
                 $warning = $this->context->i18n->__('File %1% could not be thumbnailed', array('%1%' => $file['name']));
             }
         } else {
             $thumbName = '../../images/' . QubitDigitalObject::getGenericIconPath($tmpFileMimeType, QubitTerm::THUMBNAIL_ID);
         }
         $uploadFiles = array('canThumbnail' => $canThumbnail, 'name' => $file['name'], 'md5sum' => $tmpFileMd5sum, 'size' => hr_filesize($file['size']), 'thumb' => $thumbName, 'tmpName' => $tmpFileName, 'warning' => $warning);
         // Keep running total of disk usage
         $diskUsage += $file['size'];
     }
     // Pass file data back to caller for processing on form submit
     $this->response->setHttpHeader('Content-Type', 'application/json; charset=utf-8');
     return $this->renderText(json_encode($uploadFiles));
 }