2013-07-26 2 views
1

В Joomla 3.1.1, вот упрощенный код, который я использую для пакетной вставки статей (и теги):Joomla 3.1.4: как программно вставить теги?

$table = JTable::getInstance('Content', 'JTable', array()); 
$data = array(
    'title' => $my_title, 
    'introtext' => $my_introtext, 
    .... 
    'metadata' => array(
      ..., 
     'tags' => $list_of_tag[id], 
      ..., 
     ), 
); 
$table->bind($data); 
$table->check(); 
$table->store(); 

$list_of_tag[ids] затем переходит в #_content metadata поле в форме {"tags":[ids],"robots":"","author":"","rights":"","xreference":""}. Joomla также не будет заботиться о других связанных таблиц, таких как #_contentitem_tag_map и т.д.

Этот метод не работает в Joomla 3.1.4, так как тег больше не переходит в metadata поле, новый формат {"robots":"","author":"","rights":"","xreference":""}, т.е., не более tags ключ.

Кто-нибудь знает, как вставить теги в Joomla программно в 3.1.4? Спасибо,

Обновление для полного кода:

Полный код, который работал в 3.1.1, где $ строка [ «метки»] является массивом целых чисел, соответствующих exising тегов идентификаторов в #_tags, и все остальные поля в строке $ четко определены.

<?php 
define('_JEXEC', 1); 
define('JPATH_BASE', dirname(dirname(__FILE__))); 
define('DS', DIRECTORY_SEPARATOR); 

require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php'); 
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php'); 
require_once (JPATH_BASE . DS . 'libraries' . DS . 'joomla' . DS . 'factory.php'); 

define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_BASE . DS . 'administrator' . DS . 'components' . DS . 'com_content'); 

$mainframe = JFactory::getApplication('site'); 

require_once (JPATH_ADMINISTRATOR.'/components/com_content/models/article.php'); 

$string = file_get_contents("items.json"); 
$json_str = json_decode($string, true); 
$title_default = 'No Title'; 
$i = 0; 
foreach($json_str as $row){ 
    $table = JTable::getInstance('Content', 'JTable', array()); 
    $data = array(
     'title' => $row['title'][0], 
     'alias' => $row['alias'][0], 
     'introtext' => $row['content'], 
     'state' => 1, 
     'catid' => $row['catid'][0], 
     'created' => $row['pdate'], 
     'created_by' => 635, 
     'created_by_alias' => $row['poster'][0], 
     'publish_up' => $row['pdate'], 
     'urls' => json_encode($row['urls']), 
     'access' => 1, 
     'metadata' => array(
      'tags' => $row['tags'], 
      'robots' => "", 
      'author' => implode(" ", $row['poster']), 
      'rights' => "", 
      'xreference' => "", 
     ), 
    ); 
    ++$i; 
// Bind data 
    if (!$table->bind($data)) 
     { 
      $this->setError($table->getError()); 
      return false; 
     } 

// Check the data. 
    if (!$table->check()) 
     { 
      $this->setError($table->getError()); 
      return false; 
     } 

// Store the data. 
    if (!$table->store()) 
     { 
      var_dump($this); 
      $this->setError($table->getError()); 
      return false; 
     } 
    echo 'Record ' . $i . ' for post ' . $data['alias'] . ' processed'; 
    echo "\r\n"; 
} 
?> 

После читая документацию, я пробовал разные способы, чтобы переписать код:

  1. Move линия, которая говорит «теги» => $ строки [ «метки»], при метаданных родительского массива, то есть:

    ... 
        'access' => 1, 
        'tags' => $row['tags'], 
        'metadata' => array(
         'robots' => "", 
         'author' => implode(" ", $row['poster']), 
         'rights' => "", 
         'xreference' => "", 
        ), 
        ... 
    

Так что теперь мы $ данных [ «метка»], заселенная массив целых чисел, отображающих существующие идентификаторы тегов, presumabaly готов для метода JTable store();

  1. В дополнение к методу 1, jsonify $ row ['tags']. для этого я попробовал два метод:

2.а)

... 
$registry = new JRegistry(); 
$registry->loadArray($row['tags']); 
$data['tags'] = (string) $registry; 
... 

2б)

data['tags'] = json_encode(json_encode($row['tags'])); 

С этими изменениями я до сих пор не могу добавлять меток для вставленного статьи.

Elin: Благодарим за ваше терпение!

+1

Вы хотите положить их в элемент для отображения? Самое простое - вставить теги JLayout в макеты просмотра. Метки никогда не должны заходить в вашу таблицу содержимого. Данные записываются только в таблицу content_itm_tags_mapping. tagItem() - это метод для этого из JHelperTags – Elin

+0

tagItem() требуется передать $ ucmId, как мне вернуть эту переменную в код? спасибо, –

+1

Это происходит, когда api делает экономию, поэтому выполняется предварительная обработка/постпроцессинг. – Elin

ответ

1

Оказывается, что если экземпляр JTable, то новые com_tags не займет $data['tags'], вместо этого, вы должны связать свои метки непосредственно $table в table->newTags = $data['tags'];, таким образом ваши вновь вставленные статьи будут помечены должным образом, учитывая, что вам заполнили ваши $ data ['tags'] существующими идентификаторами тегов.

+1

Также есть некоторые проблемы в 3.1.5, связанные с CLI и JTable, – Elin

+0

Как насчет добавления новых тегов? – Jeboy

2

http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension - основная документация по использованию тегов в расширении.

Несмотря на то, что в 3.1.4+ есть изменения, если вы будете следовать этим инструкциям, это сработает. 3.1.4+ делает его несколько проще, потому что вместо этого он обрабатывает теги через шаблон наблюдателя. Я попытаюсь обновить документы, но вы можете посмотреть в любом основном компоненте и увидеть, что код был упрощен и несколько перемещен из JTable.

Update:

Я обновил документацию для 3.1.4, включая, как изменить свой старый код, чтобы заставить его работать.

0

Поздний ответ, но, надеюсь, сохранит следующий OP из-за разочарования, которое я пытался найти способ прямого вызова методов Tag.

я завелся просто обновить статью, чтобы быть помечены модели содержимого:

$basePath = JPATH_ADMINISTRATOR.'/components/com_content'; 
require_once $basePath.'/models/article.php'; 
$articlemodel = new ContentModelArticle(array('table_path' => $basePath . '/tables')); 

$params = array(
    'id' => 123,    // Article being tagged 
    'tags' => array(7,8,9,14) // Tag IDs from #__tags to tag article with 
); 
if($articlemodel->save($params)){ 
    echo 'Success!'; 
} 

Работал как шарм! Кажется, что его можно легко адаптировать к любым предметам, которые могут быть помечены. Я думаю, что у меня была аналогичная ситуация с исходным вопросом, и на самом деле использовал вышеуказанный код с инструкцией SQL, которая скомпилировала для меня правильные идентификаторы тегов. Это было бы бессмысленно для ответа, но это избавило меня от необходимости вручную отмечать 1 900 статей из более 200 тегов!

Смежные вопросы