如何在CodeIgniter中生成HTML文件并实现路径存储与锚点输出
Got it, let's walk through exactly how to build this in CodeIgniter—this is a super common setup for dynamic service pages, so I’ll break it down step by step with working code examples.
First, you’ll need a database table to store service details and the path to their generated HTML files. Here’s a sample SQL schema for a services table:
CREATE TABLE services ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, brief_content TEXT NOT NULL, detailed_content TEXT NOT NULL, -- For the full detail page html_file_path VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Next, create a folder to store your generated HTML files. I recommend putting it in the public directory (CodeIgniter’s web root) so it’s accessible via URL—name it services. Make sure it has write permissions:
- On Linux/macOS: Run
chmod -R 755 public/services(use 777 for testing, but lock it down to 755 in production). - On Windows: Right-click the folder → Properties → Security → Give write access to your web server user.
Create a Service_model.php in application/models/ to handle all service-related DB actions:
<?php class Service_model extends CI_Model { // Add a new service and return its ID public function add_service($data) { $this->db->insert('services', $data); return $this->db->insert_id(); } // Get a single service by ID public function get_service($id) { return $this->db->get_where('services', ['id' => $id])->row(); } // Update a service's HTML file path public function update_file_path($id, $path) { $this->db->where('id', $id); return $this->db->update('services', ['html_file_path' => $path]); } // Get all services for the homepage public function get_all_services() { return $this->db->get('services')->result(); } }
Make a Services.php controller in application/controllers/ to handle adding services and generating their detail HTML:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Services extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('Service_model'); $this->load->helper(['file', 'url']); // Load helpers for file writing and URLs } // Example: Handle form submission to add a service public function create() { // Get form data (sanitize it first!) $service_data = [ 'title' => $this->input->post('title', TRUE), 'brief_content' => $this->input->post('brief_content', TRUE), 'detailed_content' => $this->input->post('detailed_content', TRUE) ]; // Insert basic service data into DB first to get an ID $service_id = $this->Service_model->add_service($service_data); if ($service_id) { // Fetch the full service record to pass to the template $service = $this->Service_model->get_service($service_id); // Generate HTML content from a view template (returns string instead of outputting) $html_content = $this->load->view('service_detail_template', ['service' => $service], TRUE); // Define the file path (use FCPATH to get CodeIgniter's root directory) $file_name = "service{$service_id}.html"; $full_path = FCPATH . "services/{$file_name}"; $web_path = "services/{$file_name}"; // This is what we'll store in the DB // Write the HTML file if (write_file($full_path, $html_content)) { // Update the DB with the web-accessible file path $this->Service_model->update_file_path($service_id, $web_path); redirect('home'); // Go back to homepage after success } else { echo "Oops! Failed to create the detail page. Check folder permissions."; } } else { echo "Failed to save service details to the database."; } } }
Create a service_detail_template.php in application/views/ to define the structure of your service detail HTML:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title><?php echo htmlspecialchars($service->title); ?></title> <style> /* Add your custom styles here */ .service-detail { max-width: 800px; margin: 2rem auto; padding: 0 1rem; } h1 { color: #2c3e50; } </style> </head> <body> <div class="service-detail"> <h1><?php echo htmlspecialchars($service->title); ?></h1> <div class="brief"> <p><?php echo htmlspecialchars($service->brief_content); ?></p> </div> <div class="full-content"> <?php echo nl2br(htmlspecialchars($service->detailed_content)); ?> </div> </div> </body> </html>
Update your Home.php controller to fetch all services and pass them to the homepage view:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Home extends CI_Controller { public function index() { $this->load->model('Service_model'); $data['services'] = $this->Service_model->get_all_services(); $this->load->view('home', $data); } }
Then, in application/views/home.php, render the service cards with anchor links to their detail pages:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home - Our Services</title> <style> .service-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; padding: 2rem; } .service-card { border: 1px solid #eee; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .service-card a { display: inline-block; margin-top: 1rem; padding: 0.5rem 1rem; background: #3498db; color: white; text-decoration: none; border-radius: 4px; } .service-card a:hover { background: #2980b9; } </style> </head> <body> <h1>Our Services</h1> <div class="service-cards"> <?php foreach ($services as $service): ?> <div class="service-card"> <h2><?php echo htmlspecialchars($service->title); ?></h2> <p><?php echo htmlspecialchars($service->brief_content); ?></p> <a href="<?php echo base_url($service->html_file_path); ?>" target="_blank">View Full Details</a> </div> <?php endforeach; ?> </div> </body> </html>
- Security: Always sanitize user input (we used
TRUEin$this->input->post()to enable XSS filtering) and escape output withhtmlspecialchars()to prevent XSS attacks. - Updates: If you need to edit a service, add an update method in the controller that regenerates the HTML file and overwrites the old one.
- Caching: For high-traffic sites, consider caching the generated HTML files further, but this setup works great for most use cases.
内容的提问来源于stack exchange,提问作者Kh.Mubashar Irshad

