Witam,
Prosiłbym o sprawdzenie czy dobrze rozwiązałem problem z tagami w ZF. Przy okazji zoptymalizowany kod przyda się dla forumowiczów bo w sieci jest dość mało literatury odnośnie tagów. Zaznaczam, że kod działa, ale nie wiem czy jest on zgodny z zasadą MVC itp. konwencjami tworzenia we frameworku.
Utworzyłem 3 tabele w tym jedną z widokiem.
--pcms_tag
CREATE TABLE IF NOT EXISTS `pcms_tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--pcms_tag_articles
CREATE TABLE IF NOT EXISTS `pcms_tag_articles` (
`tag_id` int(11) NOT NULL,
`article_id` int(11) NOT NULL,
PRIMARY KEY (`tag_id`,`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--pcms_tag_weights
CREATE VIEW `pcms_tag_weights` AS SELECT
`pcms_tag`.`id` AS `id`
,`pcms_tag`.`title` AS `title`
,count(0) AS `weight`
FROM (`pcms_tag` JOIN `pcms_tag_articles`)
WHERE (`pcms_tag`.`id` = `pcms_tag_articles`.`tag_id`)
GROUP BY `pcms_tag`.`id` ORDER BY `pcms_tag`.`title`;
Niżej kod dwóch modeli:
<?php
class Application_Model_TagArticles extends Zend_Db_Table_Abstract
{
protected $_name = 'pcms_tag_articles';
public function addRelationship($articleId,$tagId){
$row = $this->createRow();
if ($row) {
$row->tag_id = $tagId;
$row->article_id = $articleId;
$row->save();
return TRUE;
} else {
throw new Zend_Exception('Nie można utworzyć użytkownika. Błąd bazy danych!');
}
}
}
<?php
class Application_Model_Tag extends Zend_Db_Table_Abstract {
protected $_name = 'pcms_tag';
public function saveTags($articleId, $tags)
{
$validator = new Zend_Validate_Db_NoRecordExists(
'table' => $this->_name,
'field' => 'title'
)
);
$modelTagArticles = new Application_Model_TagArticles();
foreach ($tagsTab as $tag) {
if ($validator->isValid($tag)){ // dodajemy tag do bazy danych
$row = $this->createRow();
if ($row) {
$row->title = $tag;
$row->save();
$tagId = $this->getId($tag);
$modelTagArticles->addRelationship($articleId, $tagId);
} else {
throw new Zend_Exception('Nie można dodać tagu. Błąd bazy danych!');
}
}else{
$tagId = $this->getId($tag);
$modelTagArticles->addRelationship($articleId, $tagId);
}
}
}
public function getId($title){
$select = $this->select();
$select->from($this->_name, $this->_name.".id")
->where('title = ?', $title);
$row = $this->fetchRow($select);
return $row->id;
}
}
W akcji kontrolera dodawania artykułu dodałem:
...
$modelTag = new Application_Model_Tag();
$modelTag->saveTags($articleId, $tags);
...
Po zaprojektowaniu powyższych struktur w widoku na stronie bez problemów można zaimplementować chmurkę tagów wykorzystując Zend_Tag.
Wiem, że kod nie jest rewelacyjny i dlatego proszę o jakieś uwagi, co należałoby zmienić w kodzie.
Z góry dziękuję za pomoc.