Materiali realizzati durante la lezione del 21/07/2017

Abbiamo  realizzato la Classe personalizzata FbPageFeed che legge una pagina pubblica Facebook e mette il contenuto a disposizione per la visualizzazione in forma di oggetto JavaScript utilizzando AJAX (XMLAttpRequest) e JSON

FbPageFeed.js

(function(win){
  "use strict";
  function FbPageFeed(options) {
    options = options || {};
    for (var prop in this.config) {
      if (options[prop]) {
        this.config[prop] = options[prop];
      }
    }
    this.init();
  }
  
  // Configuazione dell'oggetto
  FbPageFeed.prototype.config = {
    appId: null,
    appSecret: null,
    fbService: "https://graph.facebook.com",
    fields: 'id,from,name,message,created_time,story,description,link,permalink_url,picture,object_id',
    fbPageId: null,
    callBack: null
  };
  
  // Inizializzazione dell'oggetto
  FbPageFeed.prototype.init = function() {
    var self = this;
    self.callBack = self.config.callBack;
    
    self.config.httpRequest = new XMLHttpRequest();
    self.config.httpRequest.addEventListener('load', function() {
      if(this.responseText) {
        self.response = JSON.parse(this.responseText);
      } else {
        sekf.response = {
          error: {
            message: this.statusText,
            code: this.status
          }
        }
      };
      if (typeof(self.callBack === "function")) {
        self.callBack(self.success(), self.response);
      }
    })
  };
  
  // La richiesta ha avuto successo ?
  FbPageFeed.prototype.success = function() {
    if (this.response) {
      if (this.response.data) {
        return true;
      }
    }
    return false;
  }
  
  // Recupero dell'access_token
  // Assegnando alla proprietà access_token un'altra
  // funzione posso cambiare il metodo di default 
  // con cui viene ottenuto l'access_token
  FbPageFeed.prototype.access_token = function () {
    if (this.config.appId && this.config.appSecret) {
      return this.config.appId + "|" + this.config.appSecret;
    }
    return null;
  }
  
  // Costruzione dell'url della richiesta
  FbPageFeed.prototype.feedUrl = function() {
    var addTrailingSlash = function (path) {
      if (path.substr(-1) == '/') {
        return path;
      }
      return path + '/'; 
    }
    
    var at = this.access_token();
    var self = this;
    var url = addTrailingSlash(self.config.fbService) +
        addTrailingSlash(self.config.fbPageId) + 
        'feed' + '?fields=' +
        self.config.fields +
        (at ? '&access_token=' + at : '');
    return url;
  }
  
  // Invio della richiesta e caricamento dei dati
  FbPageFeed.prototype.load = function () {
    try {
      this.response = null;
      this.config.httpRequest.open('GET', this.feedUrl());
      this.config.httpRequest.send();
    } catch (err) {
      console.log(err);
    }
  } 

  
  win.FbPageFeed = FbPageFeed;
})(window)

Pagina html che utilizza FbPageFeed per visualizzare il contenuto di una pagina Facebook. Visualizza la pagina.

fb-test.html

<!doctype html>

<html>

<head>
  <title>Page Title</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="initial-scale=1.0">
  <link href="css/bootstrap.min.css" rel="stylesheet">
  <link href="css/miostile.css" rel="stylesheet">
</head>

