Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

All other Modules

Discuss all other Modules here.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

SS3 (3.02) Flickr Photoset && Custom Pagination (page/1, page/2, …)


Reply

593 Views

Avatar
nantoga

23 November 2012 at 9:12am (Last edited: 25 November 2012 2:16am), Community Member, 6 Posts

The flickr module from SS2.x is still working in SS3 but it creates some error output in SS3 (dev-mode enabled) due to some depreciated function calls. Therefore I created my own Pagetype to display Photosets.

As I received some feedback from this forum to create the page I will share the outcome in order to give back a little bit. It is a good starting point for beginners such as me to use the RestfulService together with flickr. You need to adapt the script to your own needs.

At the same time I would like to ask more experienced Silverstripe-Users to give feedback how this page could be further improved as I think a lot of users might be interested in flickr integration in Silverstripe 3. Especially it was very difficult to figure out how to create subpages page/1 page/2 … page/x. Finally it turned out to be simple but I couldn't find proper documentation on this topic at all. Thankfully there were some postings in the Forum.

****************
FlickrFotoSet.php

<?php

/* ------------------------------------------------------------------
* ------------------------------------------------------------------
* MODEL V20121124
* Compatible: Silverstripe 3.0+
* ------------------------------------------------------------------
*/

class FlickrFotoSet extends Page {

   public static $db = array(
      'flickr_api_key' => 'Varchar', // API-Key
      'flickr_photoset_id' => 'Varchar', // Photoset-ID
      'flickr_fotos_per_page' => 'Int', // Images per Page
      'flickr_bildgroesse' => 'Varchar', // Flickr Imagesize: Flicker stores the images in different sizes
      'PaginationPrefix' => 'Varchar', // Prefix Symbol for Pagination [1][2] (1)(2) etc.
      'PaginationSuffix' => 'Varchar' // Suffix Symbol for Pagination
   );
   
   
   public static $has_one = array(
   );   

   /* ------------------------------------------------------------------ */   
public function getCMSFields() {
$fields = parent::getCMSFields();
      $fields->addFieldToTab('Root.Main', new TextField('flickr_api_key'), 'Content');
      $fields->addFieldToTab('Root.Main', new TextField('flickr_photoset_id'), 'Content');
      $fields->addFieldToTab('Root.Main', new NumericField('flickr_fotos_per_page'), 'Content');
      
      $dropdownFlickrBildgroesse = new DropdownField(
         $name ='flickr_bildgroesse',
         $title ='flickr_bildgroesse',
         $source = array('small' => 'small size (flickr image suffix: _n)','medium' => 'medium size (flickr image suffix: _z)','large' => 'large size (flickr image suffix: _c)'),
         $form = null
         );
      $dropdownFlickrBildgroesse->setEmptyString('Select flickr image extension...');
      
      $fields->addFieldToTab('Root.Main', $dropdownFlickrBildgroesse,'Content');
      
      $tfPrefix = new TextField(
         $name = 'PaginationPrefix',
         $title = 'Prefix for Page Numbers (Pagination)'
         );
      $tfPrefix->setMaxLength(1);
      $fields->addFieldToTab('Root.Main', $tfPrefix, 'Content');
      
      $tfSuffix = new TextField(
         $name = 'PaginationSuffix',
         $title = 'Suffix for Page Numbers (Pagination)'
         );
      $tfSuffix->setMaxLength(1);      
      $fields->addFieldToTab('Root.Main', $tfSuffix, 'Content');
      
      $fields->removeFieldFromTab("Root.Main","Content"); // Remove Content Field
return $fields;
} // end getCMSFields

} // end class

/* ------------------------------------------------------------------
* ------------------------------------------------------------------
* CONTROLLER V20121124
* Compatible: Silverstripe 3.0+
* ------------------------------------------------------------------
*/

class FlickrFotoSet_Controller extends Page_Controller {

   private $CurrentPage = 1;
   private $Seitenanzahl = 0;
   private $Bilderanzahl = 0;
   private $HTMLPaginierung = '';
   
