THẢO LUẬN

thg 8 21, 2018 6:45 SA

phần check old_url có vẻ không tốt lắm do khi generate sẽ có khả năng trùng, khi đó sẽ đệ quy lại, csdl ngày càng lớn thì khả năng trùng càng cao. có thể giải quyết bằng cách generate shorted url từ chính id của model có thể sử dụng gem https://hashids.org/ruby/ .

+1

Tại sao thí chủ không dùng dấu # để tạo heading trong bài viết nhỉ? Bonus cho thí chủ cái link này nè: Cách sử dụng markdown trên Viblo.

+2
thg 8 21, 2018 3:43 SA

for ($i = 0; $i ++; $i < 5) { echo $i; }

cái này viết sai nhé phải vậy mới đúng chứ

<?php for ($i = 0; $i < 5; $i ++) { echo $i; }
+1
thg 8 21, 2018 3:40 SA

Thank bạn đã góp ý. Ở đây mình đang nói ở dev nên mình chạy dev hoặc watch. Nếu project nhỏ thì không khác nhau mấy, nhưng những project lớn mình nghỉ sẽ có sự khác biệt.

0
thg 8 21, 2018 3:19 SA

@mih2t9x Sr bạn, để mình nói rõ hơn vụ custom bộ render nhé. Như mình có nói

  1. SMDE dùng markdown-it để parse markdown. Bạn custom lại phần render dùng marked tức chính là dùng bộ render markdown mặc định của SMDE. Còn cách dùng marked hay markdown-it để render bạn vui lòng đọc documentation giúp mình nhé. => Mất rất ít thời gian và dễ dàng mở rộng thêm nhiều.
  2. Với câu hỏi về html, mình đã trả lời bạn trước đó tại https://viblo.asia/c/b85oWqqgO52. Bấm F12 bạn có thể thấy rõ Viblo gọi api trả về nội dung theo cú pháp markdown mà người dùng nhập. => Thật rõ ràng là Viblo lưu markdown vào DB rồi.
+2

Bài viết rất hữu ích, mong bạn có thêm nhiều bài viết về lĩnh vực này.

0
thg 8 21, 2018 3:06 SA

Khi bạn build ra file js trên môi trường product thì có thể dùng lệnh "npm run prod" để cho file nhỏ đi, mình thấy giảm đáng kể dung lượng đó. Chứ tách ra từng file như này mình nghĩ có thể lâu hơn 😃)

0

Cảm ơn bạn đã quan tâm bài viết này của mình. Coming soon nha bạn 😄

0
thg 8 21, 2018 2:24 SA

Okie bạn 😃

0
thg 8 21, 2018 2:15 SA

@huukimit Cảm ơn bạn đã trả lời câu hỏi của mình.

  • Câu trả lời của bạn mình đã hiểu nhưng ý của mình là vẫn dữ bộ render mặc định của nó và chỉ custom lại những phần mình muốn thôi. chứ custom lại toàn bộ thì lại mất thời gian quá, bạn có cách nào chắp vá kiểu thế ko.

  • À mình muốn hỏi nữa là giờ Viblo đang lưu trong DB là dạng markdown hay html vậy bạn. và khi trả về cho App mình mới render rồi trả lại hay sao bạn nhỉ. và nếu lưu kiểu markdown thì khi render ra html trả về thì dùng thư viện nào vậy bạn.

  • Vì mình khi lưu thì lưu dạng html xong khi edit minhf dùng thư viện turndownService để convert lại thành dạng markdown nên nó xảy ra nhiều lỗi và những ký hiệu nó khác nhau quá. Cảm ơn bạn nhiều

0

Nếu bạn không muốn phải code từng dòng thì có thể sử dụng một số thư viện trên nền jquery như là uploader, bạn có thể tham khảo ở trên đây nhé, t thấy họ hướng dẫn cách tải thư viện về và có ví dụ khá chi tiết 😃 https://github.com/danielm/uploader

0
thg 8 21, 2018 1:41 SA

Do hồi trước em có làm outsourcing và freelance nên có sử dụng mấy loại ORM đó theo yêu cầu thôi ạ 😄 😄 😄

