IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Affichage des résultats du sondage: Comment produisez-vous votre HTML ?

Votants
208. Vous ne pouvez pas participer à ce sondage.
  • En mélangeant le PHP et le HTML

    109 52,40%
  • Avec echo

    45 21,63%
  • Avec un moteur de template

    81 38,94%
  • À ma manière

    47 22,60%
Sondage à choix multiple
Langage PHP Discussion :

Comment produisez-vous votre HTML ?


Sujet :

Langage PHP

  1. #21
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Avec Razor (Asp.Net MVC)

  2. #22
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Pour ma part, je préfère séparer.
    Dans le HTML, que du HTML je veux dire la structure statique de la page.
    Le dynamique est à la charge de jQuery (ajax).
    Le PHP lui ne "gère" que ce qui est "données" et ce qui est lié au serveur, il ne retourne que des valeurs brutes par l'ajax que jQuery traite.
    Donc pour une petite page dynamique j'ai 3 fichiers, .html .php et .js.

    Pensez-vous que ça complique les choses ou si vous trouvez que ça offre plus de clareté ?

  3. #23
    Membre du Club
    Profil pro
    lead tec
    Inscrit en
    Octobre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lead tec

    Informations forums :
    Inscription : Octobre 2011
    Messages : 16
    Points : 56
    Points
    56
    Par défaut
    Des webforms avec asp.net / C#

    Cela permet de bien séparé la partie présentation en html et le code objet dans le code begin.

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je sépare en général le HTML du PHP. Je trouve que c'est plus clair et plus lisible.
    Des echo ... peuvent être ponctuellement utiles (quand la séparation des codes ne se justifie pas).

    Par contre, en tant qu'enc...leur de mouches professionnel, j'aurais écrit :
    - "En séparant le HTML du PHP" au lieu de "En Mélangeant le PHP et le HTML"
    - "En incluant le HTML dans le PHP (avec echo)" au lieu de "Avec echo"

    J'ai failli cliquer "A ma manière", avant de voir les exemples donnés...

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 8
    Points
    8
    Par défaut
    Comme @wxz j'utilise des vues PHP/HTML avec ob_start() pour les même raisons. Les moteurs de templates Twig, Smarty m'ont toujours rebuté... la flemme d'apprendre un nouveau langage PHP-like alors que PHP possède tout ce dont j'ai besoin et que je connais parfaitement du coup...

  6. #26
    Membre actif
    Inscrit en
    Février 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 72
    Points : 214
    Points
    214
    Par défaut
    Le père du PHP a me semble-t'il toujours été contre les templates, arguant qu'un template n'étant rien d'autre qu'une couche de plus par rapport à PHP.
    Et en effet plus on va loin dans les templates (boucles, conditions, évaluations, ...) plus le template devient compliqué et spécifique et on tend à reproduire des choses qui existent nativement de manière + simple en PHP, parfois.

    Perso dans la plupart des langages j'utilise pourtant des templates.

  7. #27
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class View
    {
        private $data;
     
        public function render( $template, $data = array() ) 
        {
            $this->data = $data;
     
            ob_start();
            include $template;
            $content = ob_get_contents();
            ob_end_clean();
     
            return $content;
        }
    }
    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $view = new View;
    echo $view->render('template.php', array('title' => 'Ma page'));
    template.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <html>
    <head>
    <title><?=$this->title;?></title>
    </head>
    <body>
    </body>
    </html>
    Simplifié pour l'exemple, mais complet.

    A ajouter par exemple, l'impossibilité d'accéder en écriture aux données encapsulées dans la vue, par la vue.
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  8. #28
    Expert confirmé Avatar de Zefling
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 173
    Points : 4 685
    Points
    4 685
    Par défaut
    Je fais avec mon propre moteur de template en PHP, très simple sans de code complexe pour éviter d'en faire un langage avec une 20aine de balises spécifique à mes besoins... C'est un peu à ma manière.

    Citation Envoyé par wamania Voir le message
    Simplifié pour l'exemple, mais complet.

    A ajouter par exemple, l'impossibilité d'accéder en écriture aux données encapsulées dans la vue, par la vue.
    L'intérêt des templates c'est aussi de supprimer certaines opérations sur les formulaire : genre remplir des champs, formatage automatique, générer des éléments de formulaire, de façon très simple sans avoir à faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <input type="radio" name="radio" id="radio_1" value="2" <?php 
    if ($this->radio_1 == 2) { echo " checked " } 
    ?>  />

  9. #29
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    L'intérêt des templates c'est aussi de supprimer certaines opérations sur les formulaire : genre remplir des champs, formatage automatique, générer des éléments de formulaire, de façon très simple sans avoir à faire
    Donc évidemment, chacun sa manière de faire, mais pour moi, ça représente tout ce que je déteste.
    Pour moi, un formulaire c'est simple à gérer, et écrire ce que tu écris ne prend pas moins de temps que l'équivalent php pour le générer.
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  10. #30
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 33
    Points : 31
    Points
    31
    Par défaut
    J'utilise (très) souvent Smarty 2, souvent XSLT que j'aime particulièrement mais qui reste assez verbeux.
    Sinon pour des petits sites, je trouve que la syntaxe alternative de PHP est toujours très bien

  11. #31
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Laquelle de ces techniques utilisez-vous et pourquoi ?
    Il fut un temps où j'utilisais du PHP + HTML lorsque je développais sans framework (la méthode echo est à bannir).
    Depuis que j'utilise le framework Symfony2 je suis passé aux templates.

    Utilisez-vous un moteur template et lequel ?
    Oui j'utilise le template Twig qui est inclus dans Symfony2.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  12. #32
    Membre expérimenté
    Avatar de Jarodd
    Profil pro
    Inscrit en
    Août 2005
    Messages
    851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 851
    Points : 1 717
    Points
    1 717
    Par défaut
    PHP + HTML pour moi. En général, c'est ce qui me convient le mieux sur les projets avec plusieurs intervenants, l'intégrateur n'est pas paumé quand il lit du code PHP.

    Je n'aime pas les moteurs de template, chacun a sa propre syntaxe, je passe plus de temps sur la doc pour me rappeler comment écrire telle ou telle fonction qu'à écrire mon code.

  13. #33
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 32
    Points : 32
    Points
    32
    Par défaut SEPARER votre code !!!
    Non mais sérieux faut arrêter définitivement de mélanger du php et de l'html dans le mm fichier, utiliser autre chose mais il y a rien de pire à maintenir que du code mélangé !!

    Donc pour moi SEPARATION et quelque soit le langage !!
    Et ça devrait être pareil pour tout le monde ;-)

  14. #34
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    J'utilise jTpl, livré avec le framework Jelix (jelix.org)

    Vraiment très simple d'utilisation et très léger et une syntaxe quasi PHP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <html>
    <head>
     
    </head>
     
    <body>
        Bonjour {$prenom}
     
        <ul>
        {foreach $liste as $item}
            <li>{$item->nom.' '.$item->prenom}</li>
        {/foreach}
        </ul>
    </body>
    </html>
    jTpl est aussi disponible en version standalone (version qui fonctionne sans le framework), aller faire un tour sur le site => jelix.org

  15. #35
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    J'ai voté "mélange de Php et Html" malgré avoir utilisé des moteurs de template comme Smarty2 et Twig.
    Ceci dit je ne suis pas un adepte des moteurs de templates bien que je les trouvent fort intéressant, j'ai plutôt rejoins à la longue l'idée que Php est lui même un moteur de template.

    Le sondage est intéressant, mais pour ma part le plus important c'est l'art et la manière d'exploiter telle ou telle solution.
    Le principal c'est de faire un projet bien conçu, facile à maintenir dans le temps, tout le reste c'est de la masturbation intellectuelle (j'aime bien cette petite expression )


    Même en se narguant d'utiliser un moteur de template (car soit disant il y aurait obligation de séparer les couches Php/Html), je ne suis pas convaincu que tous le font avec la manière.


    Un exemple concret de code (simplifié) effectué par des pros avec un moteur de template (Smarty2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    {include file="$tpl_dir./breadcrumb.tpl"}
     
    <h1>{l s='The Title'}</h1>
     
    {include file="$tpl_dir./errors.tpl"}
     
    {if isset($empty)}
    <p class="warning">{l s='Is empty.'}</p>
    {else}
    <script type="text/javascript">
    // <![CDATA[
    <p>{l s='Bla bla bla.'}</p>
    // ]]>
    </script>
    {/if}
    <div>
    etc etc etc ...
    </div>
    Je ne sais pas ce que vous en pensez, mais quand je vois ce genre de code (effectué par des pros je rappel) ça me fais mal au coeur, mais franchement.
    Et encore, je n'ai mis que quelques toutes petites lignes histoire de faire court, il y a encore 100 fois pire, du code que je je considère imbuvable.

    Inclure une vue dans une vue ?
    Le faire 1 fois, passe encore, mais le généraliser dans un projet ça le rendra difficilement maintenable (voir pas du tout).
    Mettre du code JS en plein corps HTML rend là encore un projet difficile à maintenir.
    Etc, etc, ... j'en passe et des meilleurs.


    Pour ma part, utiliser un moteur de template d'accord, tant que l'art et la manière y est.
    Le gros piège à mon sens, c'est que ces moteurs de template sont souvent très évolués et permettent de faire un peu tout et n'importe quoi (tout comme Php d'ailleurs).

    Donc si on utilise un moteur de template pour palier à un gros manque de conception/logique au sein du projet et déboucher sur du code tout aussi tordu et non maintenable, et bien très peu pour moi.


    Bis et repetita : mélange de Php et Html, sans pour autant dénigrer que Twig et franchement pas mal.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  16. #36
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    En mvc sans moteur de template pour mes projets persos, un peu comme dans le commentaire de wamania:
    depuis mon controleur j'assigne mes variables $this->_view->assign('key', 'value'); et dans ma vue echo $this->get('key); et le rendu final est effectué via la méthode render() du controleur qui appel celui de la vue avec de l'ob_start derrière.

    Sinon au boulot on utilise Smarty, avec lequel je l'avoue, dans les mains de devs qui ne cherchent pas à apprendre ça peut donner des horreurs au lieu de simplifier les vues, je me dis que ça aurait été pire s'ils travaillaient sans moteur de template...

  17. #37
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 12
    Points
    12
    Par défaut
    - Pas de système de template

    - Jamais de mélange Javascript/PHP (hormis quelques variables globales)

    - Une fonction globale Gettext pour tous les textes : __('traduit'), ce qui permet de modifier les textes en français ou de les traduire par le client à l'aide d'un logiciel simple à utiliser

    - Pour mes helpers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static function notification($title = null, $message = null, $action = null)
    {
    	$out = '<h3>'.$title.'</h3>'.$message;
    	if ($action) {
    		$out.= '<a href='.$action['url'].'>'.$action['label'].'</a>';
    	}
    	return $out;
    }
    - Pour mes vues (.phtml), mélange PHP / HTML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php if ($profiles ) : foreach ($profiles as $profile) : ?>
    	<div>
    		<h3><?= e($profile->name) ?></h3>
    		<p>
    			<i class="icon-calendar"></i>
    			<?= __('%d ans',  hUtils::get_age($profile->birthdate)) ?><br>
    			<i class="icon-globe"></i>
    			<?= hUtils::item_text($profile->city, $items['city']) ?>
    		</p>
    	</div>
    <?php endforeach; else: ?>
    	<div>
    		<h2><?= __('Aucun contact') ?></h2>
    	</div>
    <?php endif; ?>

    Citation Envoyé par Zefling Voir le message
    Je fais avec mon propre moteur de template en PHP, très simple sans de code complexe pour éviter d'en faire un langage avec une 20aine de balises spécifique à mes besoins... C'est un peu à ma manière.

    L'intérêt des templates c'est aussi de supprimer certaines opérations sur les formulaire : genre remplir des champs, formatage automatique, générer des éléments de formulaire, de façon très simple sans avoir à faire
    Tu confonds système de templates et Helpers je crois.

  18. #38
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut Architecture
    J'ai au départ utilisé le moteur de template Smarty, mais son concept de variables n'est pas élégant.

    Pourquoi ont-ils réinventer la roue :
    {$toto} en lieu et place de <?php echo $toto ?> ?

    Depuis plusieurs années, j'ai adopté le model MVC avec les frameworks cakephp et symphony. L'usage des vues est très puissant.

  19. #39
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 657
    Points : 1 240
    Points
    1 240
    Par défaut
    Non mais sérieux faut arrêter définitivement de mélanger du php et de l'html dans le mm fichier, utiliser autre chose mais il y a rien de pire à maintenir que du code mélangé !!

    Donc pour moi SEPARATION et quelque soit le langage !!
    Et ça devrait être pareil pour tout le monde ;-)
    SEPARATION ne veut pas dire ne pas utiliser php dans un templates, puisque PHP a été créer pour générer facilement du html à la base, vu que c'était trop chiant à faire en perl ou en c/c++. PHP est donc lui même un moteur de templates ! qui s'est transformé en langage à part entière.
    Sinon pourquoi as-ton besoin d'utiliser une balise avant de coder en PHP ?
    les directives require ou include démontre totalement ce fait.

    ce n'est pas le cas des autres langages ou il est plus compliqué d'inclure un fichier adhoc.

    Alors pourquoi utiliser Twig ou Smarty ? la raison principale est que ce ne sont pas juste des moteurs de templates. Il offrent en plus des outils de debugging qui facilitent le développement, ainsi qu'une manière facile d'implémenter un héritage entre templates, un cache , et des fonctions usuelles. Enfin une vue doit être readonly , c'est à dire qu'elle peut lire les valeurs , afficher la réponse d'un autre contrôleur ,mais ne pas modifier le model de l'application.

    Ces moteurs facilitent donc le développement mais ne sont en aucun cas indispensable à php puisque encore une fois , c'est déja un moteur de templates à la base.

    Avec twig on peut :

    - faire du push/pull
    - étendre une vue de base
    - créer des vues réutilisables et "self-contained"
    - profiter d'un nombre important de fonctions courantes, (pair/impair, filtres , ... )
    - appliquer une stratégie de sécurité par défaut ( autoescape pour réduire les opportunités d'attaques XSS , etc ... )

  20. #40
    Expert confirmé Avatar de Zefling
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 173
    Points : 4 685
    Points
    4 685
    Par défaut
    Citation Envoyé par younes0 Voir le message
    Tu confonds système de templates et Helpers je crois.
    J'appends quelque chose, les balises <form: xxx /> comme on en trouve en JSP sont des helpers ?


    Perso, j'ai juste cherché à détacher le plus mon HTML du code, si j'ai une modification à faire, je n'ai pas tous les templètes à revoir : bref pour moi c'est zéro JS et zéro PHP dans mes templètes. Au départ, je ne suis pas parti dans cette optique-là, mais c'est à force de faire de la mise en forme que j'en suis venu à faire ce découpage avec l'idée de n'avoir aucun plantage possible quand je les modifie. Ensuite, je pense qu'avoir travaillé 2 ans avec Spring a dû un peu m’influencer sur certaines balises.

Discussions similaires

  1. Comment écrivez-vous votre code (X)HTML ?
    Par Bovino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 13/11/2012, 13h26
  2. Réponses: 1
    Dernier message: 03/12/2009, 11h09
  3. [Tools] Comment faites-vous votre veille techno ?
    Par rad_hass dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 05/06/2008, 16h27
  4. Réponses: 2
    Dernier message: 09/05/2008, 09h43
  5. Réponses: 19
    Dernier message: 14/08/2003, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo