Modo migliore per tornare html da php funzione?

Così ho chiesto ad una domanda simile in precedenza e io sono solo più confuso ora, quindi mi chiedo in un modo diverso…

Quello che sto cercando di fare è astratto il mio php e mettere il bit di html, usato nel mio validator come i messaggi di errore, in funzioni che restituiscono il codice html per il posto dove sono necessari nella pagina.

Quello che ho adesso è:

<section>
<?php 
if($errMsg)
{
    errMsg();
}
?>
</section>

<?php
function errMsg()
{
       ?>
       <section>
           <p>O crap!  There was an error</p>
       </section>
       <?php
}
?>

Ma nel mio menzionati in precedenza domanda, mi è stato detto di farlo in questo modo è un ‘sporco hack’ e meglio utilizzare ritorno in situazioni come questa. Ma per utilizzare ritorno avrei bisogno di assegnare a tutti di ritorno da html a una var e, per farlo, avrei bisogno di inserire il codice html in una stringa. Preferisco evitare di mettere più di due righe di codice html in una stringa a causa del dolore nel culo numero di citazioni necessarie per farlo.

Quindi sto pensando di utilizzare la sintassi heredoc o ob_start/ob_get_clean funzioni. Quello che vorrei sapere è.

1 ho nemmeno bisogno di preoccuparsi di astrarre il mio codice come questo?
2 Se è così, qual’è il miglior modo di pratiche di un modo per farlo? E/O
3 devo solo rinunciare sviluppo web e tornare alla consegna della pizza? :-\

OriginaleL’autore Matt Whitehead | 2012-08-07

