Jump to content

Modifier service web ou création FrontController JSON


Recommended Posts

Salut tout le monde ;) !

Me revoila avec mon module de Blog pour Prestashop, je touche le bout (ENFIN)! J'aimerai ajouté en dernière fonctionallité un accès aux articles du blog en XML/JSON de type API.

J'ai mon modele Post dans le dossier /model de mon module.

 

class Post extends ObjectModel {

    /** Déclaration des variables */
    public $id_jbblog_post;
    public $author;
    public $date;
    public $description;
    public $title;
    public $excerpt;
    public $active;
    public $comment_status;
    public $name;
    public $modified;
    public $comment_count;
    public $url;
    protected $webserviceParameters = array();

    /**
     * $definition : Tableau représentant la table jbblog_post.
     */
    public static $definition = array(
        'table' => 'jbblog_post',
        'primary' => 'id_jbblog_post',
        'multilang' => false,
        'fields' => array(
            'id_jbblog_post' => array('type' => self::TYPE_INT, 'required' => false),
            'author' => array('type' => self::TYPE_STRING, 'required' => false),
            'date' => array('type' => self::TYPE_DATE, 'required' => false),
            'description' => array('type' => self::TYPE_HTML, 'lang' => false, 'validate' => 'isCleanHtml'),
            'title' => array('type' => self::TYPE_STRING, 'required' => false),
            'excerpt' => array('type' => self::TYPE_STRING, 'required' => false),
            'active' => array('type' => self::TYPE_BOOL, 'required' => false),
            'comment_status' => array('type' => self::TYPE_BOOL, 'required' => false),
            'name' => array('type' => self::TYPE_STRING, 'required' => false),
            'modified' => array('type' => self::TYPE_DATE, 'required' => false),
            'comment_count' => array('type' => self::TYPE_INT, 'required' => false),
            ),
        );

    //ajout sans formulaire
public function add($autodate = true, $null_values = false) {
    $this->name = Tools::link_rewrite($this->title);
    return parent::add($autodate, true);
}

public static function findAll($nbPosts=null,$numPage=null) {
    $sql = 'select * from ' . _DB_PREFIX_ . 'jbblog_post ';
    if(isset($nbPosts)){
        (empty($numPage))?$numPage=0:$numPage=Configuration::get('JBBLOG_POSTS_PER_PAGE')*($numPage-1);//Si pas de page renseigné, page 1
        $sql = 'select * from ' . _DB_PREFIX_ . 'jbblog_post ORDER BY id_jbblog_post LIMIT '.$nbPosts.' OFFSET '.$numPage;
    }
    if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) {
        return ObjectModel :: hydrateCollection(__CLASS__, $rows);
    }
    return array();
}

public static function findById($id) {
    $sql = 'select * from ' . _DB_PREFIX_ . 'jbblog_post WHERE id_jbblog_post=' . $id;
    if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) {
        return ObjectModel :: hydrateCollection(__CLASS__, $rows);
    }
    return array();
}

public static function getPostTitle($id){
   $sql = 'select * from ' . _DB_PREFIX_ . 'jbblog_post WHERE post_id=' . $id;
   if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) {
    return ObjectModel :: hydrateCollection(__CLASS__, $rows);
}
return array();
}

static public function slugify($text) {
    $text = preg_replace('~[^\\pL\d]+~u', '-', $text);
    $text = trim($text, '-');
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
    $text = strtolower($text);
    $text = preg_replace('~[^-\w]+~', '', $text);
    if (empty($text)) {
        return 'n-a';
    }
    return $text;
}

}

La première idée m'étant venu est de tout simplment surcharger le Service Web intégré de Prestashop pour pouvoir y ajouter mes articles. IMPOSSIBLE ! Je me suis tordu dans tous les sens en surchargeant le WebserviceRequestCore mais impossibe. Il detecte bien mes articles dans la liste des éléments à cocher, mais ne reconnais pas l'entité une fois dans l'API.
Pas grave 2nd solution ! On va faire un FrontController qui renvoi du JSON ! Héhé plus simple a dire qu'a faire... Je créer mon nouveau FrontController dans mon module, mais je ne sais pas du tout ou placer le   header("Content-Type: application/json; charset=utf-8");. Si je le met dans la méthode initContent(), il me charge toute la page et du coup j'ai tout le code HTML (doctype,ect...). La solution étant de charger une page vierge sur ce controller pour que je puisse y placer mon JSON.

Si vous avez des soutions pour une de ces 2 propositions je suis tout ouïe !

Merci bien ;) !
 

Edited by gaius57 (see edit history)

Share this post


Link to post
Share on other sites

Bonjour Gaius57,

 

Le controller cart renvoi pour des appels ajax du json. Ca peut être une piste.

 

Sinon une bonne piste pour gérer tout du début à la fin pourrait être le code contenu dans cron_currency_rates.php ou les retours serveur à serveur des modules bancaires.

 

Bon développement

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More