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.