vKontakte l’eldorado du mp3.

Posted: 21st octobre 2010 by Anders in PHP
Tags: , , , , ,

Récemment vu sur korben, un surprenant (le mot est fort je sais) plug-in pour rythmbox permettant d’accéder directement à toutes les musiques présentes sur les sites communautaires de vK.

Cependant et n’étant à mon grand désarrois pas à 100% sous linux, j’ai eu le besoin de disposer d’un script accessible de partout (même depuis mon BlackBerry :) ). Le web s’est donc (encore une fois) imposé comme étant une réponse évidente.

Pour combler à ce manque j’ai donc crée, à partir du plug-in en python une interface web tout en php/js qui depuis n’importe quel serveur apache (local, ou distant) comme par exemple une simple installation WAMP de base, vous permet de rechercher sur vKontakte et de télécharger à votre guise.

Pour ce qui est du téléchargement ca se passe ici, vous pouvez personnaliser le script à votre guise, je le fournis « As Is »

vKontakte php/js

Amusez vous bien.

PS: Pour télécharger depuis votre BlackBerry ou iPhone  (ou toute autre périphérique connecté à internet) vous devrez bien entendu mettre ce script sur un serveur accessible depuis internet.

Le Téléchargement avec Symfony !

Posted: 14th septembre 2010 by Anders in Symfony
Tags: , , , ,

Une des problématique récurrente dans le développement web, est sans doute cette grande question du téléchargement des pièces jointes.

Ici est la au travers du web l’on y découvre une montagne de snippets expliquant comment faire, forcer le téléchargement, modifier les headers, les réponses se suivents mais ne se ressemblent pas et les résultats sont toujours plus ou moins hasardeux.

Cependant grâce à Symfony nous disposons desormais d’un exemple fonctionnel et stable qui nous permettra de télécharger des pièces jointes avec aisance, le voici en images (façon de parler).

Voici le modèle « File » de l’exemple.

file:
  columns:
    filename:   { type: string(1024) } // Nom original du fichier
    url:        { type: string(255) }  // Nom sur le disque
    mime:       { type: string(255) }  // Type
    size:       { type: integer(4) }   // Taille
public function executeDownload(sfWebRequest $request)
{
  $file = $this->getRoute()->getObject();

  // On récupère notre objet de reponse.
  $response = $this->getResponse();

  // Nettoyage des headers pour être sur.
  $response->clearHttpHeaders();

  // Le type mime de notre objet (ici $file)
  $response->setContentType($file->getMime());
  $response->setHttpHeader('Pragma', 'public');

  // Ici on assigne un nom "humainement lisible" à notre pièce jointe.
  $response->setHttpHeader(
    'Content-disposition',
    'attachment; filename='.$file->getFilename()
  );
  $response->setHttpHeader(
    'Content-length',
    $file->getSize()
  );

  // Maintenant on envoi les Headers.
  $response->sendHttpHeaders();

  // On établi le contenu de notre fichier, en executant
  // un readfile sur celui ci
  $response->setContent(
    readfile(sfConfig::get('sf_upload_dir').'/files/'.$file->getUrl())
  );

  // Et pour finir on envoi le contenu.
  $response->sendContent();

  // Ici on s'assure de ne retourner que les Headers pour eviter
  // des caractères non voulus à la fin du fichier.
  return sfView::HEADER_ONLY;
}

Le résultat est l’ouverture d’une fenêtre de téléchargement, et ce sous tous les navigateurs, fini les fichiers en text/plain affichés dans le navigateurs.

Dans mon exemple j’ai crée l’action « executeDownload » pour mon modèle « file », et pour récupérer un fichier j’utilise simple une url du type

http://www.myproject.sf/file/12/download

<a href="<?php echo url_for('file/download?id='.$file->getId()) ?>">
  télécharger le fichier
</a>

En espérant que cet exemple vous servira :) si vous avez des questions ou des améliorations à proposer n’hésitez pas.

Classe de base Doctrine.

Posted: 5th août 2010 by Anders in Doctrine, Symfony
Tags: , ,

Dans le cadre du développement d’une application sous le Framework Symfony j’ai eu le besoin de disposer d’une classe de base pour tout mon modèle.

Ceci permet en effet de créer des méthodes communes à tous les objets, sans que le besoin de tout surcharger ne se présente.

Pour commencer, il faudra modifier le fichier ‘ProjectConfiguration.class.php’ et lui ajouter ceci

// Custom models for inheritance in Doctrine.

sfConfig::set('doctrine_model_builder_options', array(
   'baseTableClassName' => 'myprojectDoctrineTable',
   'baseClassName' => 'myprojectDoctrineRecord'
));

Après cela il faudra bien entendu créer les 2 classes de base de notre modèle.

dans lib/model/myprojectDoctrineRecord.class.php

<?php
class myprojectDoctrineRecord extends sfDoctrineRecord
{
  // Your code Here.
}

et dans lib/model/myprojectDoctrineTable.class.php

<?php
class myprojectDoctrineTable extends Doctrine_Table
{
  // Your code Here.
}

Après cela il n’y a plus qu’a reconstruire le modèle pour que les modifications soient prisent en compte.