   private $Photos;
   private $Pagination;
   
   /* In order to create subpage urls such as page/1, page/2, page/3, … page/X509_PURPOSE_ANY
    * you need to allow an url action in this case 'page'
    * The action will trigger a function by the same name 'page'
    */
   public static $allowed_actions = array (
      'page' => 'page'
   );
   function page($link) {
       if(is_numeric($this->urlParams['ID'])) {$pagenr = $this->urlParams['ID'];}
      $this->CurrentPage = intval($pagenr);
      return $this->renderWith(array('FlickrFotoSet', 'Page'));
   }

   /* ------------------------------------------------------------------
    * Private Functions
   */

   /* ------------------------------------------------------------------ */
   

   /* ------------------------------------------------------------------ */
   private function getArrayFromResult($results) {
      $result = new ArrayList(); // Ergebnis wird in einem Array gespeichert

      foreach($results as $photo){
         // Handelt es sich bei dem Foto um ein Querformat?
         $Querformat = ($photo->height_m >= $photo->width_m) ? false : true;

         // Bildendungen bei Flickr abhängig von der Bildgröße
         switch($this->flickr_bildgroesse) {
         case ('small'):
            $Bildsuffix = "_n";
            break;
         case ('medium'):
            $Bildsuffix = "_z";
            break;
         case ('large'):
            $Bildsuffix = "_c";
            break;
         default:
            $Bildsuffix = "_c";
         } // end switch
         

         // Pfade zusammenbauen
         $Dateipfad = 'http://farm' .$photo->farm .".staticflickr.com/" . $photo->server . "/" . $photo->id . "_" . $photo->secret . $Bildsuffix . '.jpg';
         $LinkFlickrPhotostream = 'http://www.flickr.com/photos/' . $photo->pathalias . '/' . $photo->id . '/in/photostream';
         $Bildunterschrift = htmlentities($photo->title);
      
         // Folgende Variablen können im Template ausgelesen werden:
         $result->push(new ArrayData(array(
               "Querformat" => $Querformat,
               "Dateipfad" => $Dateipfad,
               "LinkFlickrPhotostream" => $LinkFlickrPhotostream,
               "Bildunterschrift" => $Bildunterschrift,
               "Latitude" => $photo->latidude,
               "Longitude" => $photo->longitude,
               "Bildbreite" => $photo->width_m,
               "Bildhoehe" => $photo->height_m,
               "Tag"=> $photo->tags,
               "error"=>0
               )));
         
      } // end foreach
      $this->Photos = $result;
      return $result;   
   } // end getArrayFromResult

   
   /* ------------------------------------------------------------------ */
   private function setPaginationValues($paginierung) {
      $result = new ArrayList(); // Ergebnis wird in einem Array gespeichert
      $HTMLPaginierung = '';
      foreach($paginierung as $page) {
         $Seitenanzahl = intval($page->pages); // Total amount of pages
         $Bilderanzahl = intval($page->total); // Total amount of images
         $CurrentPage = intval($page->page); // Current page
      } // end foreach
      if ($Seitenanzahl != 1) {
         for($i=1; $i <= $Seitenanzahl ; $i++){
            if ($i == $CurrentPage) {
               $HTMLPaginierung .= '<span class="currentPage">' . $this->PaginationPrefix . $i . $this->PaginationSuffix . '</span>';
            } else {
               $current_url = Controller::curr()->Link();
               $HTMLPaginierung .= '<span class="Page">' . $this->PaginationPrefix . '<a href="' .$current_url . 'page/' . $i . '">' . $i . '</a>' . $this->PaginationSuffix . '</span>';
            }
         }
      }
      $HTMLPaginierung .= ' (' . $Bilderanzahl . ' Bilder)';
      
      
      $this->Seitenanzahl = $Seitenanzahl;
      $this->Bilderanzahl = $Bilderanzahl;
      $this->CurrentPage = $CurrentPage;
      $this->HTMLPaginierung = $HTMLPaginierung;

      return 0;
   }

