В 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";
}
?>
После читая документацию, я пробовал разные способы, чтобы переписать код:
Move линия, которая говорит «теги» => $ строки [ «метки»], при метаданных родительского массива, то есть:
... 'access' => 1, 'tags' => $row['tags'], 'metadata' => array( 'robots' => "", 'author' => implode(" ", $row['poster']), 'rights' => "", 'xreference' => "", ), ...
Так что теперь мы $ данных [ «метка»], заселенная массив целых чисел, отображающих существующие идентификаторы тегов, presumabaly готов для метода JTable store();
- В дополнение к методу 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: Благодарим за ваше терпение!
Вы хотите положить их в элемент для отображения? Самое простое - вставить теги JLayout в макеты просмотра. Метки никогда не должны заходить в вашу таблицу содержимого. Данные записываются только в таблицу content_itm_tags_mapping. tagItem() - это метод для этого из JHelperTags – Elin
tagItem() требуется передать $ ucmId, как мне вернуть эту переменную в код? спасибо, –
Это происходит, когда api делает экономию, поэтому выполняется предварительная обработка/постпроцессинг. – Elin