Removendo a pasta public da sua aplicação Zend Framework

A primeira coisa que questionei quando iniciei os estudos do Zend Framework foi como colocar a sua aplicação dentro de uma pasta em um site já estruturado, uma vez que as pastas principais devem estar abaixo da pasta public_html do seu site. Um outro problema que encontrava era aparecer no endereço o nome da pasta public, por exemplo, http://localhost/app-de-teste/public/controller/action

A solução é bem simples.

  1. Remova o conteúdo da pasta public e jogue na pasta root. Se estiver iniciando com a sua aplicação deve haver somente um arquivo index.php
  2. Abra esse arquivo e na linha:
    defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

    altere para:

    defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));
  3. Crie um arquivo .htaccess na raiz do seu diretório e insira esta expressão regular:
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule !.(js|gif|jpg|png|css|txt)$ index.php?rt=$1 [L,QSA]

O que é feito com tudo isso? A alteração do caminho que é necessário para sua aplicação rodar e o segundo permite que se acessem arquivos (-f) e diretórios (-d) caso existam.

Criando um app em PHP para postar fotos na timeline do usuário do Facebook

A primeira coisa a fazer quando se vai trabalhar com o Facebook é buscar a versão do SDK mais recente, seja ele em PHP ou Javascript, e incluir em seu código.

require 'src/facebook.php';

Em seguida inclua o Id e o App Secret fornecidos no cadastramento da sua aplicação no Facebook. Não tratarei deste cadastro aqui pois é muito simples e com uma rápida pesquisa surgem milhares de resultados.

$appId = 'XXXXXXXX';
$appSecret = 'XXXXXXXXXX';

Cria o objeto, executa a classe e testa a conexão com o usuário:

$facebook = new Facebook(array('appId' => $appId, 'secret' => $appSecret));
$user = $facebook->getUser();
if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

Se o usuário não estiver logado, dê a oportunidade:

if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
  /* Esse escopo pode ser bem menor, utilize de acordo com a sua necessidade */
  $loginUrl = $facebook->getLoginUrl(array('scope' => 'read_stream,user_website,user_videos,user_status,user_religion_politics,user_relationship_details,user_relationships,user_questions,user_photos,user_notes,user_location,user_likes,user_interests,user_groups,user_events,user_education_history,user_checkins,user_activities,email,offline_access,publish_stream,user_birthday,user_location,user_work_history,user_about_me,user_hometown'));
}

Habilite o upload da API.

$facebook->setFileUploadSupport(true);

Verifique as permissões concedidas

if ($user) {
  try{
    $permissions = $facebook->api("/me/permissions");
    if(!array_key_exists('publish_stream', $permissions['data'][0])){
      header("Location: " . $facebook->getLoginUrl(array("scope"=>"publish_stream")));
      exit;
    }
}

Aqui você criará o seu álbum. Para postar uma foto na timeline do usuário em tamanho grande, você deve criar um álbum no perfil do usuário para depois efetuar a postagem, do contrário, só é possível efetuar a postagem com a foto em miniatura.

    $album_name = 'Nome do seu álbum';
    $album_details = array('name'=>$album_name);

    /* Procura todos os álbuns do usuário para evitar que se crie um álbum repetido */
    $albuns = $facebook->api("/me/albums");
    $hasAlbum = false; // Parte do princípio que não existe o álbum.

    /* 
     * Para cada álbum encontrado, verifique se já não existe um com o mesmo nome.
     * Se já existir pega o ID do álbum
     */
    foreach($albuns['data'] as $album){
      if($album['name']==$album_name){
        $hasAlbum=true;
        $album_id = $album['id'];
      }
    }

    if(!$hasAlbum){
      $create_album = $facebook->api("/".$user."/albums", "POST", $album_details);
      $album_id = $create_album['id'];
    }

Use somente se quiser incluir uma mensagem junto com a foto, pode resgatar via $_POST

    $photo_details = array('message'=>'');

Aqui é muito importante que se use o caminho físico do arquivo no seu servidor, ou caso tenha feito um formulário para upload resgate via $_FILE.

    $file = "/home/dominio/public_html/img/foto.jpg";
    $photo_details['image'] = '@' . realpath($file);

    $upload_photo = $facebook->api('/' . $album_id . '/photos', 'post', $photo_details);

Se estiver tudo certo ao executar o script, você terá criado um álbum, postado uma foto e compartilhado na timeline do usuário.