public function execute()
 {
     $url = waRequest::param('url');
     $this->album = waRequest::param('album');
     $this->hash = waRequest::param('hash');
     if (!$url) {
         throw new waException(_w('Page not found', 404));
     }
     $this->photo_model = new photosPhotoModel();
     $this->photo = $this->getPhoto($url);
     if (!$this->photo) {
         throw new waException(_w('Page not found'), 404);
     }
     $this->photo = photosPhoto::escapeFields($this->photo);
     if ($this->album && $this->album['status'] <= 0) {
         $this->album['full_url'] = photosCollection::frontendAlbumHashToUrl($this->hash);
     }
     // delegate work to special render helper
     $render_helper = new photosPhotoRenderHelper($this->photo, $this->private_hash);
     $result = $render_helper->workUp(array('album' => $this->album, 'hash' => $this->hash));
     waRequest::setParam('title', $this->photo['name']);
     waRequest::setParam('nofollow', $this->isNeedNofollow());
     waRequest::setParam('breadcrumbs', $this->getBreadcrumbs());
     waRequest::setParam('disable_sidebar', true);
     // pull out work's up result
     $this->view->assign('photo', $result['photo']);
     $this->view->assign('albums', $result['blocks']['albums']);
     $this->view->assign('tags', $result['blocks']['tags']);
     $this->view->assign('exif', $result['blocks']['exif']);
     $this->view->assign('author', $result['blocks']['author']);
     $this->view->assign('stack_nav', $result['blocks']['stack_nav']);
     $this->view->assign('photo_stream', $result['blocks']['photo_stream']);
     // if we are not in album, than $album is null
     $this->view->assign('album', $this->album);
     /**
      * Add extra widgets to photo page
      * @event frontend_photo
      * @param string[array]mixed $photo photo data
      * @return array[string][string]string $return[%plugin_id%]['bottom'] In bottom, under photo - any widget
      * @return array[string][string]string $return[%plugin_id%]['sidebar']
      * @return array[string][string]string $return[%plugin_id%]['top_left']
      * @return array[string][string]string $return[%plugin_id%]['top_right']
      */
     $this->view->assign('frontend_photo', wa()->event('frontend_photo', $this->photo));
     $version = wa()->getVersion();
     $this->getResponse()->addJs('js/common.js?v=' . $version, true);
     $this->getResponse()->addJs('js/photo.stream.slider.js?v=' . $version, true);
     $this->getResponse()->addJs('js/frontend.photo.js?v=' . $version, true);
 }
 public function execute()
 {
     $url = waRequest::param('url');
     $album = waRequest::param('album');
     $this->hash = waRequest::param('hash');
     if (!$url) {
         throw new waException(_w('Page not found', 404));
     }
     $this->photo_model = new photosPhotoModel();
     $photo = $this->getPhoto($url);
     if (!$photo) {
         throw new waException(_w('Page not found'), 404);
     }
     if (!$this->private_hash && !$this->inCollection($photo, $this->hash)) {
         throw new waException(_w('Page not found'), 404);
     }
     $photo = photosPhoto::escapeFields($photo);
     $size = waRequest::get('size', null, waRequest::TYPE_STRING);
     $is_mini = waRequest::get('mini', 0, waRequest::TYPE_INT);
     if ($is_mini) {
         $size = $size ? $size : photosPhoto::getBigPhotoSize();
         // mini version of loading photo (in albums loading photo in stack)
         $photo['thumb_custom'] = photosPhoto::getThumbInfo($photo, $size);
         $this->response['photo'] = $photo;
         return;
     }
     // delegate work to special render helper
     $render_helper = new photosPhotoRenderHelper($photo, $this->private_hash);
     $result = $render_helper->workUp(array('album' => $album, 'hash' => $this->hash, 'need_photo_stream' => false));
     if ($size) {
         $result['photo']['thumb_custom'] = photosPhoto::getThumbInfo($result['photo'], $size);
     }
     // pull out result of working up
     $this->response['photo'] = $result['photo'];
     $this->response['tags'] = $result['blocks']['tags'];
     $this->response['exif'] = $result['blocks']['exif'];
     $this->response['albums'] = $result['blocks']['albums'];
     $this->response['author'] = $result['blocks']['author'];
     $this->response['stack_nav'] = $result['blocks']['stack_nav'];
     /**
      * Add extra widgets to photo page
      * @event frontend_photo
      * @param string[array]mixed $photo photo data
      * @return array[string][string]string $return[%plugin_id%]['bottom'] In bottom, under photo - any widget
      */
     $this->response['frontend_photo'] = wa()->event('frontend_photo', $photo);
 }