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:
Model channelControll_model:PHP kód:<?php
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['posts'])
{
$data['posts'] = 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', '<p class="flash success">This URL is added</p>');
redirect('');
}
}
else
{
$error = validation_errors();
if($error)
{
$this->session->set_flashdata('urlAdd', '<p class="flash error">'.$error.'</p>');
}
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', '<p class="flash success">The post is deleted!</p>');
redirect('');
}
else
{
return false;
}
}
}
View index_view:PHP kód:<?php
if(!defined('BASEPATH')) exit('No direct script access allowed');
class ChannelControll_model extends CI_Model
{
public function addChannel()
{
preg_match_all("~<div class=\"posttext\">([^']+?)</div>~", selectSourceCode($this->input->post('addChannel')), $posts);
$insertData = array(
'id' => '',
'url' => $this->input->post('addChannel'),
'posts' => count($posts[0]),
);
$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[$i] = $url[$i]['url'];
}
if($data)
{
return $this->channelControll_model->loadPost($data);
}
}
public function loadPost($urls)
{
foreach($urls as $key => $url)
{
preg_match_all("~<div class=\"posttext\">([^']+?)</div>~", selectSourceCode($url), $posts);
preg_match_all('~<title>([^"]+?)</title>~', 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[0]['posts'] < count($posts[0]))
{
$data['posts'][$key] = array(
'titlePost' => mb_convert_encoding(character_limiter($title[1][0], 35), 'UTF-8', 'iso-8859-2'),
'urlPost' => $url,
'idPost' => $id[0]['id'],
'newPost' => 1,
);
}
else
{
$data['posts'][$key] = array(
'titlePost' => mb_convert_encoding(character_limiter($title[1][0], 35), 'UTF-8', 'iso-8859-2'),
'urlPost' => $url,
'idPost' => $id[0]['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("~<div class=\"posttext\">([^']+?)</div>~", selectSourceCode($url['url']), $posts);
$updateData = array(
'posts' => count($posts[0]),
);
$this->db->where('id', $idPost)
->update('posts', $updateData);
return $url['url'];
}
}
Library template.php:PHP kód:<?php
$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 '<div id="post">';
foreach($posts as $post)
{
if($post['newPost'] == 1) $new = 'strong';
else $new = '';
?>
<div class="post">
<?php echo anchor('check/'.$post['idPost'], $post['titlePost'], array('class' => $new)); ?>
<span><a href="deletePost/<?php echo $post['idPost']?>">X</a></span>
</div>
<?php
}
?>
</div>
<?php
}
?>
A Helper selectSourceCodePHP kód:<?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)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\ -]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]) \.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25 [0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5] |2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\ .)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\ /\+&%\$#\=~_\-@]*)*$', $value, $match);
if((bool)$match == true)
{
return true;
}
else
{
$ci->form_validation->set_message('is_url', '%s Isn\'t URL address.');
return false;
}
}
}
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 ViewPHP kód:<?php
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!!';
}
}
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.



