В модуле вывода тегов размер шрифта зависит пропорционально количеству повторяющихся тегов, не стоит переживать если при тестировании у вас все теги имеют одинаковый шрифт, это потому, что все они упоминаются лишь 1 раз, если какой то тег будет упоминаться 2 раза, а какой-то 1 раз то соответственно они будут иметь размеры шрифтов тот что 2 раза - макс. размер шрифта, а тот, что 1 раз минимальный размер шрифта, присутствует своеобразный алгоритм - потому наполняйте материалами теги и вы все увидите сами, еще не реализован функционал релевантных статей и соответственно релевантности тегов, но если кому то потребуется допишу!
По просьбе пользователя решил создать статью о том как сделать более или менее адекватный функционал "облака тегов", почему адекватный - наверное потому, что перепробовал много всего и понял, что облако тегов у многих это просто куча ссылок на поиск с кое какими доработками, плюс ко всему которые формируются или автоматически (безобразно) или с мета ключевых слов (это правильно но не удобный стандартный функционал). Для начала скажу, что функционал добавления тегов будем вшивать в стандартный com_content (так попросили), хотя понимаю почему - это быстро и удобно.
Тактика будет проста, создаем несколько таблиц в базе данных, дальше добавляем языковые константы (не везде использовал так как банально надоело), пилим админку (будем максимально использовать встроенный фреймворк joomla и не отклонятся от MVC), дальше разворачиваем модуль и плагины (плагин для поиска, плагин для контента) - да в принципе и все.
Добавляем таблицы (префикс таблицы)_cloud_tags и (префикс таблицы)_cloud_tags_x_content:
CREATE TABLE IF NOT EXISTS `(префикс таблицы)_cloud_tags_x_content` (
`tag_x_content_id` int(10) NOT NULL AUTO_INCREMENT,
`tag_x_content_content_id` int(10) NOT NULL,
`tag_x_content_tag_id` int(10) NOT NULL,
PRIMARY KEY (`tag_x_content_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
CREATE TABLE IF NOT EXISTS `(префикс таблицы)_cloud_tags` (
`tag_id` int(10) NOT NULL AUTO_INCREMENT,
`tag_text` varchar(255) NOT NULL,
`tag_count` int(10) NOT NULL,
PRIMARY KEY (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
Открываем файл administrator\language\ru-RU\ru-RU.ini и в конце добавляем такие строки:
JFIELD_META_CLOUDTAGS_LABEL="Тэги статьи (уже прикрепленные)"
JFIELD_META_CLOUDTAGS_DESC="Тэги для статьи по которым будет производиться поиск, а также отображаться в облаке тэгов, указывать каждый тэг ЧЕРЕЗ запятую."
JCLOUDTAGSLIST="Список ВСЕХ доступных тэгов"
JCLOUDTAGSLIST_DESC="Выберите НЕ ПРИКРЕПЛЕННЫЕ тэги (путем двойного клика мышки) которые вы хотите привязать к материалу"
CURREN_ATTACHED_TAGS="Тэги прикрепленные к данной статье"
FREE_ATTACHED_TAGS="Все не прикрепленные тэги"
DROP_CLOUD_TAG="Удалить тэги (из списка сверху) полностью"
NO_ATTACHED_TAGS_FOR_ARTICLE="Нет прикрепленных материалов к данному тегу!"
TAGS_SEARCH_TEXT="текст тега для поиска"
EMPTY_TAG_TO_DELETE="Не выбрано ни одного тэга, что бы удалить"
CONFIRM_TEXT_TO_DELETE_TAGS="Данные тэги привязаны к материалам, вы действительно хотите их удалить?"
TAGS_SUCCESSFUL_DELETED="Тэги успешно удалены"
NO_TAGS_ALL="Нет ни одного тэга"
Теперь самое долго мучительное, не буду расписывать, какой кусок кода - что делает, просто буду писать куда и что вставлять.
Файл administrator\components\com_content\views\article\tmpl\edit_metadata.php перед закрывающим тегом </ul> дописываем:
<li><?php echo $this->form->getLabel('cloudtaglist'); ?>
<?php echo $this->form->getInput('cloudtaglist'); ?></li>
<li><?php echo $this->form->getLabel('cloudtagforarticle'); ?>
<?php echo $this->form->getInput('cloudtagforarticle'); ?></li>
Файл administrator\components\com_content\models\article.php находим кусочек кода:
if (parent::save($data)) {
и вставляем за ним:
$this->addCloudTag($data);
дальше в этом же файле перед самым последним символом "}" дописываем:
public function getArticlesWithThisTags($tags_id){
$return = false;
if(!empty($tags_id)){
$db = $this->getDbo();
$string_tags_id = implode(',',$tags_id);
$sql = "SELECT COUNT(id) FROM #__content
LEFT JOIN #__cloud_tags_x_content ON tag_x_content_content_id = id
LEFT JOIN #__cloud_tags ON tag_x_content_tag_id = tag_id
WHERE tag_id IN(".$string_tags_id.")
GROUP BY title";
$db->setQuery($sql);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$result = $db->loadResult();
if(!empty($result))
{
$return = $result;
}
}
return $return;
}
public function getTagCloudByArticle($id)
{
$return = false;
$db = JFactory::getDBO();
$db->setQuery(
'SELECT *
FROM #__cloud_tags
LEFT JOIN #__cloud_tags_x_content ON tag_id = tag_x_content_tag_id '.(!is_null($id) && $id !==0?'AND tag_x_content_content_id = '.$id:'').'
GROUP BY tag_id
ORDER BY tag_x_content_id DESC ,tag_text ASC'
);
if(!$db->query())
{
$return = false;
}
else
{
$return = $db->loadObjectList();
}
return $return;
}
public function assetSearchTag($search_text,$id = null)
{
if(!empty($search_text))
{
$db = JFactory::getDBO();
if(is_null($id) || $id == 0)
{
$sql = "SELECT tag_text,tag_id FROM #__cloud_tags
WHERE tag_text LIKE '%".$search_text."%'";
}
else
{
$sql = "SELECT tag_text,tag_id,tag_x_content_tag_id FROM #__cloud_tags
LEFT JOIN #__cloud_tags_x_content ON tag_x_content_tag_id = tag_id AND tag_x_content_content_id = {$id}
WHERE tag_text LIKE '%".$search_text."%'
GROUP BY tag_id";
}
$db->setQuery($sql);
if(!$db->query())
{
$return = false;
}
else
{
$return = $db->loadObjectList();
if(!is_null($id) || $id !== 0)
{
foreach($return as $numArray => $tag)
{
if($tag->tag_id == $tag->tag_x_content_tag_id)
{
unset($return[$numArray]);
}
}
}
}
return $return;
}
else return false;
}
public function rmCloudTags($ids,$only_tags = false){
$result = false;
if(is_array($ids)){
$db = $this->getDbo();
$data = implode(',',$ids);
if($only_tags){
$sql = "DELETE FROM #__cloud_tags
WHERE tag_id IN({$data})";
}
else{
$sql = "DELETE FROM #__cloud_tags_x_content,#__cloud_tags
USING #__cloud_tags_x_content
INNER JOIN #__cloud_tags
WHERE tag_x_content_tag_id IN({$data}) AND tag_id IN({$data})";
}
$db->setQuery($sql);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$result = true;
}
return $result;
}
public function addCloudTag($data){
if(!empty($data['cloudtagforarticle']))
{
$content_id = $data['id'] = JRequest::getVar('id');
$db = $this->getDbo();
if(empty($content_id) || $content_id == 0)
{
$db->setQuery("SELECT MAX(id) FROM #__content");
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$content_id = $db->loadResult();
}
$sql_tag_need_create = 'INSERT INTO #__cloud_tags (tag_text,tag_count) VALUES ';
$tag_need_create = '';
$db->setQuery("SELECT tag_text FROM #__cloud_tags");
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$current_isset_tags = $db->loadResultArray();
$arrayCloudTags = ContentHelper::creatArrayCloudTagsFromString($data['cloudtagforarticle']);
$arrays_tag_to_sql = '';
$arrayCloudTags = array_unique($arrayCloudTags);
foreach($arrayCloudTags as $taggad){
$arrays_tag_to_sql[] = "'".$taggad."'";
}
foreach($arrayCloudTags as $tag){
if(!in_array($tag,$current_isset_tags))
{
$tag_need_create .= "('".$tag."',1),";
}
}
$string_tags = implode(',',$arrays_tag_to_sql);
$tag_need_create = JString::substr($tag_need_create,0,-1);
if(!empty($tag_need_create)){
$db->setQuery($sql_tag_need_create.$tag_need_create);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
}
if(!empty($content_id))
{
$current_tags = '';
$sqlCloudTag = "SELECT tag_id,
tag_count,
tag_x_content_id,
tag_text,
IF(tag_text IN(".$string_tags."),'true','false') need_drop_from_article
FROM #__cloud_tags
LEFT JOIN #__cloud_tags_x_content ON tag_x_content_tag_id = tag_id
WHERE tag_x_content_content_id = {$content_id}";
$db->setQuery($sqlCloudTag);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$result_iseet_tag = $db->loadObjectList();
foreach($result_iseet_tag as $tag_current){
$current_tags[] = $tag_current->tag_text;
}
$sqlSelectDataForNeedsTags = "SELECT tag_id,tag_count,tag_text
FROM #__cloud_tags
WHERE tag_text IN(".$string_tags.")";
$db->setQuery($sqlSelectDataForNeedsTags);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$result_iseet_tags_tag = $db->loadObjectList();
$tag_need_attach = $tag_need_downgrade = $sql_tag_drop_from_article = $tag_need_drop_from_article = '';
$arrayCloudTags = array_unique($arrayCloudTags);
foreach($arrayCloudTags as $key => $tag_need)
{
if(!in_array($tag_need,$current_tags)){
foreach($result_iseet_tags_tag as $tag_isset_tag){
if($tag_isset_tag->tag_text == $tag_need){
$need_object_id = $tag_isset_tag->tag_id;
break;
}
}
$tag_need_attach .= "({$content_id},'".$need_object_id."'),";
$where_sql_part_for_upgrade = $need_object_id.",";
}
}
if(!empty($tag_need_attach)){
$tag_need_attach = JString::substr($tag_need_attach,0,-1);
$where_sql_part_for_upgrade = JString::substr($where_sql_part_for_upgrade,0,-1);
$sql_tag_attach = "INSERT INTO #__cloud_tags_x_content (tag_x_content_content_id,tag_x_content_tag_id) VALUES ".$tag_need_attach;
$db->setQuery($sql_tag_attach);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$sql_upgrade_tag = "UPDATE #__cloud_tags SET tag_count = tag_count + 1 WHERE tag_id IN(".$where_sql_part_for_upgrade.")";
$db->setQuery($sql_upgrade_tag);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
}
foreach($result_iseet_tag as $tag_need_drop)
{
if(!in_array($tag_need_drop->tag_text,$arrayCloudTags)){
$tag_need_drop_from_article .= $tag_need_drop->tag_x_content_id.",";
$tag_need_downgrade .= $tag_need_drop->tag_id.",";
}
}
if(!empty($tag_need_drop_from_article)){
$tag_need_drop_from_article = JString::substr($tag_need_drop_from_article,0,-1);
$tag_need_downgrade = JString::substr($tag_need_downgrade,0,-1);
$sql_tag_drop_from_article = "DELETE FROM #__cloud_tags_x_content WHERE tag_x_content_id IN(".$tag_need_drop_from_article.")";
$sql_downgrade_tag = "UPDATE #__cloud_tags SET tag_count = if(tag_count < 2,tag_count,tag_count - 1) WHERE tag_id IN(".$tag_need_downgrade.")";
$db->setQuery($sql_tag_drop_from_article);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
$db->setQuery($sql_downgrade_tag);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
}
}
}
else{
$db = $this->getDbo();
$content_id = $data['id'] = JRequest::getVar('id');
if(isset($content_id) && $content_id !== 0){
$sql_tag_drop_from_article = "DELETE FROM #__cloud_tags_x_content WHERE tag_x_content_content_id = {$content_id}";
$db->setQuery($sql_tag_drop_from_article);
if (!$db->query()){
throw new Exception($db->getErrorMsg());
}
}
}
}
Дальше окрываем файл new\administrator\components\com_content\controller.php и тоже самое перед самым последним символом "}" добавляем:
public function rm_ct()
{
$ids = JRequest::getVar('tag_ids');
$ids = explode(',',$ids);
$work_type = JRequest::getVar('wt');
$id = JRequest::getInt('id',null);
$confirm = JRequest::getInt('confirm');
$model = $this->getModel('Article', '', array());
if($work_type == 'delete'){
$current_attached_article = $model->getArticlesWithThisTags($ids);
if(!empty($current_attached_article)){
if($confirm == 1){
$result = $model->rmCloudTags($ids,false);
$html_to_show = $this->getIssetsTags($id,$model);
if(!empty($html_to_show)) echo $html_to_show;
}
else
{
echo "WITH_ARTICLE";
}
}
elseif(empty($current_attached_article) || $current_attached_article === false){
$result = $model->rmCloudTags($ids,true);
$html_to_show = $this->getIssetsTags($id,$model);
if(!empty($html_to_show)) echo $html_to_show;
}
}
elseif($work_type == 'string'){
$tag_string = $this->getTagsString($id);
if(!empty($tag_string)) echo $tag_string;
}
elseif($work_type == 'search'){
$search_text = JRequest::getVar('sw');
$resut_search = $this->searchTag($id,$model,$search_text);
if(!empty($resut_search)) echo $resut_search;
}
}
public function getIssetsTags($id = null,$model){
$tagList = $model->getTagCloudByArticle($id);
$html = $this->getOptionList($tagList,$id);
return $html;
}
public function searchTag($id = null,$model,$search_text)
{
if(!empty($search_text))
{
$tagList = $model->assetSearchTag($search_text,$id);
$html = $this->getOptionList($tagList,$id);
}
else
{
$tagList = $model->getTagCloudByArticle($id);
$html = $this->getOptionList($tagList,$id);
}
return $html;
}
public function getOptionList($tagList,$id)
{
$pre_counter = 1;
$num_tags = count($tagList);
$html = '';
$num_of_current_tag = 0;
if($num_tags == 0)
{
$html = "";
$html .= "\n<input size=\"40\" placeholder=\"".JText::_('TAGS_SEARCH_TEXT')."\" class=\"searchCloudTag\" type=\"text\" id=\"searchCloudTag\">
<select class=\"tagcloudstring\" size=\"15\" cols=\"10\" multiple=\"multiple\" id=\"".$this->id."\" name=\"".$this->name."\">";
$html .= "\n<option>".JText::_('NO_TAGS_ALL')."</option>";
$html .= "\n</select>";
}
else
{
foreach($tagList as $nummer){
if($nummer->tag_x_content_content_id == $id && $id !== 0){
$num_of_current_tag++;
}
}
foreach($tagList as $tag)
{
if($pre_counter == 1)$html .= "\n<optgroup label=\"".JText::_('CURREN_ATTACHED_TAGS')."\">";
if($pre_counter == ($num_of_current_tag + 1))$html .= "\n<optgroup label=\"".JText::_('FREE_ATTACHED_TAGS')."\">";
$html .= "\n<option ".($tag->tag_x_content_content_id == $id && $id !== 0?" ":" ondblclick=\"addTheTag(this);\" ")." value=\"".$tag->tag_id."\">".$tag->tag_text."</option>";
if($pre_counter == $num_of_current_tag)$html .= "\n</optgroup>";
if($pre_counter == $num_tags)$html .= "\n</optgroup>";
$pre_counter++;
}
}
return $html;
}
public function getTagsString($id = null){
$db = JFactory::getDBO();
$db->setQuery(
'SELECT tag_text FROM #__cloud_tags_x_content LEFT JOIN #__cloud_tags ON tag_id = tag_x_content_tag_id WHERE tag_x_content_content_id = '.$id
);
if(!$db->query())
{
$tagList = false;
}
else
{
$html = '';
$tagList = $db->loadObjectList();
$count = count($tagList);
foreach($tagList as $key => $tag)
{
$html .= "".$tag->tag_text.($key < $count-1?",\n":"\n");
}
return $html;
}
}
потом в файле administrator\components\com_content\helpers\content.php тоже самое, перед последним символом "}" добавляем код:
public static function creatArrayCloudTagsFromString($string){
$string = trim($string);
if(JString::substr($string,-1) == ',')$string = JString::substr($string,0,-1);
$array_tags = explode(',',$string);
$new_array_tags = '';
foreach($array_tags as $tag){
$tag = trim($tag);
if(!empty($tag))$new_array_tags[] = $tag;
}
return $new_array_tags;
}
Дальше осталось только отображение в самой админке.
Создадаем в папке administrator\components\com_content\models\fields, папку с названием cloudtag в которой в свою очередь создаем 2 файла с названиями cloudtagforarticle.php и cloudtaglist.php (естественно везде кодировка UTF-8)
Содержимое файла cloudtagforarticle.php
<?php
/**
* @copyright Roket007
*/
defined('JPATH_BASE') or die;
jimport('index.php_3Foption_3Dcom_content_26view_3Darticle_26id_3D53_3A2012-09-23-12-55-56_26catid_3D1_3Aarticls_26Itemid_3D6_26showall_3D1/joomla.form.formfield.css');
class JFormFieldcloudtagforarticle extends JFormField {
protected $type = 'cloudtagforarticle';
public function getInput()
{
$id = JRequest::getInt('id');
$db = JFactory::getDBO();
$db->setQuery(
'SELECT tag_text FROM #__cloud_tags_x_content LEFT JOIN #__cloud_tags ON tag_id = tag_x_content_tag_id WHERE tag_x_content_content_id = '.$id
);
if(!$db->query())
{
$tagList = false;
}
else
{
$tagList = $db->loadObjectList();
$count = count($tagList);
$html = "\n<textarea cols=\"30\" rows=\"10\" id=\"".$this->id."\" name=\"".$this->name."\">";
foreach($tagList as $key => $tag)
{
$html .= "\n".$tag->tag_text.($key < $count-1?",":"");
}
$html .= "</textarea>";
return $html;
}
}
public function getLabel() {
return parent::getLabel();
}
}
?>
Содержимое файла cloudtaglist.php
<?php
/**
* @copyright Roket007
*/
defined('JPATH_BASE') or die;
jimport('index.php_3Foption_3Dcom_content_26view_3Darticle_26id_3D53_3A2012-09-23-12-55-56_26catid_3D1_3Aarticls_26Itemid_3D6_26showall_3D1/joomla.form.formfield.css');
class JFormFieldcloudtaglist extends JFormField {
protected $type = 'cloudtaglist';
public function getInput()
{
$id = JRequest::getInt('id');
$db = JFactory::getDBO();
$db->setQuery(
'SELECT *
FROM #__cloud_tags
LEFT JOIN #__cloud_tags_x_content ON tag_id = tag_x_content_tag_id '.(!is_null($id) && $id !==0?'AND tag_x_content_content_id = '.$id:'').'
GROUP BY tag_id
ORDER BY tag_x_content_id DESC ,tag_text ASC'
);
if(!$db->query())
{
$tagList = false;
}
else
{
$tagList = $db->loadObjectList();
}
if(!$tagList || empty($tagList))
{
$html = "";
$html .= "\n<input size=\"40\" placeholder=\"".JText::_('TAGS_SEARCH_TEXT')."\" class=\"searchCloudTag\" type=\"text\" id=\"searchCloudTag\">
<select class=\"tagcloudstring\" size=\"15\" cols=\"10\" multiple=\"multiple\" id=\"".$this->id."\" name=\"".$this->name."\">";
$html .= "\n<option>".JText::_('NO_TAGS_ALL')."</option>";
$html .= "\n</select>";
}
else
{
$num_of_current_tag = 0;
foreach($tagList as $nummer){
if($nummer->tag_x_content_content_id == $id && $id !== 0){
$num_of_current_tag++;
}
}
$html = '
<script type="text/javascript" language="javascript">
function addTheTag(tagger)
{
var cur_tag_value = document.getElementById("jform_cloudtagforarticle").value;
if(cur_tag_value == ""){
var seperator = "";
}
else{
var seperator = ",\n";
}
var new_tag_value = cur_tag_value + seperator + tagger.innerHTML;
document.getElementById("jform_cloudtagforarticle").value = new_tag_value;
document.getElementById("jform_cloudtagforarticle").innerHTML = new_tag_value;
}
function getSelect(){
var tagSelected = document.getElementById("jform_cloudtaglist");
var selectedOptions = [];
var allIds = tagSelected.options;
var count = allIds.length;
for(var i=0;i<count;i++){
if(allIds[i].selected){
selectedOptions.push(allIds[i].value);
}
}
var result = selectedOptions.join(",");
if(result){
preDeletedTag(result);
}
else{
alert("'.JText::_('EMPTY_TAG_TO_DELETE').'");
}
}
function deleteTag(ids){
var preDelete = new Request({
url: "'.JURI::base().'index.php?option=com_content&task=rm_ct&format=raw&id='.$id.'",
method: "get",
onSuccess: function(responseText){
var tagSelected = document.getElementById("jform_cloudtaglist");
tagSelected.innerHTML = responseText;
stringTag();
}
});
preDelete.send("wt=delete&confirm=1&tag_ids=" + ids);
}
function stringTag(){
var preString = new Request({
url: "'.JURI::base().'index.php?option=com_content&task=rm_ct&format=raw&id='.$id.'",
method: "get",
onSuccess: function(responseText){
var tagSelected = document.getElementById("jform_cloudtagforarticle");
tagSelected.innerHTML = responseText;
tagSelected.value = responseText;
}
});
preString.send("wt=string");
}
function preDeletedTag(ids){
var preDelete = new Request({
url: "'.JURI::base().'index.php?option=com_content&task=rm_ct&format=raw&id='.$id.'",
method: "get",
onSuccess: function(responseText){
if(responseText == "WITH_ARTICLE"){
if(confirm("'.JText::_('CONFIRM_TEXT_TO_DELETE_TAGS').'")){
deleteTag(ids);
}
}
else{
var tagSelected = document.getElementById("jform_cloudtaglist");
tagSelected.innerHTML = responseText;
stringTag();
}
}
});
preDelete.send("wt=delete&confirm=0&tag_ids=" + ids);
}
window.addEvent("domready", function(){
searchTag.periodical(1000);
});
function searchTag()
{
var maskInput = document.getElementById("searchCloudTag").value;
var cStart = document.getElementById("cStart").value;
var countChars = maskInput.replace(/\s+/g, "").length;
if(countChars != 0)
{
var cStartw = document.getElementById("cStartw").value;
var searchInput = document.getElementById("searchCloudTag").value;
}
else
{
var cStartw = "";
var searchInput ="";
}
if(cStart != countChars || cStartw != searchInput)
{
var preSearch = new Request({
url: "'.JURI::base().'index.php?option=com_content&task=rm_ct&format=raw&id='.$id.'",
method: "get",
onSuccess: function(responseText){
var tagSelected = document.getElementById("jform_cloudtaglist");
tagSelected.innerHTML = responseText;
}
});
preSearch.send("wt=search&sw=" + searchInput);
document.getElementById("cStart").value = countChars;
document.getElementById("cStartw").value = searchInput;
}
}
</script>
';
$html .= "\n<input size=\"45\" placeholder=\"".JText::_('TAGS_SEARCH_TEXT')."\" class=\"searchCloudTag\" type=\"text\" id=\"searchCloudTag\">
<input id=\"cStart\" type=\"hidden\" value=\"0\" />
<input id=\"cStartw\" type=\"hidden\" value=\"\" />
<select class=\"tagcloudstring\" size=\"15\" cols=\"10\" multiple=\"multiple\" id=\"".$this->id."\" name=\"".$this->name."\">";
$pre_counter = 1;
$num_tags = count($tagList);
if($num_tags = 0)
{
$html .= "\n<option>".JText::_('NO_TAGS_ALL')."</option>";
}
else
{
foreach($tagList as $tag)
{
if($pre_counter == 1)$html .= "\n<optgroup label=\"".JText::_('CURREN_ATTACHED_TAGS')."\">";
if($pre_counter == ($num_of_current_tag + 1))$html .= "\n<optgroup label=\"".JText::_('FREE_ATTACHED_TAGS')."\">";
$html .= "\n<option ".($tag->tag_x_content_content_id == $id && $id !== 0?" ":" ondblclick=\"addTheTag(this);\" ")." value=\"".$tag->tag_id."\">".$tag->tag_text."</option>";
if($pre_counter == $num_of_current_tag)$html .= "\n</optgroup>";
if($pre_counter == $num_tags)$html .= "\n</optgroup>";
$pre_counter++;
}
}
$html .= "\n</select>";
$html .= "\n<label></label><input onclick=\"getSelect()\" style=\"background:#eee; padding-top:0px !important; margin-top:0px !important; margin-bottom:15px !important;\" type=\"button\" id=\"dropcloudtag\" value=\"".JText::_('DROP_CLOUD_TAG')."\" />";
}
return $html;
}
public function getLabel() {
return parent::getLabel();
}
}
?>
И последний штрих это в файле administrator\components\com_content\models\forms\article.xml добавить после первого встретившегося в файле с самого начала тега </fieldset>
<fieldset addfieldpath="/administrator/components/com_content/models/fields/cloudtag" >
<field name="cloudtagforarticle" type="cloudtagforarticle" label="JFIELD_META_CLOUDTAGS_LABEL" description="JFIELD_META_CLOUDTAGS_DESC"/>
<field name="cloudtaglist" type="cloudtaglist" label="JCLOUDTAGSLIST" description="JCLOUDTAGSLIST_DESC" />
</fieldset>
В итоге заходим в административную часть сайта, а именно в какой то материал (редактирование) и видим слева во вкладке "Метаданные" такие поля:
Поле поиска тегов - работает на AJAX потому нету кнопки "поиск", ниже список всех тегов внесенных во всех материалах, отделены теги которые прикрепленные к статье в которой вы находитесь, и теги которые к ней не прекреплены (по ним собственно и выполняется поиск и чтобы добавить их к данной статье делаем двойной клик по нужному тегу), и последнее поле это текстовое поле в котором дублируются теги прикрепленные к статье, но здесь вы можете их дописать вручную (собственно так вообщем и наполняются теги), ест-но здесь вы их можете и удалить. Ну еще присутствует кнопка "удалить теги полностью" это теги удаляются со всех статей и везде!
Скачать плагины и модуль можно в аттаче, ну и собственно, что они делают:
1. Плагин cloudtag.zip - предназначен для поиска по тегам, устанваливается к типу "search", не имеет никаких настроек.
2. Плагин cloudtagtext.zip - предназначен для вывода тегово присоедененных к материалу (на сайте), имеет ряд настроек, а именно: текст перед тегами, id категорий где плагин будет работать, типы страниц ге отображать теги и где отображть теги.
3. Модуль mod_cloudtag.zip - предназначен для вывода наиболее весомых тегов на сайте, имеет настройки: максимальный и минимальный размер шрифта, количество выводимых тегов, цвет ссылок и текстовый разделитель ссылок.
Вложения / Downloads:
cloudtag.zip | [Плагин для компонента поиска, не забываем включить!] | 2 Kb | 81 Загрузки |
cloudtagtext.zip | [Плагин для отображения тегов прикрепленные к статье!] | 2 Kb | 73 Загрузки |
mod_cloudtag.zip | [Модуль отображения наиболее весомых тегов на сайте] | 2 Kb | 72 Загрузки |
Комментарии