Как генерировать гибкое количество вкладок в php?

#javascript #php #html #css

#javascript #php #HTML #css

Вопрос:

Привет, ребята, мне действительно нужна ваша помощь.

Я очень новичок в php или программировании в целом. Так что, возможно, мой вопрос уже решен, но я не смог корректно настроить код или увидеть правильное решение. У меня следующая проблема: мне нужна процедура, которая может обрабатывать гибкое количество вкладок. Например, если у меня есть 5 ключевых слов, должно быть создано 5 вкладок. Для 3 ключевых слов 3 вкладки и так далее…

Я знаю, как обрабатывать вкладки, их количество известно и не меняется (например, всегда три вкладки с «home», «news» и «registration»). Но в моем случае количество вкладок меняется со временем.

Я попробовал этот код:

Моя часть php:

 <?php

/* How it was handled before I tried to make it dynamically:
<button class="tablink" onclick="openPage('Home', this, 'red')" id="defaultOpen">Home</button>
<button class="tablink" onclick="openPage('News', this, 'green')">News</button>
<button class="tablink" onclick="openPage('Contact', this, 'blue')">Contact</button>
<button class="tablink" onclick="openPage('About', this, 'orange')">About</button>

<div id="Home" class="tabcontent">
  <h3>Home</h3>
  <p> home... </p>
</div>

<div id="News" class="tabcontent">
  <h3>News</h3>
  <p> news... </p>
</div>

<div id="Contact" class="tabcontent">
  <h3>Contact</h3>
  <p> contact... </p>
</div>

<div id="About" class="tabcontent">
  <h3>About</h3>
  <p> about... </p>
</div> 


My try making the number of tabs dynamically:
*/

$current_tab_number = 0; //Number of tabs generated
$end_number=3; //this should be the number of tabs at the end

while($current_tab_number < $end_number){
    $current_tab_number = current_tab_number   1;
?>
    <button class="tablink" onclick="openPage('$current_tab_number', this, 'red')">Name</button>
    <div id="$current_tab_number" class="tabcontent">
        <h3>Name</h3>
        <p> Some text...</p>
    </div>
<?php
}
 

Это мой javascript:

 <!-- Javascript part -->
<script>    
    
function openPage(pageName, elmnt, color) {
    // Hide all elements with class="tabcontent" by default */
    var i, tabcontent, tablinks;
    tabcontent = document.getElementsByClassName("tabcontent");
    for (i = 0; i < tabcontent.length; i  ) {
        tabcontent[i].style.display = "none";
    }
    // Remove the background color of all tablinks/buttons
    tablinks = document.getElementsByClassName("tablink");
    for (i = 0; i < tablinks.length; i  ) {
        tablinks[i].style.backgroundColor = "";
    }
    // Show the specific tab content
    document.getElementById(pageName).style.display = "block";
    // Add the specific color to the button used to open the tab content
    elmnt.style.backgroundColor = color;
}

// Get the element with id="defaultOpen" and click on it
document.getElementById("defaultOpen").click(); 
    
</script>       
 

Как вы можете видеть, я изменил только часть php. Но поскольку я новичок, код работает не так, как ожидалось, и я действительно понятия не имею, как правильно настроить.

Кроме того, было бы фантастично, если бы вкладки тоже можно было называть гибкими. Например, ‘tab 1’, ‘tab 2’,…

Я действительно надеюсь, что кто-нибудь может мне помочь.

Пока что, хорошего дня!

Ответ №1:

Ключевая проблема

Причина, по которой ваш код не работает, заключается в том, что вы пропустили $ символ в строке:

 $current_tab_number = current_tab_number   1;
 

Таким образом, фактически ваш while цикл становится бесконечным, поскольку вы не увеличиваете $current_tab_number переменную.

Замените эту строку на:

 $current_tab_number = current_tab_number   1;
// OR
$current_tab_number  ;
 

Который затем становится:

 while($current_tab_number < $end_number){
    $current_tab_number  ;
    // Print tabs here
}
 

В качестве альтернативы вы могли бы использовать цикл for, например:

 for($i = 0; $i < $end_number; $i  ){
    // print tabs here
}
 

Дополнительно

Использование переменных вне тегов PHP

Эта строка:

 <button class="tablink" onclick="openPage('$current_tab_number', this, 'red')">Name</button>
 

Буквально напечатает строку $current_tab_number , какой она должна быть:

 <button class="tablink" onclick="openPage('<?php echo $current_tab_number; ?>', this, 'red')">Name</button>
 

То же самое здесь:

 <div id="$current_tab_number" class="tabcontent">

<div id="<?php echo $current_tab_number; ?>" class="tabcontent">
 

Мы могли бы легко обойти это, просто используя echo для печати html вместо. Например:

 echo <<<EOT

    <button class="tablink" onclick="openPage('{$current_tab_number}', this, 'red')">Name</button>
    <div id="{$current_tab_number}" class="tabcontent">
        <h3>Name</h3>
        <p> Some text...</p>
    </div>

EOT;
 

Этот метод не добавляет данные в divs

Ожидается, что результат этого кода будет:

 <button class="tablink" onclick="openPage('Home', this, 'red')" id="defaultOpen">Home</button>
<button class="tablink" onclick="openPage('News', this, 'green')">News</button>
<div id="Home" class="tabcontent">
  <h3>Home</h3>
  <p> home... </p>
</div>
<div id="News" class="tabcontent">
  <h3>News</h3>
  <p> news... </p>
</div>
 

Но на самом деле будет:

 <button class="tablink" onclick="openPage('<?php echo $current_tab_number; ?>', this, 'red')">Name</button>
<div id="<?php echo $current_tab_number; ?>" class="tabcontent">
    <h3>Name</h3>
    <p> Some text...</p>
</div>
<button class="tablink" onclick="openPage('<?php echo $current_tab_number; ?>', this, 'red')">Name</button>
<div id="<?php echo $current_tab_number; ?>" class="tabcontent">
    <h3>Name</h3>
    <p> Some text...</p>
</div>
 

Чтобы добавить данные в выходные данные, нам нужно откуда-то их получить, например:

 $tab_list = [
    1 => [
        "name"    => "Home",
        "content" => "Some text for content..."
    ],
    2 => [
        "name"    => "About",
        "content" => "Some text for about..."
    ]
];

foreach($tab_list as $tab_number => $tab){
    echo "
    <button class="tablink" onclick="openPage('{$tab_number}', this, 'red')">Name</button>
    <div id="{$tab_number}" class="tabcontent">
        <h3>{$tab["name"]}</h3>
        <p>{$tab["content"]}</p>
    </div>
    ";
}
 

Ответ №2:

Вам нужно знать имя для каждой вкладки и сколько их нужно создать, поэтому создайте массив с нужными вам именами, в котором указано, сколько их необходимо, и имя, которое следует использовать при вызове javascript.

 /*
My try making the number of tabs dynamically:
*/

$tabs = ['Home', 'News', 'Contact', 'About'];

foreach ($tabs as $tab){
?>
    <button class="tablink" onclick="openPage('<?php echo $tab;?>', this, 'red')>Name</button>
    <div id="<?php echo $tab;?>" class="tabcontent">
        <h3>Name</h3>
        <p> Some text...</p>
    </div>
<?php
} // endforeach
 

Ответ №3:

Вы можете перебирать имена вкладок и объединять строки, чтобы сгенерировать HTML-код для вкладок. Например:

 $tab_names = ['home', 'about', 'contact'];
$resulting_html_code = "";
foreach ($tab_names as $tab){
    $resulting_html_code .= "{$resulting_html_code} <div class='tab'>{$tab}</div>";
}