2014-05-01 2 views
0

Я пытаюсь сохранить все файлы PHP от из файлов HTML. Сортируйте проект на основе шаблонов, но без использования каких-либо движков шаблонов, поскольку они в основном раздуты и что вам нужно будет изучить другой язык, который вообще не является PHP.Хранение HTML-файлов, отделенных от файлов PHP (на основе шаблона)

Во всяком случае, у меня есть следующий код в моем index.php файле:

<?php 

$query = "SELECT id FROM products ORDER by id"; 

$product_list = ""; 
if ($stmt = mysqli_prepare($db_conx, $query)) { 

    /* execute statement */ 
    mysqli_stmt_execute($stmt); 

    /* bind result variables */ 
    mysqli_stmt_bind_result($stmt, $id); 

    /* fetch values */ 
    while (mysqli_stmt_fetch($stmt)) { 
     $product_list .= " 

} 
} 

?> 
<?php include "template.php"; ?> 

И у меня есть этот код в моем template.php файле:

<html> 
<head> 
</head> 

<body> 

<div class='prod_box'> 
     <div class='center_prod_box'> 
      <div class='product_title'><a href='#'>$product_name</a></div> 
      <div class='product_img'><a href='#'><img src='images/" . $id . "Image1.jpg' alt='' border='0' /></a></div> 
      <div class='prod_price'><span class='reduce'>350$</span> <span class='price'>270$</span></div> 
     </div> 
     <div class='prod_details_tab'> <a href='#' class='prod_buy'>Add to Cart</a> <a href='#' class='prod_details'>Details</a> </div> 
     </div> 

</body> 
</html> 

Когда я запускаю код, я в основном получаю HTML-страница отображается точно так же, как вы видите ее выше. Таким образом, данные из базы данных MySQL не отображаются!

EDIT:

Я попытался, используя следующий код в моем while цикле и все тот же:

$id = $row["id"]; 
$product_name = $row["product_name"]; 
$price = $row["price"]; 
$shipping = $row["shipping"]; 
$category = $row["category"]; 

Может кто-то пожалуйста, помогите мне с этим?

+0

Где Вы определили '$ product_name'? '$ product_name' также не находится между метками php. – Daan

+0

@ Даан, я думал, мне не нужно это делать, потому что я использую цикл while.поэтому все нужно извлечь из базы данных mysql в цикле while. – user3592614

+0

Вместо того, чтобы изобретать колесо, посмотрите на [Усы] (http://mustache.github.io)/[MustachePHP] (https://github.com/bobthecow/mustache.php). – Thorsten

ответ

-6

Вам необходимо использовать функцию extract() в PHP, чтобы получить эту информацию. Затем он начнет работать как архитектура контроллера - View, которую вы ищете.

Например:

<?php 

$query = "SELECT id FROM products ORDER by id"; 
$product_list = ""; 

if ($stmt = mysqli_prepare($db_conx, $query)) { 

    /* execute statement */ 
    mysqli_stmt_execute($stmt); 

    /* bind result variables */ 
    mysqli_stmt_bind_result($stmt, $id); 

    /* fetch values */ 
    while (mysqli_stmt_fetch($stmt)) { 
     $product_list .= ""; 
    } 
} 

$data['product_list'] = $product_list; 
$view = 'template.php'; 
loadTemplate($view, $data); 

function loadTemplate($view, $data) 
{ 
    extract($data); 
    include($template); 
} 

?> 

Затем непосредственно использовать $product_list в разделе просмотра. Это должно сделать это.

Рабочий пример:

<?php 
    $data['test'] = 'This is a working example'; 
    $view = 'workingExampleView.php'; 
    loadTemplate($view,$data); 

function loadTemplate($viewName,$viewData) 
{ 
    extract($viewData); 
    include($viewName); 
} 
?> 

Создать новый файл, назвав его workingExampleView.php:

<html> 
<body> 
    <span><?php echo $test; ?></span> 
</body> 
</html> 
+0

Это вернет пустой '$ product_list' ... Как это решение? Не вступать в оскорбительный способ :) Просто любопытно .. –

+0

Отступ мог бы сделать и немного исправления - вы бы подстроили? – halfer

+0

