简体   繁体   中英

Adding tags to Joomla programmatically

I need to migrate about 600 tags from an old project to Joomla and would like to do that programmatically. I have looked but not found any hints about how that could be achieved. I found a few suggestions on how to add tags to an article programmatically (that might come in handy later, but first I need to have those tags). I thought about doing it straight via a database query but Joomla insists on using nested tables everywhere (tags table has a lft and rgt row). Can I safely ignore those or does it break the system somewhere down the line?

thanks for any help in advance.

This is a CLI I have that reads a csv file and creates tags from it. By using the API the store() will create the correct nesting data. It's very rough because it was just for testing the tags api/performance so you may want to clean it up especially if you have other data you want to put into the csv (or a different data source). Update: also it's a little old so you probably need to import the cms and legacy libraries because of the changes that were made to store() in 3.2. The is something in the docs wiki about why CLI apps break in 3.2 that you should look at.

<?php
/**
 * @package    Joomla.Shell
 *
 * @copyright  Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

if (!defined('_JEXEC'))
{
    // Initialize Joomla framework
    define('_JEXEC', 1);
}

@ini_set('zend.ze1_compatibility_mode', '0');
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Load system defines
if (file_exists(dirname(__DIR__) . '/defines.php'))
{
    require_once dirname(__DIR__) . '/defines.php';
}

if (!defined('JPATH_BASE'))
{
    define('JPATH_BASE', dirname(__DIR__));
}

if (!defined('_JDEFINES'))
{
    require_once JPATH_BASE . '/includes/defines.php';
}

// Get the framework.
require_once JPATH_LIBRARIES . '/import.php';
// Get the framework.
require_once JPATH_LIBRARIES . '/import.legacy.php';

// Bootstrap the CMS libraries.
require_once JPATH_LIBRARIES . '/cms.php';

// Import the configuration.
require_once JPATH_CONFIGURATION . '/configuration.php';

// System configuration.
$config = new JConfig;
// Include the JLog class.
jimport('joomla.log.log');

// Add the logger.
JLog::addLogger(
     // Pass an array of configuration options
    array(
            // Set the name of the log file
            'text_file' => 'test.log.php',
            // (optional) you can change the directory
            'text_file_path' => 'somewhere/logs'
     )
);

// start logging...
JLog::add('Starting to log');   


// Configure error reporting to maximum for CLI output.
error_reporting(E_ALL);
ini_set('display_errors', 1);


/**
 * Create Tags
 *
 * @package  Joomla.Shell
 *
 * @since    1.0
 */
class Createtags extends JApplicationCli
{

    public function __construct()
    {
        // Call the parent __construct method so it bootstraps the application class.
        parent::__construct();
        require_once JPATH_CONFIGURATION.'/configuration.php';

        jimport('joomla.database.database');

        // System configuration.
        $config = JFactory::getConfig();

        // Note, this will throw an exception if there is an error
        // Creating the database connection.
        $this->dbo = JDatabaseDriver::getInstance(
            array(
                'driver' => $config->get('dbtype'),
                'host' => $config->get('host'),
                'user' => $config->get('user'),
                'password' => $config->get('password'),
                'database' => $config->get('db'),
                'prefix' => $config->get('dbprefix'),
            )
        );

    }

    /**
     * Entry point for the script
     *
     * @return  void
     *
     * @since   2.5
     */
    public function doExecute()
    {


    if (($handle = fopen(JPATH_BASE."/cli/keyword.csv", "r")) !== FALSE) 
    {
        fgetcsv($handle, 1000, ",");
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
        {

            $date = new JDate();
            include_once JPATH_BASE . '/administrator/components/com_tags/tables/tag.php';
            $table = new TagsTableTag(JFactory::getDbo());

            $table->title               = $data[0];
            $table->note                = '';
            $table->description         = '';
            $table->published           = 1;
            $table->checked_out         = 0;
            $table->checked_out_time    = '0000-00-00 00:00:00';
            $table->created_user_id     = 42;
            $table->created_time        = $date->toSql();
            $table->modified_user_id    = 0;
            $table->modified_time       = '0000-00-00 00:00:00';
            $table->hits                = 0;
            $table->language            = 'en-GB';
            //$table->parent_id         = 1;// doesn't do anything
            //$table->level             = 1;// doesn't do anything

    //      $table->setLocation(0, 'last-child');

            $table->check();

            $table->store();
        }   

    fclose($handle);
    }
    }
}

if (!defined('JSHELL'))
{
    JApplicationCli::getInstance('Createtags')->execute();
}

If you want use structural tags, just uncomment this line:

$table->setLocation(parent_id, 'last-child');

where parent_id - id of parent tag node

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM