Zadejte hledaný výraz...

Začátky s MVC (CodeIgniter) zhodnocení scriptu

Ondřej Záruba
verified
rating uzivatele
30. 7. 2011 16:53:58
Zdravím,
doufám, že mě neukamenujte když sem plácnu jeden ze svých amatérských výtvorů, ale rád bych slyšel co dělám špatně. Přidat možnost zhodnocení kódu mi hodně chyběla a sem rád že se zde takové téma objevilo :).
Nějaký ten čas se už PHP věnuji, ale nikdy jsem neměl možnost zjistit, jestli to co píšu je správné. To že to funguje nemusí znamenat správné řešení a já bych nerad psal nějaké paskvily.
Tolik na úvod a teď ke scriptu:
Seznamuji se s CodeIgniter a mám tu první menší aplikaci napsanou v něm.
Účel: Ze zadané adresy na diskusi na d.jpw.cz hlídat nové posty (stále mi u nich chybí možnost sledovat téma) a upozorňovat, pokud se objeví nový komentář.
Controller:
if(!defined('BASEPATH')) exit('No direc script access allowed');
class Djpw extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('channelControll_model');
}
public function index()
{
$data = $this->channelControll_model->check();
if(!$data)
{
$data = null;
}
$this->template->setTemplate('title', 'djpw feed');
$this->template->viewTemplate('index_view', $data);
}
public function addChannel()
{
$this->template->setTemplate('title', 'Add channel');
$this->form_validation->set_rules('addChannel', 'Add channel', 'trim|required|is_url|unique')
->set_error_delimiters('', '');
if($this->form_validation->run())
{
if($this->channelControll_model->addChannel())
{
$this->session->set_flashdata('urlExist', '

This URL is added

');
redirect('');
}
}
else
{
$error = validation_errors();
if($error)
{
$this->session->set_flashdata('urlAdd', '

'.$error.'

');
}
redirect('');
}
}
public function check($idPost)
{
$url = $this->channelControll_model->visit($idPost);
redirect($url);
}
public function deletePost($idPost)
{
$query = $this->db->where('id', $idPost)
->delete('posts');
if($this->db->affected_rows())
{
$this->session->set_flashdata('deletePost', '

The post is deleted!

');
redirect('');
}
else
{
return false;
}
}
}
Model channelControll_model:
if(!defined('BASEPATH')) exit('No direct script access allowed');
class ChannelControll_model extends CI_Model
{
public function addChannel()
{
preg_match_all("~
(+?)
~", selectSourceCode($this->input->post('addChannel')), $posts);
$insertData = array(
'id' => '',
'url' => $this->input->post('addChannel'),
'posts' => count($posts),
);
$query = $this->db->insert('posts', $insertData);
return $this->db->affected_rows();
}
public function check()
{
$data = null;
$query = $this->db->query("SELECT url FROM posts ORDER BY id DESC");
$url = $query->result_array();
for($i = 0; $i < count($url); $i++)
{
$data = $url;
}
if($data)
{
return $this->channelControll_model->loadPost($data);
}
}
public function loadPost($urls)
{
foreach($urls as $key => $url)
{
preg_match_all("~
(+?)
~", selectSourceCode($url), $posts);
preg_match_all('~(+?)~', selectSourceCode($url), $title);
$query = $this->db->query("SELECT posts,id FROM posts WHERE url = '".$url."' ORDER BY id ASC");
$countPost = $query->result_array();
$id = $query->result_array();
if($countPost < count($posts))
{
$data = array(
'titlePost' => mb_convert_encoding(character_limiter($title, 35), 'UTF-8', 'iso-8859-2'),
'urlPost' => $url,
'idPost' => $id,
'newPost' => 1,
);
}
else
{
$data = array(
'titlePost' => mb_convert_encoding(character_limiter($title, 35), 'UTF-8', 'iso-8859-2'),
'urlPost' => $url,
'idPost' => $id,
'newPost' => 0,
);
}
}
return $data;
}
public function visit($idPost)
{
$query = $this->db->query("SELECT url FROM posts WHERE id = '".$idPost."'");
$url = $query->row_array();
preg_match_all("~
(+?)
~", selectSourceCode($url), $posts);
$updateData = array(
'posts' => count($posts),
);
$this->db->where('id', $idPost)
->update('posts', $updateData);
return $url;
}
}
View index_view:
$addChannel = array(
'name' => 'addChannel',
'id' => 'addChannel',
);
$submit = array(
'name' => 'submit',
'value' => 'Add',
);
echo form_open('addChannel');
echo form_label('Add channel: ', 'addChannel');
echo form_input($addChannel);
echo form_submit($submit);
echo form_close();
echo $this->session->flashdata('urlExist');
echo $this->session->flashdata('urlAdd');
echo $this->session->flashdata('deletePost');
echo validation_errors();
if($posts)
{
echo '
';
foreach($posts as $post)
{
if($post == 1) $new = 'strong';
else $new = '';
?>
$new)); ?>
X
}
?>
}
?>
Library template.php:
class MY_Form_validation extends CI_Form_validation {
function unique($value)
{
$ci =& get_instance();
$query = $ci->db->where('url', $value)
->get('posts');
if($query->num_rows() > 0)
{
$ci->form_validation->set_message('unique', '%s this url is in your database.');
return false;
}
else
{
return true;
}
}
function is_url($value)
{
$ci =& get_instance();
preg_match('$(http|https|ftp)://(+(:+)*@)?((25|2|{1}{2}|{1}{1}|) .(25|2|{1}{2}|{1}{1}||0).(25 |2|{1}{2}|{1}{1}||0).(25 |2|{1}{2}|{1}{1}|)|(+ .)*+.{2,4})(:+)?(/*)*$', $value, $match);
if((bool)$match == true)
{
return true;
}
else
{
$ci->form_validation->set_message('is_url', '%s Isn't URL address.');
return false;
}
}
}
A Helper selectSourceCode
function selectSourceCode($url)
{
if($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv.1.9.0.3) Gecko/2008092417 Firefox/3.0.3");
return curl_exec($ch);
}
else
{
echo 'This isn't URL address!!';
}
}
Nečekám nějaký zázrak. Objektově programuji (snažím se) chvíli a s CodeIgniterem se také zatím seznamuji. A jsou věci, které pořád nemám vychytány. Řekl bych že budou připomínky především k použití výpisu chyb u Form_validation (jejich řešení výpisu chyb mi přijde poněkud těžkopádné, myslím že by to mohli vyřešit jinak a elegantněji) a k View
Není použit žádný šablonovací systém. Defaultně žádný neobsahuje a já ho zatím nezkoušel nějaký dohledat.
Předem díky
Ondra Z.
30. 7. 2011 16:53:58
https://webtrh.cz/diskuse/zacatky-s-mvc-codeigniter-zhodnoceni-scriptu#reply661007
w3m
verified
rating uzivatele
(22 hodnocení)
4. 8. 2011 15:11:29
Osobne s codeigniterem taky zacinam, ale is_url() vs selectSourceCode($url) = fail.
Pro hezky kod (ciste esteticky) by mohlo pomoct: http://codeigniter.com/user_guide/general/styleguide.html
A jinak: Bud jsem nepochopil MVC, nebo HTML kod nema v controlleru moc co delat, zkus to dat do viewu.
4. 8. 2011 15:11:29
https://webtrh.cz/diskuse/zacatky-s-mvc-codeigniter-zhodnoceni-scriptu#reply661006
Ondřej Záruba
verified
rating uzivatele
4. 8. 2011 17:56:30
Napsal w3m;685378
A jinak: Bud jsem nepochopil MVC, nebo HTML kod nema v controlleru moc co delat, zkus to dat do viewu.
Nemá tam co dělat, díky za upozornění
ale is_url() vs selectSourceCode($url) = fail.
Toho jsem si také nevšiml
Díky za tip
4. 8. 2011 17:56:30
https://webtrh.cz/diskuse/zacatky-s-mvc-codeigniter-zhodnoceni-scriptu#reply661005
sysline
verified
rating uzivatele
(2 hodnocení)
4. 8. 2011 18:03:50
Toto je spatne napsana podminka v podstate v ni rikas, pokud nejaka promenna je null dosad do ni null. Dale pak, testovani existence prvku v poli by se melo delat pres isset pripadne pres array_key_exists + testovani hodnoty.
Mnohem elegantnejsi zapis podobnych podminek je
4. 8. 2011 18:03:50
https://webtrh.cz/diskuse/zacatky-s-mvc-codeigniter-zhodnoceni-scriptu#reply661004
Ondřej Záruba
verified
rating uzivatele
4. 8. 2011 22:35:42
Toto je spatne napsana podminka v podstate v ni rikas, pokud nejaka promenna je null dosad do ni null.
Todle je problém, který me celkem trápí. Vím, že je to blbost, ale když to nechám bez podmínky, tak to dopadá tak že script hlásí chybu že $posts není definovaná. Posílám $data do view kde pak pracuji s $posts a tu pomocí foreach rozděluji, pokud ji nenastavím na null, hlásí chybu že není definovaná.
A nepodařilo se mi přijít na to jak to zapsat správně.
Mnohem elegantnejsi zapis podobnych podminek je
Pravda.
4. 8. 2011 22:35:42
https://webtrh.cz/diskuse/zacatky-s-mvc-codeigniter-zhodnoceni-scriptu#reply661003
Tomas Volf
verified
rating uzivatele
(12 hodnocení)
7. 8. 2011 01:04:33
Dve veci se mi nelibi (teda tyhle dve jsem postrehl pri letmem cteni):
1) me primo bije do oci...
je podle me lepsi.... ve vysledku je to asi jedno, ale php ma funkci is_null z nejakeho duvodu, kdyz uz if($data), tak to nastavovat na false, ne na null
2) z hlediska unit testovani je chyba v modelu tahat data primo z postu, mel by je dostavat jako parametr funkce
7. 8. 2011 01:04:33
https://webtrh.cz/diskuse/zacatky-s-mvc-codeigniter-zhodnoceni-scriptu#reply661002
Pro odpověď se přihlašte.
Přihlásit