1

在 Joomla 3.1.1 中,这是我用来批量插入文章(和标签)的简化代码:

$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]进入表单metadata中的#_content 字段{"tags":[ids],"robots":"","author":"","rights":"","xreference":""}。Joomla 还会处理其他相关的表格,例如#_contentitem_tag_map, 等。

此方法在 Joomla 3.1.4 中不起作用,因为标签不再进入metadata字段,新格式为{"robots":"","author":"","rights":"","xreference":""},即不再有tags键。

有谁知道如何在 3.1.4 中以编程方式将标签插入 Joomla?谢谢,

完整代码更新:

在 3.1.1 中工作的完整代码,其中 $row['tags'] 是一个整数数组,对应于 #_tags 中的现有标签 ID,并且 $row 中的所有其他字段都已明确定义。

<?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. 将元数据下的 'tags' => $row['tags'] 行移动到其父数组,即:

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

所以现在我们有 $data['tags'] 填充了一个整数数组,映射了现有的标签 ID,大概为 JTable store() 方法做好了准备;

  1. 除了方法一,jsonify $row['tags']。为此,我尝试了两种方法:

2.a)

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

2.b)

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

通过这些更改,我仍然无法为插入的文章添加标签。

艾琳:谢谢你的耐心!

4

3 回答 3

2

http://docs.joomla.org/J3.1:Using_Tags_in_an_Extension 是在扩展中使用标签的基本文档。

尽管 3.1.4+ 中有更改,但如果您按照这些说明进行操作,它将起作用。3.1.4+ 使它更容易一些,因为它通过观察者模式处理标签。我将尝试更新文档,但您可以查看任何核心组件并看到代码已被简化并在某种程度上从 JTable 中移出。

更新:

我更新了 3.1.4 的文档,包括如何修改旧代码以使其工作。

于 2013-07-27T01:19:41.187 回答
1

事实证明,如果您实例化 JTable,那么新的 com_tags 将不会使用$data['tags'],相反,您需要将标签直接绑定到$tableas table->newTags = $data['tags'];,这样您新插入的文章将被正确标记,因为您已经填充了 $data[' tags'] 与现有的标签 ID。

于 2013-07-31T03:19:02.110 回答
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!';
}

像魅力一样工作!似乎它可以很容易地适应任何可标记的项目。我想我的情况与原始问题类似,实际上将上面的代码与为我编译正确标签 ID 的 SQL 语句一起使用。这对答案毫无意义,但它让我不得不从 200 多个标签中手动标记 1,900 篇文章!

于 2015-09-16T13:46:07.640 回答