0

Nhờ bạn giúp mình 1 file với làm hoài chẳn được Trong file function:

function taobaiviet($ID="",$Loai=""){ //--- Neu chua dang nhap thi bat dang nhap if($this->session->userdata('permission')!=1){ redirect(base_url()); exit(); } if($ID==0){ $ID=""; } $data['error']=""; $data['Loai']=$Loai; //trinh soan thao include(APPPATH . 'includes/trinhsoanthao.php');

    if($this->form_validation->run('formTaoBaiViet')==FALSE)
    {
    }
    else
    {  
         $MenuCha=$this->input->post("MenuCha");
         if($MenuCha!=0){
            $menu=$this->default_model->getInfoID($this->_table,array("$this->_id" => $MenuCha));
            $capmenu=$menu['CapMenu']+1;
         }elseif($MenuCha==0){
            $capmenu=1;
         }elseif($MenuCha==""){
            $capmenu='';
         }
         
         $Loai=$this->input->post("Loai");
		  if (!empty($_FILES['picture']['name'])) {
			$config['upload_path'] = 'upload/baiviet';
			$config['allowed_types'] = 'jpg|jpeg|png|gif';
			$config['file_name'] = $_FILES['picture']['name'];

			$this->load->library('upload/baiviet', $config);
			$this->upload->initialize($config);

			if ($this->upload->do_upload('picture')) {
			  $uploadData = $this->upload->data();
			  $data["img"] = $uploadData['file_name'];
			} else{
			  $data["img"] = '';
			}
		  }else{
			$data["img"] = '';
		  }
          
         $add = array(
                    "TieuDe"   => $this->input->post("TieuDe"),
                    "Loai"   => $Loai,
                    "Link"   => $this->input->post("Link"),
                    "Title"   => $this->input->post("Title"),
                    "H1"   => $this->input->post("H1"),
                    "H2"   => $this->input->post("H2"),
                    "Keyword" => $this->input->post("Keyword"),
                    "Description"   => $this->input->post("Description"),
                    "NoiBat"   => $this->input->post("NoiBat"),
					"img"	=> $this->input->post("img"),
                    "NoiDung"  => $this->input->post("NoiDung"),
                    "TrangThai"=> $this->input->post("TrangThai"),
                    "NguoiGui" => $this->session->userdata('userid'),
                    "MenuCha"  => $MenuCha,
                    "CapMenu"  => $capmenu
                     );
         if($Loai=='Banner'){
            $add['ViTri']=$this->input->post("ViTri");
         }
       //tao khong thanh cong
          if($ID==""){
            $this->default_model->addDuLieuMoi($this->_table,$add);
          }else{
            $this->default_model->updateDuLieu($this->_table,$add,array("$this->_id" => $ID));
          }
          
          //
          
          if($Loai=="MenuFooter"){
            $MenuFooters=$this->default_model->getTableRows($this->_table,1000,0,'','',$this->_id,"",array("Loai" => "MenuFooter"));
            $code='<?
            ';
            foreach($MenuFooters as $MenuFooter){ 
                $code.="
                \$route['".stripUnicode($MenuFooter['TieuDe'])."'] = 'baiviet/xembaiviet/".$MenuFooter['IDBaiViet']."/Xem_GioiThieu';
                "; 
            }//print_r($code);
            //error_reporting(E_ALL);
            file_put_contents(APPPATH . 'config/blog_urls.php',$code);
          }
          if($Loai=="MenuHeader"){
            $MenuHeaders=$this->default_model->getTableRows($this->_table,1000,0,'','',$this->_id,"",array("Loai" => "MenuHeader"));
            $code='<?
            ';
            foreach($MenuHeaders as $MenuHeader){
              if($MenuHeader['MenuCha']!=455&&$MenuHeader['IDBaiViet']!=455){
                $menucha2=$this->default_model->getInfoID($this->_table,array("$this->_id" => $MenuHeader['MenuCha']));
                include APPPATH . 'modules/baiviet/views/Loai.php';
                $searchs=array_flip($searchs);
                $code.="
                \$route['".strtolower(isset($MenuHeader['Link'])&&$MenuHeader['Link']!=''?$MenuHeader['Link']:stripUnicode($MenuHeader['TieuDe']))."'] = 'baiviet/getdanhsachbaiviet/TinTuc/1//default/".$MenuHeader['IDBaiViet']."';
                \$route['".strtolower(isset($MenuHeader['Link'])&&$MenuHeader['Link']!=''?$MenuHeader['Link']:stripUnicode($MenuHeader['TieuDe']))."/(:num)'] = 'baiviet/getdanhsachbaiviet/TinTuc/$1//default/".$MenuHeader['IDBaiViet']."';
                \$route['".strtolower(isset($MenuHeader['Link'])&&$MenuHeader['Link']!=''?$MenuHeader['Link']:stripUnicode($MenuHeader['TieuDe']))."/(:any)-(:num)'] = 'baiviet/xembaiviet/$2/Xem_BaiViet//default/".$MenuHeader['IDBaiViet']."';
                ";
            }
            if($MenuHeader['MenuCha']==455||$MenuHeader['IDBaiViet']==455){
                $code.="
                \$route['".strtolower(isset($MenuHeader['Link'])&&$MenuHeader['Link']!=''?$MenuHeader['Link']:stripUnicode($MenuHeader['TieuDe']))."'] = 'salon/salonoto/".$MenuHeader['IDBaiViet']."';
                \$route['".strtolower(isset($MenuHeader['Link'])&&$MenuHeader['Link']!=''?$MenuHeader['Link']:stripUnicode($MenuHeader['TieuDe']))."/(:num)'] = 'salon/salonoto/".$MenuHeader['IDBaiViet']."/$1';
                \$route['".strtolower(isset($MenuHeader['Link'])&&$MenuHeader['Link']!=''?$MenuHeader['Link']:stripUnicode($MenuHeader['TieuDe']))."/(:any)-(:num)'] = 'salon/salonoto/".$MenuHeader['IDBaiViet']."/$2';
                ";
            }
            //print_r($code);
            //error_reporting(E_ALL);
            file_put_contents(APPPATH . 'config/sub_urls.php',$code);
            }
          }
          if($Loai=="DanhMuc"){
            $code='<?
            ';
            $menucat=$this->default_model->getTableRows($this->_table,4000,0,'','',$this->_id,"",array('Loai'=>'DanhMuc','CapMenu'=>1,'TrangThai'=>1));  
 foreach($menucat as $val){$stt++;
    $code.= "
    \$route['".strtolower(isset($val['Link'])&&$val['Link']!=''?$val['Link']:stripUnicode($val['TieuDe']))."/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$1';
    \$route['".strtolower(isset($val['Link'])&&$val['Link']!=''?$val['Link']:stripUnicode($val['TieuDe']))."'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."';
    ";
    if($val['Link']!=''){
      $code.= " 
    \$route['".$val['Link']."/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$1';
    \$route['".$val['Link']."'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."';;
    \$route['".$val['Link']."-([a-z0-9-]+)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/1/$1';
    \$route['".$val['Link']."-([a-z0-9-]+)/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$2/$1';
    ";  
    }
 }
 
 $menucat=$this->default_model->getTableRows($this->_table,4000,0,'','',$this->_id,"",array('Loai'=>'DanhMuc','CapMenu'=>2,'TrangThai'=>1)); //print_r($menucat);
 foreach($menucat as $val){$stt++;
 $menucha=$this->default_model->getInfoID($this->_table,array('IDBaiViet'=>$val['MenuCha']));
    $code.= "
    \$route['".strtolower(isset($val['Link'])&&$val['Link']!=''?$val['Link']:stripUnicode($val['TieuDe']))."/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$1';
    \$route['".strtolower(isset($val['Link'])&&$val['Link']!=''?$val['Link']:stripUnicode($val['TieuDe']))."'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."';
    \$route['".strtolower(isset($val['Link'])&&$val['Link']!=''?$val['Link']:stripUnicode($val['TieuDe']))."-([a-z0-9-]+)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/1/$1';
    \$route['".strtolower(isset($val['Link'])&&$val['Link']!=''?$val['Link']:stripUnicode($val['TieuDe']))."-([a-z0-9-]+)/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$2/$1';
    ";
    if($val['Link']!=''){
      $code.= " 
    \$route['".$val['Link']."/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$1';
    \$route['".$val['Link']."'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."';
    \$route['".$val['Link']."-([a-z0-9-]+)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/1/$1';
    \$route['".$val['Link']."-([a-z0-9-]+)/(:num)'] = 'dangtin/xemdanhmuc/HangXe/".$val['IDBaiViet']."/$2/$1';
    ";  
    }
 }
 include_once(APPPATH . 'includes/doctien.php');
 file_put_contents(APPPATH . 'config/ext_urls.php',$code); 
          }          
          //
          
          $region=$this->input->get("region");
	$exregion=explode('-',$region);
	$exregion[end(array_keys($exregion))]=end($exregion)+1;
	$exregion=implode('-',$exregion);
				  redirect(base_url()."baiviet/quanlybaiviet/g/$Loai?region=".$exregion);
          exit(); 
          
    }
    $data['users']=$this->default_model->getInfoID($this->_table,array("$this->_id" => $ID)); 
    if($data['users']==FALSE){
        $where=$Loai;
    }else{
        $where=$data['users']['Loai'];
        $Loai=$where;
    }
    if($where=='TinTuc'){
        $where=array("Loai" => "MenuHeader");
    }elseif($where=='TuVanXe'){
        $where=array("Loai" => "MenuHeader","MenuCha"=>25);
    }elseif($where=='DanhGiaXe'){
        $where=array("Loai" => "MenuHeader","MenuCha"=>27);
    }elseif($where=='KinhNghiem'){
        $where=array("Loai" => "MenuHeader","MenuCha"=>15);
    }elseif($where=='SoSanhXe'){
        $where=array("Loai" => "MenuHeader","MenuCha"=>42);
    }else{
        $where=array("Loai" => "$where");
    }
    $data['menu']=$this->default_model->getTableRows($this->_table,1000,0,'CapMenu asc, SapXep asc, '.$this->_id.' desc','',$this->_id,"",$where);
    $data['template']='taobaiviet';
    $data['title'] = $this->lang->line('lable_'.$Loai.'');
    $this->load->view('admin/admin',$data);
}

//quan ly thong bao cho admin
function quanlybaiviet($sucess="",$phanloai="",$page=1){
    
    //--- Neu chua dang nhap thi bat dang nhap
    if($this->session->userdata('permission')!=1){
        redirect(base_url());
        exit();
    }
    //phan trang hien thi
    $noibang="";
    $dieukien=array("Loai" => "$phanloai");
    $url_phantrang=base_url().'baiviet/quanlybaiviet/action/'.$phanloai.'/';
    $sort='';
    if($page==1){
        $this->session->set_userdata(array('cha'=>''));
    }
    if($this->input->get('cha')!=''){
        $this->session->set_userdata(array('cha'=>$this->input->get('cha')));
    }
    if($this->session->userdata('cha')!=''){
             $MenuChaID=$this->session->userdata('cha');
             $set_dk=1;
             include(APPPATH . 'modules/dangtin/controllers/HangXe.php');
             $dieukien["MenuCha IN ($MenuChaID $addIN) and IDBaiViet !="]='';  
        } 
    $bien_sapxep_hienthi=$sort.'SapXep asc, '.$this->_id.' desc';
        $user['template']='quanlybaiviet';
        $user['Loai']=$phanloai;
        $user['title'] = $this->lang->line('lable_'.$phanloai.'');
        
    if($phanloai=='MenuHeader'||$phanloai=='MenuFooter'||$phanloai=='MenuHuongDan'||$phanloai=='DanhMuc'||$phanloai=='HuongDan'){
        $sort='CapMenu asc, ';
        include APPPATH . 'includes/timkiem_admin.php';
        $config['total_rows'] = $this->default_model->totalRows($this->_table,$loai,$this->_id,$dieukien,$noibang);
        $user['data']=$this->default_model->getTableRows($this->_table,'',0,$bien_sapxep_hienthi,$loai,$this->_id,$noibang,$dieukien);
        $user['totalrow']=$config['total_rows'];
        $this->load->view('admin/admin',$user);
    }else{ 
        $config['uri_segment'] = 5; 
        include(APPPATH . 'includes/phantrang_admin.php'); 
    }
    
}
//xem thong bao
function xembaiviet($ID="",$Loai="",$Domain='',$Loai_template='default') {
    if($Domain!=''){
        $data['salon_info']=$this->default_model->getInfoID('salon',array("Domain" => $Domain));  
    }
    
    $data['users']=$this->default_model->getInfoID($this->_table,array("$this->_id" => $ID)); 
    $this->default_model->updateDuLieu($this->_table,array('LuotXem'=>$data['users']['LuotXem']+1),array("IDBaiViet" => $ID));
    if($data['users']!=FALSE){
        $data['title'] =  $data['users']['Title']!=''?$data['users']['Title']:$data['users']['TieuDe'];
        $data['description'] = $data['users']['Description'];
        $data['keyword'] = $data['users']['Keyword'];
        $data['cha_info']=$this->default_model->getInfoID('baiviet',array("IDBaiViet" => $data['users']['MenuCha'])); 
        if($Loai=="ThongBao"){
            $data['template']='Xem_ThongBao';
        }
        else{
            $data['template']=$Loai;
        }
        
        $this->load->view($Loai_template,$data);
    }else{
        show_404();
    }
	$this->output->cache(30) ;
}

Trong bài đăng

Chổ đăng ảnh:

<?php if($Loai!='DanhMuc'||(isset($users['Loai'])&&$users['Loai']!='DanhMuc')):?>
                                    <div class="form-group">
										<td><input name="img" class="form-control" type="file" value="<?php set_value('img')?>"></td>
                                        <label class="form-label" for="NoiDung">Nội dung</label> 
                                        <div class="controls">
                                            <?php
     
												if(isset($users['TieuDe'])){
													$NoiDung=$users['NoiDung'];
												}else{
													$NoiDung=set_value('NoiDung');
												}
												echo $this->ckeditor->editor("NoiDung",html_entity_decode($NoiDung)); 
												
												 
												?>
                                        </div>
                                    </div>
                                    <? endif?>

Bạn chỉnh lại cho mình với nhé

thanks

0
Avatar
đã bình luận cho bài viết
thg 8 21, 2018 1:20 SA

Cảm ơn về nhận xét của bạn, mà bạn kể ra một hồi LinQ, hibernate các ORM, ... mình mới đi search google xem nó là gì này. Thật là bao la trời biển @@

0

bá vãi, toàn machine learning

+1

B cố gắng biến lời văn thành của bạn, sẽ giúp ng đọc dễ hiểu và ko bị ngang

+1

Mình đã cố gắng dịch nhưng có lẽ không được hay lần sau mình sẽ cố gắng cải thiện và hi vọng giúp ích được ai đó. Có link bên dưới bạn có thể vào đọc trực tiếp thank bạn đã góp ý !

+1
thg 8 20, 2018 2:37 CH

Bài viết rất hay và bổ éc, em thích nhất câu này 😄

Sử dụng cách nào để khử N + 1 query thì mỗi framework sẽ có cách khái quát và trình bày riêng, nhưng bản chất thì vẫn là xoay quanh sử dụng select in() hay joins.

Hồi trước khi đi làm sử dụng sql thuần qua các sp, trigger thì chủ yếu làm thế nào để tăng performance trong các câu truy vấn của mình. Về sau dùng LinQ, activerecord, hibernate các ORM thấy nhiều bạn đề cập đến N+1 query lúc đó mới hỏi quái lại sao mình không biết cái này nhỉ =)) 😄 😅.

Cách anh viết cũng rất hay dễ đọc 😄. Chắc phải chăm đọc nhiều bài của các tiền bối để nâng cao tay viết mới được.

p/s: Thank for sharing

+1

Tks,,,nhưng có vẻ copy hay google dịch mà có những đoạn đọc không đã

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí