Как создать шаблон для групп флажков, чтобы избежать дублирования кода на стороне сервера?


Недавно я нашел вопрос (stackoverflow.com/questions/30556100/how-to-uncheck-all-checkboxes-if-one-checkbox-checked). Теперь я хотел бы создать шаблон для генерации HTML, так как кажется хорошей идеей избежать дублирования кода. Вот как генерируется мой html-код:

// ---------------------------------------
// --- Populate "Body Type" dropdown list:
// ---------------------------------------

// for populate body types:
$bodytype = array(); 

// Select exsiting body type from database:  
$prep_stmt = " SELECT id,   name FROM body_type";

$stmt = $mysqli->prepare($prep_stmt);

if ($stmt) {
    // Bind "$userId" to parameter.
    //$stmt->bind_param('i', $userId);  
    // Execute the prepared query.
    $stmt->execute();    
    $stmt->store_result();

    // get variables from result.
    $stmt->bind_result($id, $name);

    // Fetch all the records:
    while ($stmt->fetch()) {

        // XSS protection as we might print these values
        $name = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $name);
        $id   = filter_var($id,FILTER_SANITIZE_NUMBER_INT);

        $type  = "<label class='checkbox-inline'>\n";
        if ($name == 'Any'){
            $type .=    "<input type='checkbox' id='bodyTypeAny' name='bodyTypeCheck[]' value='{$id}'> {$name}\n";
        } else {
            $type .=    "<input type='checkbox' id='' name='bodyTypeCheck[]' value='{$id}'> {$name}\n";
        }
        $type .= "</label>\n";  
        //Add body types to array
        $bodytype[] = $type;    
    }   
} else {
    echo 'Database error';
}   

// Close the statement:
$stmt->close();
unset($stmt);

Весь PHP-код для групп флажков: http://pastebin.com/NXN6ZzcK

Как я могу реализовать функцию, которая создавала бы группу флажков, поэтому я бы просто назвал ее функция.

Надеюсь, кто-нибудь сможет мне помочь. Спасибо.

Author: TNK, 2015-05-31

1 answers

Прежде чем выполнять следующие действия, сохраните свою рабочую версию где-нибудь, чтобы убедиться, что вы можете выполнить откат, если вам это необходимо.

Вы могли бы создать класс для шаблонов, например:

class TemplateEngine {

    public static function getCheckboxTemplate($input, $templateName) {
        $template = "";
        foreach ($input as $element) {
            $template .= "<label class='checkbox-inline'>\n";
            $template .= "<input type='checkbox' ".(($element["name"] === "Any") ? ("id='".$templateName."Any'") : (""))." name='".$templateName."Check' value='".$element["id"]."'>".$element["name"]."\n";
            $template .= "</label>\n";
        }
        return $template;
    }

}

Убедитесь, что вы создали этот класс в отдельном файле, где вы также будете реализовывать более поздние шаблоны, и вам потребуется/включить этот файл. И тогда вы можете использовать его следующим образом:

// ---------------------------------------
// --- Populate "Body Type" dropdown list:
// ---------------------------------------

$template = "";
// Select exsiting body type from database:  
$prep_stmt = " SELECT id,   name FROM body_type";

$stmt = $mysqli->prepare($prep_stmt);

if ($stmt) {
    // Bind "$userId" to parameter.
    //$stmt->bind_param('i', $userId);  
    // Execute the prepared query.
    $stmt->execute();    
    $stmt->store_result();

    // get variables from result.
    $stmt->bind_result($id, $name);
    $input = array();

    // Fetch all the records:
    while ($stmt->fetch()) {

        $input[]= array("name" => preg_replace("/[^a-zA-Z0-9_\-]+/", "", $name), "id" => filter_var($id,FILTER_SANITIZE_NUMBER_INT));
    }
    $template = TemplateEngine::getCheckboxTemplate($input, "bodyType");   
} else {
    echo 'Database error';
}   

// Close the statement:
$stmt->close();
unset($stmt);

И вместо использования $bodytype array, вы можете просто:

echo $template;

Код не проверен. Если есть опечатки, дайте мне знать:)

РЕДАКТИРОВАТЬ: Дальнейшее создание шаблонов:

class TemplateEngine {

    public static function getCheckboxTemplate($input, $templateName) {
        $template = "";
        foreach ($input as $element) {
            $template .= "<label class='checkbox-inline'>\n";
            $template .= "<input type='checkbox' ".(($element["name"] === "Any") ? ("id='".$templateName."Any'") : (""))." name='".$templateName."Check' value='".$element["id"]."'>".$element["name"]."\n";
            $template .= "</label>\n";
        }
        return $template;
    }

    public static function getCheckboxDatabaseWrapperTemplate($tableName, $templateName, $mysqli) {
        $template = "";
        // Select exsiting body type from database:  
        $prep_stmt = " SELECT id,   name FROM ".$tableName;

        $stmt = $mysqli->prepare($prep_stmt);

        if ($stmt) {
            // Bind "$userId" to parameter.
            //$stmt->bind_param('i', $userId);  
            // Execute the prepared query.
           $stmt->execute();    
           $stmt->store_result();

           // get variables from result.
           $stmt->bind_result($id, $name);
           $input = array();

           // Fetch all the records:
           while ($stmt->fetch()) {

               $input[]= array("name" => preg_replace("/[^a-zA-Z0-9_\-]+/", "", $name), "id" => filter_var($id,FILTER_SANITIZE_NUMBER_INT));
           }
           $template = TemplateEngine::getCheckboxTemplate($input, $templateName);   
       } else {
           echo 'Database error';
       }   

       // Close the statement:
       $stmt->close();
       unset($stmt);
       return $template;
    }

}
 4
Author: Lajos Arpad, 2015-05-31 18:12:12