<body>
  <header class="jumbotron bg-sfumato">
    <div class="container">
      <h1>Facebook Page Feed</h1>
    </div>
  </header>
  <div class="container">
    <div class="row">
      <div class="col-sm-10 form-group">
        <input type="text" id="fb-pageid" class="form-control input-lg" placeholder="Pagina facebook da mostrare">
      </div>
      <div class="col-sm-2 form-group">
        <button id="test" type="button" class="btn btn-lg btn-primary btn-block">test</button>
      </div>
    </div>
  </div>
  <div class="container">
    <h1>Output</h1>
    <div id="test-output">
      <div class="row">
        <div class="col-md-6">
          <div class="row">
            <div class="col-sm-6">
              <div class="row slim hidden" id="post0">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
            <div class="col-sm-6">
              <div class="row slim hidden" id="post1">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6">
          <div class="row">
            <div class="col-sm-6">
              <div class="row slim hidden" id="post2">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
            <div class="col-sm-6">
              <div class="row slim hidden" id="post3">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="row">
        <div class="col-md-6">
          <div class="row">
            <div class="col-sm-6">
              <div class="row slim hidden" id="post4">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
            <div class="col-sm-6">
              <div class="row slim hidden" id="post5">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6">
          <div class="row">
            <div class="col-sm-6">
              <div class="row slim hidden" id="post6">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
            <div class="col-sm-6">
              <div class="row slim hidden" id="post7">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="row">
        <div class="col-md-6">
          <div class="row">
            <div class="col-sm-6">
              <div class="row slim hidden" id="post8">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
            <div class="col-sm-6">
              <div class="row slim hidden" id="post9">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div class="col-md-6">
          <div class="row">
            <div class="col-sm-6">
              <div class="row slim hidden" id="post10">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
            <div class="col-sm-6">
              <div class="row slim hidden" id="post11">
                <div class="col-xs-4">
                  <div class="picture h3" style="background-image:url(https://unsplash.it/130/90)"></div>
                </div>
                <div class="col-xs-8">
                  <h3 class="post-date">21-3-2017</h3>
                  <p class="post-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis eaque doloribus vitae in qui, cumque praesentium.</p>
                  <a href="#" class="btn btn-primary btn-xs is-post">post</a>
                  <a href="#" class="btn btn-primary btn-xs is-link">link</a>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>

    </div>
  </div>

  <script src="js/estensioni.js"></script>
  <script src="js/FbPageFeed.js"></script>
  <script>
    var opt = {
      appId: '287180921751313',
      appSecret: '33a1febcc4d1ce4d947828635cfe3d83',
      fbPageId: 'palazzonadimaggio',
      callBack: function (success, resp) {
        if (success) {
          var arr = resp.data;
          if (arr) {
            for (var i = 0; i < 12; i++) {
              var panelId = 'post' + i;
              var obj = arr[i];
              var panel = document.getElementById(panelId);
              var pic = panel.querySelector('.picture');
              var postBody = panel.querySelector('.post-body');
              if (obj) {
                var data = new Date(obj.created_time);
                pic.style.backgroundImage = 'url(\"' + obj.picture + '\")';
                panel.querySelector('.post-date').innerHTML = data.toDataItaliana('dd/mm/aaaa') +
                  '<br><small>ore ' + data.toTimeFormatted('hh:mm');
                postBody.innerHTML = obj.message || obj.story || obj.name;
                postBody.classList.add('sized');
                panel.querySelector('.is-post').href = obj.permalink_url;
                if (obj.link == obj.permalink_url) {
                  panel.querySelector('.is-link').classList.add('hidden');
                } else {
                  panel.querySelector('.is-link').classList.remove('hidden');
                  panel.querySelector('.is-link').href = obj.link;
                }
                panel.classList.remove('hidden');
              } else {
                panel.classList.add('hidden');
              }
            }
          } else {
            alert(data.error.message);
          }
        }
      }
    };
    var fb = new FbPageFeed(opt);
    fb.load();
    var pb = document.getElementsByClassName('post-body');
    for (var i = 0; i < pb.length; i++) {
      pb[i].addEventListener('click', function() {
        this.classList.toggle('sized');
      })
    }
    // Ho completato il codice aggiungendo le istruzioni che modificano interattivamente 
    // la pagina Facebook visualizzata
    
    document.getElementById('test').addEventListener('click', function () {
      fb.config.fbPageId = document.getElementById('fb-pageid').value;
      fb.load();
    })
  </script>
</body>

</html>

