使用codeigniter中的一对多保存一个产品的多个图像
我是新的代码点火器。 这就是我要做的。我有存储在数据库表name products中的产品列表。对于每个产品,我需要插入多个图像。我创建了两个表,products和productimage。我已经将表productimage的product_id设置为外键,引用了表products的product_id。现在我想保存表单中的数据。这是我以前做的 但对我来说,管理CRUD(如编辑和删除图片)变得相当困难。 所以我试着用上面提到的方法。我没有找到开始的方法。谁能告诉我,我该怎么开始 好的,现在我在这里做了一些编码。这是我的控制器:使用codeigniter中的一对多保存一个产品的多个图像,codeigniter,foreign-keys,Codeigniter,Foreign Keys,我是新的代码点火器。 这就是我要做的。我有存储在数据库表name products中的产品列表。对于每个产品,我需要插入多个图像。我创建了两个表,products和productimage。我已经将表productimage的product_id设置为外键,引用了表products的product_id。现在我想保存表单中的数据。这是我以前做的 但对我来说,管理CRUD(如编辑和删除图片)变得相当困难。 所以我试着用上面提到的方法。我没有找到开始的方法。谁能告诉我,我该怎么开始 好的,现在我在这
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Products extends CI_Controller{
public function __construct()
{
parent::__construct();
$this->load->model('product_model');
$this->load->helper(array('form','url'));
//Codeigniter : Write Less Do More
}
public function index()
{
$data['products']=$this->product_model->get_product();
$this->load->view('/landing_page',$data);
}
public function create()
{
#code
$this->load->helper('form');
$this->load->library('form_validation');
$this->form_validation->set_rules('product_name','Product_Name','required');
if($this->form_validation->run()=== FALSE)
{
$this->load->view('products/create');
}
else {
$this->product_model->set_product();
$data['products']=$this->product_model->get_product();
redirect('/');
}
}
}
让我来帮你操作控制器。。你需要检查所有上传的文件。它们是$\u文件。循环遍历数组,将它们上载到服务器上,然后调用模型函数将它们添加到产品图像表中
如果CI上传对您来说太棘手。使用以下控制器功能
public function upload_images()
{
// following IF statement only checks if the user is logged in or not
if($this->session->userdata['id'] && $this->session->userdata['type']=='user')
{
if($_FILES)
{
// check whether there are files uploaded / posted
if(isset($_FILES['files'])){
$data['errors']= array();
$extensions = array("jpeg","jpg","png");
//Loop through the uploaded files
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
$file_name = $key.$_FILES['files']['name'][$key];
$file_size =$_FILES['files']['size'][$key];
$file_tmp =$_FILES['files']['tmp_name'][$key];
$i=1;
if($file_size > 2097152){
$data['errors'][$i]='File '.$i.' size must be less than 2 MB';
$i++;
}
// Set upload destination directory
$desired_dir="uploads";
if(empty($data['errors'])==true){
if(is_dir($desired_dir)==false){
mkdir("$desired_dir", 0700); // Create directory if it does not exist
}
if(is_dir("$desired_dir/".$file_name)==false){
// Upload the file.
move_uploaded_file($file_tmp,"uploads/".$file_name);
// Call a function from model to save the name of the image in images table along with entity id
$this->post_model->addImage('property_images',$file_name,$this->uri->segment(3));
}else{ //rename the file if another one exist
$new_dir="uploads/".$file_name.time();
rename($file_tmp,$new_dir) ;
}
}else{
$data['contact']=$this->admin_model->getContactDetails();
$data['images']=$this->post_model->getPropertyImages($this->uri->segment(3));
//load views
}
}
if(empty($data['errors']))
{
redirect(base_url().'dashboard');
}
else
{
$data['contact']=$this->admin_model->getContactDetails();
$data['images']=$this->post_model->getPropertyImages($this->uri->segment(3));
//load views
}
}
}
else
{
//Load view
}
}
else
{
redirect(base_url().'user/login');
}
}
如果任何人都有同样的问题,那么这里是解决方案。只需在上传功能中执行此操作即可。(我的朋友Amani Ben azzouz编写的代码)
公共函数集\u产品($id=0){
$picture=array();
$count=count($_文件['picture']['name']);
//检查用户是否上传图片
如果(!空($_文件['picture']['name'])){
foreach($\u文件为$value){
对于($s=0;$sload->library('upload',$config));
$this->upload->initialize($config);
//打印($value['name'][$s]);退出;
如果($this->upload->do_upload('picture')){
$uploadData=$this->upload->data();
$picture[]=$uploadData['file_name'];
}
}
}
}//第一个if结束
$data=array('product\U name'=>$this->input->post('product\U name'));
如果($id==0){
$this->db->insert('products',$data);
$last_id=$this->db->insert_id();
如果(!空($picture)){
foreach($p_索引=>$p_值){
$this->db->insert('images',array('product_id'=>$last_id,'images'=>$p_value));
}
}
}
否则{
$this->db->where('id',$id);
$this->db->update('products',$data);
如果(!空($picture)){
foreach($p_索引=>$p_值){
$this->db->update('images',array('product_id'=>$last_id,'images'=>$p_value));//-->这个?
}
}
}
}
这也是用于插入和更新的。如果您只是想插入,只需删除作为“id”传递的参数,并剪切If和else部分,在“If”内部编写一个简单的代码。函数contract\u upload(){//要从视图中调用的函数。
function contract_upload(){ // function to call from your view.
$data = array();
// If file upload form submitted
if(!empty($_FILES['files']['name']) AND !empty('user_id')){
$filesCount = count($_FILES['files']['name']);
for($i = 0; $i < $filesCount; $i++){
$_FILES['file']['name'] = $_FILES['files']['name'][$i];
$_FILES['file']['type'] = $_FILES['files']['type'][$i];
$_FILES['file']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
$_FILES['file']['error'] = $_FILES['files']['error'][$i];
$_FILES['file']['size'] = $_FILES['files']['size'][$i];
// File upload configuration
$uploadPath = './uploads/contract/';
$config['upload_path'] = $uploadPath;
$config['allowed_types'] = 'jpg|jpeg|png|gif';
$config['encrypt_name'] = TRUE;
// Load and initialize upload library
$this->load->library('upload', $config);
$this->upload->initialize($config);
// Upload file to server
if($this->upload->do_upload('file')){
// Uploaded file data
$fileData = $this->upload->data();
$uploadData[$i]['file_name'] = $fileData['file_name'];
$uploadData[$i]['emp_id'] = $this->input->post('user_id');
}
}
if(!empty($uploadData)){
// Insert files data into the database
$insert = $this->Contract_model->insert($uploadData);
// Upload status message
$statusMsg = $insert?'Files uploaded successfully.':'Some problem occurred, please try again.';
$this->session->set_flashdata('messageactive', $statusMsg);
}
}
redirect('contract'); // redirect link, where do you want to redirect after successful uploading of the file.
}
// Model Function
public function insert($data = array()){
$insert = $this->db->insert_batch('employee_contract_files', $data); // table name and the data you want to insert into database.
return $insert?true:false;
}
$data=array();
//如果文件上传表单已提交
如果(!empty($_FILES['FILES']['name'])和!empty('user_id')){
$filescont=count($_FILES['FILES']['name']);
对于($i=0;$i<$filescont;$i++){
$\u文件['file']['name']=$\u文件['FILES']['name'][$i];
$\u文件['file']['type']=$\u文件['FILES']['type'][$i];
$\u FILES['file']['tmp\u name']=$\u FILES['FILES']['tmp\u name'][$i];
$\u文件['file']['error']=$\u文件['FILES']['error'][$i];
$\u文件['file']['size']=$\u文件['FILES']['size'][$i];
//文件上载配置
$uploadPath='。/uploads/CONTACT/';
$config['upload_path']=$uploadPath;
$config['allowed_types']='jpg | jpeg | png | gif';
$config['encrypt_name']=TRUE;
//加载并初始化上载库
$this->load->library('upload',$config);
$this->upload->initialize($config);
//将文件上载到服务器
如果($this->upload->do_upload('file')){
//上载的文件数据
$fileData=$this->upload->data();
$uploadData[$i]['file_name']=$fileData['file_name'];
$uploadData[$i]['emp_id']=$this->input->post('user_id');
}
}
如果(!empty($uploadData)){
//将文件数据插入数据库
$insert=$this->Contract\u model->insert($uploadData);
//上载状态消息
$STATUSSMSG=$insert?“已成功上载文件”。:“出现问题,请重试。”;
$this->session->set_flashdata('messageactive',$statusMsg);
}
}
重定向('contract');//重定向链接,成功上载文件后要重定向到哪里。
}
//模型函数
公共函数插入($data=array()){
$insert=$this->db->insert_batch('employee_contract_files',$data);//表名和要插入数据库的数据。
返回$insert?真:假;
}
记住一件事,您应该按照以下方式编写HTML:
<input type="file" name="files[]" multiple />
首先,您可以创建具有最少必填字段的产品,然后将图像上载到该产品。在magento中,他们就是这样做的。哦,您不在模型中上载图像。虽然CI不会阻止您。建议您在控制器中上载图像谢谢,先生,但我有一个问题。让我先用我已编辑的内容编辑我的问题一个。然后告诉我。你看到我的代码了吗?如果可以的话,请给我一些帮助。请看一下我的代码。上传图片()是我的控制器功能。如果你想添加一个产品,然后在同一页上载图像。你需要先将产品添加到产品表中,返回产品id,然后循环遍历图像文件,上载它们,并通过调用模型中的函数将其名称保存在产品图像表中。好的,让我来试一试。我正在集成你的我的控制器中的代码。:)
function contract_upload(){ // function to call from your view.
$data = array();
// If file upload form submitted
if(!empty($_FILES['files']['name']) AND !empty('user_id')){
$filesCount = count($_FILES['files']['name']);
for($i = 0; $i < $filesCount; $i++){
$_FILES['file']['name'] = $_FILES['files']['name'][$i];
$_FILES['file']['type'] = $_FILES['files']['type'][$i];
$_FILES['file']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
$_FILES['file']['error'] = $_FILES['files']['error'][$i];
$_FILES['file']['size'] = $_FILES['files']['size'][$i];
// File upload configuration
$uploadPath = './uploads/contract/';
$config['upload_path'] = $uploadPath;
$config['allowed_types'] = 'jpg|jpeg|png|gif';
$config['encrypt_name'] = TRUE;
// Load and initialize upload library
$this->load->library('upload', $config);
$this->upload->initialize($config);
// Upload file to server
if($this->upload->do_upload('file')){
// Uploaded file data
$fileData = $this->upload->data();
$uploadData[$i]['file_name'] = $fileData['file_name'];
$uploadData[$i]['emp_id'] = $this->input->post('user_id');
}
}
if(!empty($uploadData)){
// Insert files data into the database
$insert = $this->Contract_model->insert($uploadData);
// Upload status message
$statusMsg = $insert?'Files uploaded successfully.':'Some problem occurred, please try again.';
$this->session->set_flashdata('messageactive', $statusMsg);
}
}
redirect('contract'); // redirect link, where do you want to redirect after successful uploading of the file.
}
// Model Function
public function insert($data = array()){
$insert = $this->db->insert_batch('employee_contract_files', $data); // table name and the data you want to insert into database.
return $insert?true:false;
}
<input type="file" name="files[]" multiple />