Просьба уточнить, что вы, ребята, не поняли. Что делает функция extract, то, что находится в ключевой части массива, преобразует ее в отдельную переменную так же просто, как это. Это просто вопрос, что происходит из запроса должен быть правильно принят в переменную. По-видимому, так работает архитектура MVC. –

7

Я бы предложил использовать систему шаблонов для анализа файла шаблона.

Просто что-то быстро и грязно:

class Example { 
    // This will be used to save all the variables set trough the set() function within the class as an array 
    private $variables = array(); 

    function set($name,$value) { 
       // Here we are going to put the key and value in the variables array 
     $this->variables[$name] = $value; 
    } 

    function Template($file) { 
     // First set the file path of the template, the filename comes from the Template({filename}) function. 
     $file = '/templates/'.$file.'.php'; 

     // Here we are going to extract our array, every key will be a variable from here! 
     extract($this->variables); 

     // Check if it is actually a file 
     if (!is_file($file)) { 
      throw new Exception("$file not found"); 
     // Check if the file is readable 
     } elseif(!is_readable($file)) { 
      throw new Exception("No access to $file"); 
     } else { 
     // if both are fine we are going to include the template file :) 
      include($file); 
     } 
    } 
} 

и использовать его как это:

$class = new Example; 
$class->set("data", $data); 
// like passing a name: 
$class->set("user", $username); 
$class->Template("filename"); 

Затем в файле шаблона вы можете использовать $data и $user с их содержимым.

Кроме того, в вашем файле шаблона вы не видите переменную, потому что она не находится между метками PHP. Вот два примера для вас, один короткий, а другой в обычном формате:

<?=$productname?> 
// or : 
<?php echo $productname; ?> 

О, и вы на самом деле ничего не делать здесь:

while (mysqli_stmt_fetch($stmt)) { 
     $product_list .= " 

} 
} 

Вам нужно, чтобы закрыть отверстие " с "; и ничего добавляется к $product_list.

+0

извините, что это не имеет никакого смысла! – user3592614

+0

Этот код просто позволяет PHP анализировать HTML-файл и заменять переменные реальными данными, которые вы использовали $ class-> set on. Основной хороший пример для ответа на вопрос. Если @ user3592614 не понимает, то он должен посмотреть на некоторые учебники, чтобы лучше понять, как работает шаблон, поскольку это не то, что PHP был разработан, чтобы делать из коробки. – Clarkey

+0

@ JoranDenHouting: можем ли мы сделать это напрямую с помощью ключевого слова DEFINE или нет? –

0

Ваш код немного беспорядок, вы должны вернуться к основам: ваш заявление возвращается $id, а не $product как вы упомянули. Для того, чтобы вернуть что-либо из базы данных, в вашем template.html сделать:

<html> 
    <body> 

     <!-- More html here ... --> 

     <div class='product_title'> 
      <!-- Return value like this --> 
      <a href='#'><?php echo $product_name; ?></a> 
     </div> 
    </body> 
</html> 

Убедитесь, что вы проверить значение существует первый.

+0

@Amal Murali: это выглядит лучше :) thx – bart

0

В index.php

<?php 
$query = "SELECT id FROM products ORDER by id"; 

$product_list = ""; 
if ($stmt = mysqli_prepare($db_conx, $query)) { 

    /* execute statement */ 
    mysqli_stmt_execute($stmt); 

    /* bind result variables */ 
    mysqli_stmt_bind_result($stmt, $id); 

    /* fetch values */ 

} 

define("PRODUCT_NAME",$row["product_name"]); 
define("PRODUCT_ID",$row["id"]); 
define("PRODUCT_PRICE",$row["price"]); 
define("PRODUCT_SHIPPING",$row["shipping"]); 
define("PRODUCT_CATEGORY",$row["category"]); 
?> 
<?php include "template.php"; ?> 

и в template.php

<html> 
<head> 
</head> 

<body> 

<div class='prod_box'> 
    <div class='center_prod_box'> 
     <div class='product_title'><a href='#'><?=PRODUCT_NAME?></a></div> 
     <div class='product_img'><a href='#'><img src='images/<?=PRODUCT_ID?>/Image1.jpg' alt='' border='0' /></a></div> 
     <div class='prod_price'><span class='reduce'>350$</span> <span class='price'>270$</span></div> 
    </div> 
    <div class='prod_details_tab'> <a href='#' class='prod_buy'>Add to Cart</a> <a href='#' class='prod_details'>Details</a> </div> 
    </div> 

