2017-03-12 5 views
1

Quand j'appelle genesis_search_form(), il sort:Comment insérer un span dans un formulaire de recherche? (Genèse)

<form class="search-form"> 
    <meta itemprop="target"> 
    <input type="search"> 
    <input type="submit"> 
</form> 

Mais je voulais de générer un span à l'intérieur, comme:

<form class="search-form"> 
    <meta itemprop="target"> 
    <input type="search"> 
    <span class="submit-icon"></span> 
    <input type="submit"> 
</form> 

cherchait une alternative plus sûre à:

add_filter('genesis_search_form', 'my_search_button'); 
function my_search_button($form) { 
    return str_replace( 
     '<input type="submit"', 
     '<span class="submit-icon"></span><input type="submit"', 
     $form 
    ); 
} 

Pour éviter de remplacer le début d'une étiquette. Des idées?

+1

Vous ne pourrez pas faire cela tant que la fonction n'offre pas la possibilité de le faire, vous pouvez si elle est autorisée à embrasser la fonction et à la personnaliser selon vos besoins. – hassan

Répondre

0

Si vous êtes d'accord avec DOMDocument, cette version fonctionne mieux pour HTML5.

add_filter('genesis_search_form', 'my_search_button'); 
function my_search_button($form) { 

    $document = new DOMDocument(); 
    $document->loadHTML($form); 
    $xpath = new DOMXPath($document); 
    $input = $xpath->query('//input[@type="submit"]'); 
    $span = $document->createElement('span'); 
    $span->setAttribute('class', 'sb-icon'); 

    if ($input->length > 0) { 
     $input->item(0)->parentNode->insertBefore($span, $input->item(0)); 
    } 

    $document->removeChild($document->doctype); 
    $document->replaceChild($document->firstChild->firstChild->firstChild, $document->firstChild); 
    $form_html = $document->saveHTML(); 

    return $form_html; 
} 
1

Si vous êtes autorisé à apporter des modifications à la fonction, faites-le. Sinon, pirate-le!

$('form.search-form input[type=search]').after('<span class="submit-icon"></span>'); 
+2

Merci pour votre réponse, 'jQuery' est en effet plus simple, mais cherchait une solution dans' php' tout faire côté serveur. –

0

Utilisez DOMDocument! Voici une version de travail de votre code: https://3v4l.org/ats7D

<?php 

// Create a DOM Document 
$dom = new DomDocument(); 

// Load your HTML 
$dom->loadHTML('<form class="search-form"> 
    <meta itemprop="target"> 
    <input type="search"> 
    <input type="submit"> 
</form>'); 

// Create a new <span> 
$span = $dom->createElement('span', 'hello'); 

// Grab the <input elements (we dont have an ID) 
$inputs = $dom->getElementsByTagName('input'); 

// Add the <span> between the inputs 
$inputs->item(0)->parentNode->insertBefore($span, $inputs->item(1)); 

// By default when you loadHTML(), it generates doctype, html, head, and  body tags. remove them! 
$dom->removeChild($dom->doctype); 
$dom->replaceChild($dom->firstChild->firstChild->firstChild, $dom->firstChild); 

// Finally get the HTML 
$html = $dom->saveHTML(); 

// And output/return/whatever 
echo $html; 
+0

Génial; il vous permet de le garder côté serveur, comme il le veut. Il peut également être judicieux de mettre en cache le résultat d'une manière ou d'une autre, de sorte qu'il n'a pas besoin de manipuler un fragment DOM avec chaque requête. –