7 risposte

  1. 4

    Non mi restituisce alcun HTML. Semplicemente restituire il messaggio di errore la funzione e quindi generare il codice html in un luogo più appropriato. Per esempio all’interno del modello.

    OriginaleL’autore moodh

  2. 4
    1. Sì, sicuramente, non hanno la flessibilità con il modo in cui si sta facendo.
    2. Si dovrebbe separare tutte le HTML da PHP idealmente, almeno funzioni – l’unico posto in remoto è accettabile è all’interno di una visualizzazione che utilizza PHP solo per visualizzare l’output di funzioni.
    3. Pizza! Sto solo scherzando, ma non può mai essere sufficiente pizza!?

    Dare un’occhiata a Zend framework http://framework.zend.com/manual/en/zend.application.quick-start.html inviano messaggi di errore che non sono catturati da un gestore di errori, che utilizza quindi il suo punto di vista per rendere l’errore.

    O w/o un quadro:

    try{
         //do work here and throw exception on error
    }
    catch (Exception $e)
    {
         //do error logging/display error
         //or preferably load another class which handles your error and produces output
    }
    Si prega di perdonare il mio noobness, ma quando si dice separare tutte le mie HTML dal mio PHP, cosa si intende mantenere le diverse lingue in file diversi? Come unobtrusive JavaScript? Perché, proprio ora, tutto il mio mio .i file php sono le pagine web con PHP scritto sopra il doctype.
    All’inizio del file è bene, ma non vorrei mix HTML con PHP direttamente, vale a dire con <<<EOF o chiusura del tag php per aggiungere HTML è in cerca di guai quando si tratta di un re-design. Penso a te quando il tuo codice sarà questo rendere la vita difficile quando si tratta di ri-progettare il mio sito web? La probabile risposta che i tuoi esempi è un chiaro sì 😉
    Grazie per la tua risposta. Ora, se la miscelazione PHP nel codice HTML usando il tag di chiusura è una cattiva idea. Come output del PHP di HTML? Per esempio, se un modulo è tornato dal server con un messaggio di errore, come si può anche tenere l’input dell’utente in campi di input senza l’utilizzo di qualcosa di simile value=”<?php $_POST[‘username’] ?>”?
    Vorrei raccomandare il Zend_Form classe che gestisce questa (o una simile classe) o creare una propria classe che ha gestito una specifica e costruito l’uscita per voi. In questo modo si dispone di un sacco di controllo su cose come il filtraggio, la validazione, etc. Non è necessariamente un male per l’uscita normale variabili nel codice PHP in HTML, tuttavia, se si inizia a ottenere la logica (come se le istruzioni per il loop ecc) sarà un incubo da mantenere quando si tratta di ri-progettare e portare a codice duplicato (che è sempre un male!)
    La tua logica solo paura di me in fronte e dato la mia epifania. Così, invece di utilizzare un’istruzione if nel mio modulo di uscita qualcosa se var è vero, o la chiamata di una funzione. Potrei creare una classe separata, script, creare un oggetto basato sulla classe, e chiamare il metodo appropriato dall’oggetto per fare quello che devo fare in un punto dove se la dichiarazione è stata? Scusate se, che non ha alcun senso, ma sto ancora cercando di comprendere come fare OOP in PHP. Programmazione a oggetti in Actionscript 3 è stato modo più semplice, a mio parere…

    OriginaleL’autore williamvicary

  3. 4

    1: non È necessario, ma è possibile se è fatto correttamente.

    2: Per fare questo, vi consiglio di utilizzare il EOF nel tuo errore PHP func, assomiglia a questo :

    function errMsg()
    {
           $error = <<<EOF 
    <section>
    <p>O crap!  There was an error</p>
    </section>
    EOF;
    }
    Non si chiama EOF, si chiama heredoc.
    Hai ragione, ma che tutti possano comprendere con l’EOF 😉
    Una grande assunzione.

    OriginaleL’autore PoulsQ

  4. 2

    Si potrebbe fare solo questo:

    <?php if($errMgs){ ?>
    <section>
        <p><?php echo errMsg(); ?></p>
    </section>
    <?php } ?>

    In genere, cerco di fare del mio meglio per non eco HTML tramite PHP. Perché? Perché se il progettista ha bisogno di lavorare sul mio codice, non voglio che lui/lei a preoccuparsi di quello HTML mie funzioni sono sputando.

    OriginaleL’autore Wayne Whitty

  5. 2

    Spostare il codice html in un file separato, error.php. Dopo di che è solo cattura l’output:

    function errMsg()
    {
        ob_start();
        include '/path/to/error.php';
        return ob_get_clean();
    }
    
    //...
    
    echo errMsg();

    OriginaleL’autore Federkun

  6. 2

    Prima di tutto, sono d’accordo con il post di cui sopra. Non formattare, basta avere la funzione di restituire il nudo messaggio di errore e se è necessario formattare in modo appropriato in cui si desidera visualizzare.

    In secondo luogo, ho sempre trovato che è utile per essere in grado di girare errore e test di messaggi e rapidamente. Come la maggior parte del mio codice è orientato e potrei solo desidera che i messaggi di saltar da un oggetto alla volta, io di solito qualcosa di simile a questo nelle mie classi:

    class userObject
    {
        public $history;//= historyObject;
        public $userName;
        public $userRelation;
        public $userCode;
        private $mySQLAccessData;
        private $isDebug=false;
    
        public function makeHistoryObject($KPI, $KPIType)
        {
            if($this->isDebug){echo "Having a go at creating ".$this->userName.".<br>";}
            $this->history = new historyObject($this->userCode, $KPI, $KPIType);
        }
    }

    Mi infilo private elemento che lascio come false per impostazione predefinita. Se ho bisogno di eseguire il debug o di apportare modifiche, ho impostato il true e tutto il mio errore/registrazione di messaggi sono chiaramente visualizzati su schermo. So che questo non è rispondere direttamente alla tua domanda, ma io trovo che sia così utile potrebbe essere la pena per voi quando si avvia. Certamente batte commentando e quindi eliminare il commento potenzialmente decine di messaggi. È possibile lasciare queste uscite in oggetto, senza preoccuparsi e li riporta tutti i dettagli di cui avete bisogno.

    OriginaleL’autore Fluffeh

  7. 0

    Se ad un certo punto il numero di errori, quindi fare

    <?php
    $errors = array();
    
    if (!$item = getItem($id)) {
        addError("No item $id");
    }
    
    if (!updateUser($user, $id)) {
        addError("Can not update user");
    }
    
    if (!updateItemPicture($id, $picture)) {
        addError("Can not add picture to $id");
    }
    
    function addError($error) {
        global $errors; $errors []= $error;
    }
    
    function hasErrors() {
       global $errors; return count($errors);
    }
    
    function printErrors() {
       if (!hasErrors()) return;
    
       print "<ul class='errors'><li>" . join("</li><li>", $errors) . "</li></ul";
    }
    
    
    printErrors();
    ?>

    Questo è nel caso in cui non si utilizza object oriented. E supponendo che tutti gli errori non sono mortali e preso in try {} catch () {} blocchi.

    OriginaleL’autore ALeX inSide

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *