2013-07-26 55 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的等

此方法不會在3.1.4的Joomla工作,作爲標籤不再進入metadata領域,新格式{"robots":"","author":"","rights":"","xreference":""},即沒有更多tags鍵。

有誰知道如何在3.1.4中以編程方式將標籤插入Joomla?謝謝,

更新全碼:

,在3.1.1工作的完整代碼,其中$行[「標籤」]是一個整數數組,對應於#_tags exising標籤ID,並且$行中的所有其他字段都已定義好。

<?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. 移動,上面寫着「標籤」 => $行[「標籤」]行,根據元數據到其父陣列,即:

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

所以現在我們有$數據[「標籤」]填充整數映射現有的標籤ID的數組,presumabaly準備用於JTable store()方法;

  1. 除了方法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'])); 

隨着這些變化我還是不能插入添加標籤文章。

艾琳:感謝您的耐心等待!

+1

你的意思是把它們放在一個項目中顯示?最簡單的事情是將標籤JLayout嵌入到視圖佈局中。 標籤永遠不應該進入您的內容表..數據只記錄在content_itm_tags_mapping表。 tagItem()是從JHelperTags – Elin

+0

這個方法tagItem()需要$ ucmId傳遞,我該如何在代碼中返回這個變量?謝謝, –

+1

當api執行保存時發生這種情況,這就是預處理/後處理完成的原因。 – Elin

回答

1

事實證明,如果你實例化的JTable,那麼新com_tags不會採取$data['tags'],相反,你需要將代碼直接這樣你新插入的文章將被標記正確地考慮到你綁定到$tabletable->newTags = $data['tags'];,已經使用現有標籤ID填充了您的$ 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。

更新:

我更新的文檔3.1.4包括如何修改您的舊代碼,使其工作。

0

遲到的答案,但希望將從挫折保存下一個OP我試圖找到一種方法直接調用標記方法。

彼時我簡單地更新文章被標記的內容模型:

$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個標籤手動加標籤!

相關問題