Infine il foglio di stile comune a tutte le pagine web con le modifica apportate nelle ultime lezione del corso.

miostile.css

.bg-darkblue {
  background-color: darkblue;
  color: white;
}

.bg-sfumato {
  background-image: -webkit-gradient(linear,left top, left bottom,from(#000033),to(#800));
  background-image: -webkit-linear-gradient(#000033,#800);
  background-image: linear-gradient(#000033,#800);
  color: white;
}

.fullscreen {
  min-height: 100vh;
  margin-bottom: 0;
}

.jumbotron .page-header {
  margin-top: 0;
  padding-bottom: 50px;
}

.off.dissolvenza {
  opacity: 0;
}

.dissolvenza {
  opacity: 1;
  -webkit-transition: all 0.7s;
  transition: all 0.7s;
}

.off.rotazione {
  opacity: 0;
  -webkit-transform: rotate(-180deg);
  -ms-transform: rotate(-180deg);
  transform: rotate(-180deg);
}
.rotazione {
  opacity: 1;
  -webkit-transform: rotate(0);
  -ms-transform: rotate(0);
  transform: rotate(0);
  -webkit-transition: all 0.5s;
  transition: all 0.5s;
}

.off.zoom {
  -webkit-transform: scale(0.1, 0.1);
  -ms-transform: scale(0.1, 0.1);
  transform: scale(0.1, 0.1);
  opacity: 0;
}
.zoom {
  -webkit-transform: scale(1, 1);
  -ms-transform: scale(1, 1);
  transform: scale(1, 1);
  opacity: 1;
  -webkit-transition: all 1s;
  transition: all 1s;
}

.off.slide {
  -webkit-transform: translateY(-20%);
  -ms-transform: translateY(-20%);
  transform: translateY(-20%);
  opacity: 0;
}
.slide {
  -webkit-transform: translateY(0);
  -ms-transform: translateY(0);
  transform: translateY(0);
  opacity: 1;
  -webkit-transition: all .7s;
  transition: all .7s;
}

/* Interruttore */

.interruttore {
  border:0;
  background-image: url(/img/on-off.png);
  background-position: top left;
  width: 80px;
  height: 80px;
  border-radius: 50%;
  -webkit-box-shadow: #000 0 0 10px;
  box-shadow: #000 0 0 10px;
  margin: 10px;
}

.interruttore:focus {
  outline: 0;
}

.interruttore.on {
  background-position: toin-right: -5px;
  -webkit-box-shadow: #400 0 0 10px;
  box-shadow: #400 0 0 10px;
}

.btn-history {
  margin-top: 40px;
  border-radius: 20px;
}

.row.slim {
  margin-left: -5px;
  margin-right: -5px;
}

.row.slim [class^="col-"] {
  padding-left: 5px;
  padding-right: 5px;
}

.row.slim .picture {
  padding-bottom: 100%;
  background-size: cover;
  border-radius: 50%;
}

.post-body {
  overflow: hidden;
  position: relative;
  cursor: pointer;
}

.post-body.sized {
  height: 60px;
}

.post-body.sized::after {
  position: absolute;
  display: block;
  bottom: 0;
  left: 0;
  right: 0;
  content:"";
  height: 30px;
  background-image: linear-gradient(rgba(255,255,255,0),rgba(255,255,255,1));
}

.side-menu {
  position: fixed;
  top: 20vh;
  right: 0;
  min-height: 300px;
  transition: all 0.7s;
}

.side-menu .btn-menu {
  border-radius: 0;
  background-color: black;
  color: white;
  padding: 10px;
  display:block;
  float: left;
}

.side-menu .form {
  background-color: black;
  color: white;
  padding: 20px;
  min-height: 300px;
  width: 270px;
  float: left;
}

.side-menu.offscreen {
  transition: all 0.7;
  right: -270px;
}

.selezionato {
  background-color: yellow;
  border: 1px red solid;
}

 

Torna all'inizio