/**
  * If the current version number is not set, it looks in DB
  * else it takes it from the static property current_version.
  * TODO: compare it with a document_id, because current_version is only independent from same document
  */
 public static function getCurrentVersionNb($id, $lang)
 {
     if (!isset(self::$current_version)) {
         self::$current_version = Document::getCurrentVersionNumberFromIdAndCulture($id, $lang);
     }
     return self::$current_version;
 }
 public function executeView()
 {
     parent::executeView();
     // add editor + code for in map title
     if (!$this->document->isArchive() && $this->document['redirects_to'] == NULL) {
         $related_portals = array();
         Portal::getLocalPortals($related_portals, $this->associated_areas);
         $this->related_portals = $related_portals;
         $map_editors_list = sfConfig::get('mod_maps_editors_list');
         $title = $this->__($map_editors_list[$this->document->get('editor')]) . ' ' . $this->document->get('code') . ' ' . $this->document->get('name') . ' :: ' . $this->__(substr($this->getModuleName(), 0, -1));
         $this->setPageTitle($title);
     }
 }
 /**
  * Executes list action
  */
 public function executeList()
 {
     parent::executeList();
     $nb_results = $this->nb_results;
     if ($nb_results == 0) {
         return;
     }
     $timer = new sfTimer();
     $products = $this->query->execute(array(), Doctrine::FETCH_ARRAY);
     c2cActions::statsdTiming('pager.getResults', $timer->getElapsedTime());
     $timer = new sfTimer();
     Parking::addAssociatedParkings($products, 'pf');
     // add associated parkings infos to $products
     c2cActions::statsdTiming('parking.addAssociatedParkings', $timer->getElapsedTime());
     Area::sortAssociatedAreas($products);
     $this->items = Language::parseListItems($products, 'Product');
 }
 /**
  * Executes view action.
  */
 public function executeView()
 {
     parent::executeView();
     if (!$this->document->isArchive() && $this->document['redirects_to'] == NULL) {
         $user = $this->getUser();
         $prefered_cultures = $user->getCulturesForDocuments();
         $this->associated_summits = Summit::getAssociatedSummitsData($this->associated_docs);
         $this->associated_routes = Route::getAssociatedRoutesData($this->associated_docs, $this->__(' :') . ' ');
         $this->associated_huts = Hut::getAssociatedHutsData($this->associated_docs);
         $this->associated_sites = Site::getAssociatedSitesData($this->associated_docs);
         // add linked docs areas
         $parent_ids = array();
         $associated_areas = array();
         if (count($this->associated_docs)) {
             foreach ($this->associated_docs as $doc) {
                 $parent_ids[] = $doc['id'];
             }
             $associated_areas = GeoAssociation::findAreasWithBestName($parent_ids, $prefered_cultures);
         }
         $this->associated_areas = $associated_areas;
         $cas = count($this->associated_summits);
         $car = count($this->associated_routes);
         $cah = count($this->associated_huts);
         $cab = count($this->associated_sites);
         $this->section_list = array('summits' => $cas != 0, 'routes' => $car != 0, 'huts' => $cah != 0, 'sites' => $cab != 0, 'docs' => $cas + $car + $cah + $cab == 0);
         $related_portals = array();
         $activities = $this->document->get('activities');
         $book_types = $this->document->get('book_types');
         Portal::getRelatedPortals($related_portals, $this->associated_areas, $this->associated_routes, $activities);
         if (array_intersect(array(1, 4, 10, 14, 18), $book_types) && in_array(5, $activities) && !in_array('ice', $related_portals)) {
             $related_portals[] = 'ice';
         }
         $this->related_portals = $related_portals;
         $description = array($this->__('book') . ' :: ' . $this->document->get('name'), $this->getActivitiesList());
         $this->getResponse()->addMeta('description', implode(' - ', $description));
     }
 }
 public function executeView()
 {
     parent::executeView();
     if (!$this->document->isArchive() && $this->document['redirects_to'] == NULL) {
         // get last geo-associated outings
         $current_doc_id = $this->getRequestParameter('id');
         $latest_outings = array();
         $nb_outings = 0;
         $outing_params = array('areas' => $current_doc_id);
         $nb_outings = sfConfig::get('app_nb_linked_outings_areas');
         $latest_outings = Outing::listLatest($nb_outings + 1, array(), array(), array(), $outing_params, false);
         $latest_outings = Language::getTheBest($latest_outings, 'Outing');
         $this->latest_outings = $latest_outings;
         $this->nb_outings = $nb_outings;
         $related_portals = array();
         $id = $this->getRequestParameter('id');
         $areas = array(array('id' => $id));
         Portal::getLocalPortals($related_portals, $areas);
         $this->related_portals = $related_portals;
         $area_types_list = sfConfig::get('mod_areas_area_types_list');
         $title = $this->document->get('name') . ' :: ' . $this->__($area_types_list[$this->document->get('area_type')]);
         $this->setPageTitle($title);
     }
 }
 /**
  * Executes list action, adding parkings linked to routes
  */
 public function executeList()
 {
     parent::executeList();
     $nb_results = $this->nb_results;
     if ($nb_results == 0) {
         return;
     }
     $timer = new sfTimer();
     $routes = $this->query->execute(array(), Doctrine::FETCH_ARRAY);
     c2cActions::statsdTiming('pager.getResults', $timer->getElapsedTime());
     // if they are criterias on the summit (snam, srnam, salt, styp)
     // we might have only some of the associated summits and not the 'best one' (ticket #337)
     // so we must add a new request to get the summits, display the best one and add a note to explain that the
     // other summit is associated
     // FIXME would be nice to put all in a single request (before), but I didn't manage to do it
     // TODO not working right now
     //if ($this->hasRequestParameter('snam') || $this->hasRequestParameter('srnam') ||
     //    $this->hasRequestParameter('salt') || $this->hasRequestParameter('styp'))
     //{
     // $routes = Route::addBestSummitName($routes, '');
     //}
     $timer = new sfTimer();
     Parking::addAssociatedParkings($routes, 'pr');
     // add associated parkings infos to $routes
     c2cActions::statsdTiming('parking.addAssociatedParkings', $timer->getElapsedTime());
     $timer = new sfTimer();
     Document::countAssociatedDocuments($routes, 'ro', true);
     // number of associated outings
     c2cActions::statsdTiming('document.countAssociatedDocuments', $timer->getElapsedTime());
     Area::sortAssociatedAreas($routes);
     $this->items = Language::parseListItems($routes, 'Route');
 }
 /**
  * Executes edit action.
  */
 public function executeEdit()
 {
     $id = $this->getRequestParameter('id');
     $user = $this->getUser();
     $is_moderator = $user->hasCredential(sfConfig::get('app_credentials_moderator'));
     //    FIXME : only moderators can edit a portal, waiting for correct edition right management :
     //      - for common portals, the members con edit only text fields, and data fields are editable only by moderators
     //      - for cda portal, the moderators only can edit it
     //    $cda_config = sfConfig::get('app_portals_cda');
     //    if ($is_moderator || $id != $cda_config['id'])
     if ($is_moderator) {
         parent::executeEdit();
     } else {
         return $this->ajax_feedback('You do not have enough credentials to perform this operation');
     }
 }
 /**
  * Executes list action, adding ratings from routes linked to outings
  */
 public function executeList()
 {
     // redirect to user outings list if connected and if myoutings criteria is set
     if ($this->getUser()->isConnected() && $this->getRequestParameter('myoutings')) {
         sfLoader::loadHelpers(array('Pagination'));
         $user_id = $this->getUser()->getId();
         $this->redirect(_addUrlParameters(_getBaseUri(), array('myoutings'), array('users' => $user_id)));
     }
     // TODO something to do if outings where filtered on route ratings?
     parent::executeList();
     $format = $this->format;
     if (in_array('cond', $format) && !in_array('json', $format)) {
         $this->setTemplate('conditions');
         if (in_array('full', $format)) {
             $this->setPageTitle($this->__('conditions and comments'));
         } else {
             $this->setPageTitle($this->__('recent conditions'));
         }
     }
     $nb_results = $this->nb_results;
     if ($nb_results == 0) {
         return;
     }
     $show_images = $this->show_images;
     $timer = new sfTimer();
     $outings = $this->query->execute(array(), Doctrine::FETCH_ARRAY);
     c2cActions::statsdTiming('pager.getResults', $timer->getElapsedTime());
     $timer = new sfTimer();
     $outings = Outing::getAssociatedCreatorData($outings);
     // retrieve outing creator names
     c2cActions::statsdTiming('outing.getAssociatedCreatorData', $timer->getElapsedTime());
     $timer = new sfTimer();
     $outings = Outing::getAssociatedRoutesData($outings);
     // retrieve associated route ratings
     c2cActions::statsdTiming('outing.getAssociatedRoutesData', $timer->getElapsedTime());
     if (!in_array('list', $format)) {
         $timer = new sfTimer();
         $outings = Language::getTheBestForAssociatedAreas($outings);
         c2cActions::statsdTiming('language.getTheBestForAssociatedAreas', $timer->getElapsedTime());
     }
     // add images infos
     if ($show_images) {
         $timer = new sfTimer();
         Image::addAssociatedImages($outings, 'oi');
         c2cActions::statsdTiming('image.addAssociatedImages', $timer->getElapsedTime());
     }
     Area::sortAssociatedAreas($outings);
     $this->items = Language::parseListItems($outings, 'Outing', !$show_images);
 }
 /**
  * Executes delete action
  * Checks if there are some associated routes with only this summit.
  * If not, then call the parent default delete action. 
  * If yes, calls error and redirect
  */
 public function executeDelete()
 {
     $referer = $this->getRequest()->getReferer();
     if ($id = $this->getRequestParameter('id')) {
         // Get all associated documents
         $associated_docs = Association::findAllAssociatedDocs($id, array('id', 'module'));
         if ($associated_docs) {
             // Initialise the list of routes only associated to this summit
             $single_summit_route_list = array();
             // Check if any associated doc is a route
             foreach ($associated_docs as $doc) {
                 if ($doc['module'] == 'routes') {
                     // if we found an associated route, check if it is associated to several summits
                     $route_associated_docs = Association::findAllAssociatedDocs($doc['id'], array('id', 'module'));
                     if ($route_associated_docs) {
                         // Check if any associated doc to the route is a summit different from the one we want to delete
                         $multiple_summit = False;
                         foreach ($route_associated_docs as $route_associated_doc) {
                             // There's an associated summit which is different from the one we want to delete
                             if ($route_associated_doc['module'] == 'summits' && $route_associated_doc['id'] != $id) {
                                 $multiple_summit = True;
                                 break;
                             }
                         }
                         if (!$multiple_summit) {
                             // this route has only one summit: the one we want to delete
                             $single_summit_route_list[] = $doc['id'];
                         }
                     } else {
                         // shouldn't reach here, as the route we found should at least be associated to the summit that should (or not) be deleted
                         $this->setErrorAndRedirect('Document could not be deleted', $referer);
                     }
                 }
             }
             if (!empty($single_summit_route_list)) {
                 // If we found an associated route which has only one summit, we do not delete the summit
                 $this->setErrorAndRedirect('Document could not be deleted because there would be orphean routes%1%', $referer, array('%1%' => '<li><ul>' . implode('</ul><ul>', $single_summit_route_list) . '</ul></li>'));
             }
         }
         // If we reach here, then either there were no associated docs, or none of them was a route.
         parent::executeDelete();
     } else {
         $this->setErrorAndRedirect('Could not understand your request', $referer);
     }
 }
 public function executePopup()
 {
     $id = $this->getRequestParameter('id');
     // if user is not connected, we don't want to display user's popup
     if (!$this->getUser()->isConnected() && !UserPrivateData::hasPublicProfile($id)) {
         $this->raw = $this->getRequestParameter('raw', false);
         if ($this->raw) {
             $this->setLayout(false);
         }
         // deactivate automatic inclusion of js and css files by symfony
         $response = $this->getResponse();
         $response->setParameter('javascripts_included', true, 'symfony/view/asset');
         $response->setParameter('stylesheets_included', true, 'symfony/view/asset');
         $this->setCacheControl();
         // we call users/popupError template
         return sfView::ERROR;
     } else {
         parent::executePopup();
     }
 }
 /**
  * Executes list action
  */
 public function executeList()
 {
     parent::executeList();
     $nb_results = $this->nb_results;
     if ($nb_results == 0) {
         return;
     }
     $timer = new sfTimer();
     $parkings = $this->query->execute(array(), Doctrine::FETCH_ARRAY);
     c2cActions::statsdTiming('pager.getResults', $timer->getElapsedTime());
     $timer = new sfTimer();
     Document::countAssociatedDocuments($parkings, 'pr', true);
     c2cActions::statsdTiming('document.countAssociatedDocuments', $timer->getElapsedTime());
     Area::sortAssociatedAreas($parkings);
     $this->items = Language::parseListItems($parkings, 'Parking');
 }
 protected function doMerge($from_id, $document_from, $to_id, $document_to)
 {
     // fetch associated documents before doing the merging as associations will be transferred
     $associations = Association::findAllAssociations($from_id);
     parent::doMerge($from_id, $document_from, $to_id, $document_to);
     // search documents in which from is inserted, and replace the insertion with to
     foreach ($associations as $a) {
         $check_id = $a['main_id'] == $from_id ? $a['linked_id'] : ($check_id = $a['main_id']);
         $check_model = c2cTools::Letter2Model(substr($a['type'], 0, 1));
         $check_module = c2cTools::Model2Module($check_model);
         $check_doc = Document::find($check_model, $check_id);
         $fields = sfConfig::get('mod_images_bbcode_fields_' . $check_module);
         // clear linked doc cache
         $this->clearCache($check_module, $check_id);
         $languages = $check_doc->getLanguages();
         foreach ($languages as $language) {
             $modified = false;
             $conn = sfDoctrine::Connection();
             $conn->beginTransaction();
             $check_doc->setCulture($language);
             foreach ($fields as $field) {
                 $text = $check_doc[$field];
                 $edited = preg_replace('#(\\[img=\\s*)' . $from_id . '([\\w\\s]*\\].*?\\[/img\\])\\n?#is', '${1}' . $to_id . '${2}', $text);
                 $edited = preg_replace('#(\\[img=\\s*)' . $from_id . '([\\w\\s]*\\/\\])\\n?#is', '${1}' . $to_id . '${2}', $edited);
                 if ($edited != $text) {
                     $modified = true;
                     $check_doc->set($field, $edited);
                 }
             }
             if ($modified) {
                 $history_metadata = new HistoryMetadata();
                 $history_metadata->setComment('Updated image tags');
                 $history_metadata->set('is_minor', true);
                 $history_metadata->set('user_id', sfConfig::get('app_moderator_user_id'));
                 $history_metadata->save();
                 c2cTools::log('After merge of image ' . $from_id . ' into ' . $to_id . ': update image tag for ' . strtolower($check_model) . ' ' . $check_id . ' (' . $language . ')');
                 $check_doc->save();
                 $conn->commit();
             } else {
                 $conn->rollback();
             }
         }
     }
     // clear images lists and whatsnew cache
     $this->clearCache('images', 0, true);
 }
 protected function endEdit()
 {
     if ($this->success) {
         // create also association with current user (only if this is a personal article)
         if ($this->new_document && $this->document->get('article_type') == 2) {
             $user_id = $this->getUser()->getId();
             $uc = new Association();
             $uc->doSaveWithValues($user_id, $this->document->get('id'), 'uc', $user_id);
             // main, linked, type
         }
         parent::endEdit();
         // redirect to document view
     }
 }