</body> 
</html> 
+0

Ваш '$ product_list. =" 'В цикле, кажется, отсутствует какой-то код? – halfer

+0

Функции 'define' должны находиться в функции' while() ', также удалять строку' $ product_list', и вы там :) –

+0

@JoranDenHouting: я рушаюсь, как глупо, потому что ваш ответ намного лучше, чем мой ответ ...... Спасибо за это –

0

Честно говоря, вы должны использовать систему в шаблона. Если вы не хотите препятствовать изучению того, как они работают, существует очень простой подход: создать очень простой. Это понадобится вам рано или поздно. Решение ниже должно быть очень простым, и оно копируется.

Основная работа такой системы является то, что вы:

  1. нагрузки файл шаблона с заполнителей строк.
  2. Процесс файл шаблона (заменить заполнители действительными значениями).
  3. Выход (или возврат) HTML с обработанным текстом.

Пример класса, который очень легко понять, может быть это:

class HtmlPage 
{ 
    private $html; 

    # Loads specified template file into $html 
    public function Load($template) 
    { 
     if (!file_exists($template)) { 
      echo "Specified template ($template) does not exist."; 
      return false; 
     } 

     $this->html = file_get_contents($template); 
     return true; 
    } 

    # Takes in an array of data, key is the placeholder replaced, value is the new text 
    public function Process($data_array) 
    { 
     if (!is_array($data_array)) return; 

     foreach ($data_array as $search => $replace) 
     { 
      # Add brackets so they don't have to be manually typed out when calling HtmlPage::Process() 
      $search = "{$search}"; 

      $this->html = str_replace($search, $replace, $this->html); 
     } 
    } 

    # Returns the page 
    public function GetHtml() 
    { 
     return $this->html; 
    } 
} 

Может использоваться как:

$page_title = "My fancy page title"; 
$page_text = "All your base are belong to us."; 

$page = new HtmlPage(); 

$page->Load('html/templates/mypage.html'); 
$page->Process(array(
    'TITLE' => $page_title, 
    'TEXT' => $page_text 
)); 
echo $page->GetHtml(); 

Приведенный выше код заменит

<html> 
    <head> 
     {TITLE} 
    </head> 

    <body> 
     <p>{TEXT}</p> 
    </body> 
</html> 

... до ...

<html> 
    <head> 
     My fancy page title 
    </head> 

    <body> 
     <p>All your base are belong to us.</p> 
    </body> 
</html> 

В вашем случае, это будет работать, как в следующем:

HTML/шаблоны/продакт-item.html:

<div class='prod_box'> 
    <div class='center_prod_box'> 
     <div class='product_title'> 
      <a href='#'>{PRODUCT_NAME}</a> 
     </div> 

     <div class='product_img'> 
      <a href='#'><img src='images/{PRODUCT_ID}/Image1.jpg' alt='' border='0' /></a> 
     </div> 

     <div class='prod_price'> 
      <span class='reduce'>{PRODUCT_PRICE_REDUCE}</span> <span class='price'>{PRODUCT_PRICE}</span> 
     </div> 
    </div> 

    <div class='prod_details_tab'> 
     <a href='#' class='prod_buy'>Add to Cart</a> <a href='#' class='prod_details'>Details</a> 
    </div> 
</div> 

PHP код:

<?php 

$query = "SELECT * FROM products ORDER by id"; 

$product_list = ""; 

if ($stmt = mysqli_prepare($db_conx, $query)) 
{ 
    /* execute statement */ 
    mysqli_stmt_execute($stmt); 

    /* bind result variables */ 
    mysqli_stmt_bind_result($stmt, $id); 

    /* fetch values */ 
    $result = mysqli_stmt_get_result($stmt); 
    while ($product = mysqli_fetch_array($result)) { 
     $product_html = new HtmlPage(); 
     $product_html->Load('html/templates/product-list.html'); 
     $product_html->Process(array(
      'PRODUCT_NAME' => $product['name']; 
      'PRODUCT_ID' => $product['id']; 
      'PRODUCT_PRICE' => $product['price']; 
      'PRODUCT_PRICE_REDUCE' => $product['price_reduce']; 
     )); 
     $product_list .= $product_html->GetHtml(); 
    } 
} 
Смежные вопросы