   /* ------------------------------------------------------------------ */
   private function getFlickr_Fotoset($page) {   
   
      // Restful-Service-Pfad festlegen:
      $flickr = new RestfulService('http://www.flickr.com/services/rest/');
      
      // Parameter für die Abfrage
      $params = array(
         'method' => 'flickr.photosets.getPhotos',
         'photoset_id' => $this->flickr_photoset_id,
         'per_page' => $this->flickr_fotos_per_page,
         'page' => $page,
         'api_key' => $this->flickr_api_key,
         'media' => 'photos',
         'extras' => 'license, date_upload, date_taken, owner_name, icon_server, original_format, last_update, geo, tags, machine_tags, o_dims, views, media, path_alias, url_sq, url_t, url_s, url_m, url_o'
      );   
      $flickr->setQueryString($params);
      
      // Request senden
      $response = $flickr->request();   
      // Check for Error (200 = OK)
      $status = $response->getstatusCode();
      if ($status == 200) {
         // Daten zu den einzelnen Bildern auslesen:
         $fotos = $this->getArrayFromResult($flickr->getAttributes($response->getBody(), 'photoset', 'photo'));
         // Seitenzahlen auslesen:
         $paginierung = $this->setPaginationValues($flickr->getAttributes($response->getBody(), 'photoset'));
      }
      else {
         Debug::show('Flickr Service Error. API-Key wrong, Service not reached...');
         $error_message = new ArrayList();
         $error_message->push(new ArrayData(array(
               "error" => 1
               )));
         return $error_message;
         }
      return $fotos;
   } // end getFlickr_Fotoset

   /* ------------------------------------------------------------------ */
   private function getFlickr_Pagination($page) {   
      $result = new ArrayList(); // Ergebnis wird in einem Array gespeichert
      $result->push(new ArrayData(array(
         "Seitenanzahl" => $this->Seitenanzahl,
         "Bilderanzahl" => $this->Bilderanzahl,
         "CurrentPage" => $this->CurrentPage,
         "Paginierung" => $this->HTMLPaginierung
         )));
      $this->Pagination = $result;
      return $result;      
   }

      
   
   /* ------------------------------------------------------------------
    * Public functions
   */
   
   /* ------------------------------------------------------------------ */
   public function init() {
      parent::init();   

   } // end init

   /* ------------------------------------------------------------------ */   
   public function getPhotos() {
      $this->getFlickr_Fotoset($this->CurrentPage);
      return $this->Photos;
   } // end FlickrFotoset
   
   public function getPagination() {
      $this->getFlickr_Pagination($this->CurrentPage);
      return $this->Pagination;
   } // end FlickrPaginierung

   
} // end class

?>

****************
FlickrFotoSet.ss

<div class="content-container">   
   <div class="content">
      <div class="FlickrFotoset">
         <% loop getPhotos %>
            <% if $error = 0 %>
               <article>
               <p class="FlickrFoto"><a href="{$LinkFlickrPhotostream}"><img <% if Querformat %>class="FlickrFotoQuerformat" <% else %>class="FlickrFotoHochformat" <% end_if %>src="{$Dateipfad}" alt="{$Bildunterschrift}"></a></p>
               <p class="FlickrBildunterschrift"><a href="{$LinkFlickrPhotostream}">{$Bildunterschrift}</a> <%--<%if $Tag %>#<% end_if %>{$Tag}--%></p>
               </article>
            <% else %>
               <p class="FlickrBildunterschrift"><% _t('FLICKR_ERROR','www.flickr.com: API Service not available. Please try again later.') %></p>
            <% end_if %>
         <% end_loop %>
            <p id="Paginierung">
               <% loop getPagination %>
                  {$Paginierung}
               <% end_loop %>
            </p>
      </div> <!-- end FlickrPhotoset -->
   <p>$Fusszeile</p>
   </div> <!-- end content -->
</div> <!-- end content-container -->