Главная > Статьи > Облако тегов для joomla 1.6+

Облако тегов для joomla 1.6+

Содержание материала
Облако тегов для joomla 1.6+
База дынных
Языковые константы
Административная часть (1)
Административная часть (2)
Установка плагинов, модулей
Все страницы
23.09.2012 12:54

   В модуле вывода тегов размер шрифта зависит пропорционально количеству повторяющихся тегов, не стоит переживать если при тестировании у вас все теги имеют одинаковый шрифт, это потому, что все они упоминаются лишь 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)cloudtag.zip[Плагин для компонента поиска, не забываем включить!]2 Kb81 Загрузки
Скачать файл (cloudtagtext.zip)cloudtagtext.zip[Плагин для отображения тегов прикрепленные к статье!]2 Kb73 Загрузки
Скачать файл (mod_cloudtag.zip)mod_cloudtag.zip[Модуль отображения наиболее весомых тегов на сайте]2 Kb72 Загрузки
Twitter
Нравится
SocButtons v1.4
 

Комментарии 

 
# Alex 24.09.2012 09:35
Супер, наконец то, что то бесплатное и адекватное. Хоть немного пришлось потрудиться конечно, но оно того стояло. Спасибо
Ответить | Ответить с цитатой | Цитировать
 
 
# Doroti 26.09.2012 08:09
Спасибо, было немного возни, но справилась:)
Ответить | Ответить с цитатой | Цитировать
 

Добавить комментарий


Защитный код
Обновить

 
  • По вопросам размещения информационных объявлений обращайтесь на почту [email protected]!

Сторонние

Модуль новостей для Joomla - JU News Ultra
14.11.2011 |  3593
Модуль вывода новостей JU News Ultra - еще один способ...

Новости

В погоне за Samsung Electronics и Apple – LG разрабатывает «умные» часы
IT мир
28.03.2013 |  57
Совсем недавно стало известно, что несколько компаний намереваются создать «умные»...
Новинка от ТМ Fly, DS124 – телефон, функционирующий месяц в режиме ожидания
IT мир
28.03.2013 |  475
Британский производитель Fly поставит на украинский рынок необычную модель телефона...
Компания Philips прорекламировала новинку – смартфон Xenium W737
IT мир
23.03.2013 |  226
Состоялся анонс двухъядерного «умного телефона» от компании Philips. Аппарат функционирует...
Новые телефоны от компании Motorola под названиями Sasquatch, Yeti и Ghost
IT мир
23.03.2013 |  78
Американская компания Motorola Inc объявила об анонсе новых функциональных мобильных...

посл. Комментарии

  • Ссылку на сайт на почту roket0... Читать...
    26.04.13 12:54
  • После добавления вопроса или о... Читать...
    26.04.13 12:30
  • Всегда пожалуйста, обращайтесь... Читать...
    25.04.13 14:05
  • Умвр. Долго бился с этим долба... Читать...
    25.04.13 12:54
  • Здравствуйте! Все отлично, ком... Читать...
    25.04.13 05:36
  • Здравствуйте, к сожалению для ... Читать...
    17.04.13 07:04
  • Здравствуйте! Под joomla 2.5 п... Читать...
    15.04.13 04:14

Вход