RO CSVI
Multi replace plugin
| RO CSVI
Starting from RO CSVI 7.0 version, the RO CSVI replace plugin has been replaced by the much improved Multi replace plugin with more features. With this new rule plugin, it is possible to combine multiple conditions in a single rule.
To start, create a new rule from RO CSVI Rules page >> New
Give a name to the rule, select if it is for import or export and make sure that RO CSVI Multi replace has been selected in Plugins drop down list. Save these settings before setting up the actual rule.

Now there are various operations Multi replace rule plugin offers. We will go through them one by one.
1. Absolute Value
This operation will return absolute value (positive value) of a number. This is used mostly on negative number field which need to be shown as a positive number on import or export. For example if the value in the field is -13, applying this operation will convert this value to 13.

2. Find and Replace
This is one of the most used operation and has been inherited from old RO CSVI Replace rule plugin. As the name says it finds and replaces the text. The text to be replaced can be just a Regular text or could be a Regular expression. In case you are using regular expressions make sure to enclose your expression in delimiters. The usual delimiter is a forward slash /, for example /(\w+) (\d+), (\d+)/.

3. Find the position of the first occurrence of a substring in a string.
This operation helps you to find the position of a string inside another string. In the Find field set the string to search and in Start field set the position from where the string has to be searched. If you want to find the occurance of 'CSVI' in 'My lovely CSVI team' and 'My lovely RO Team'. This operation will return position as 11 for first string and false for second string as there is no CSVI in second string.

4. Lowercase
By setting this operation you can change the field value to all lowecase letters. For example for a string CSVI, this operation will convert it to csvi.

5. Uppercase
By setting this operation you can change the field value to all uppercase letters. For example for a string csvi, this operation will convert it to CSVI.
6. Substring
You want to retrive a part of the string then use this operation. Set the start and end position from where the part of string to be extracted. For example if you want to extract love from the string iloveicecream, in the start field set 1 and end field as 5. Note that count of string starts at 0 and not 1.

7. Uppercase First letter
If you want to convert only the first character to uppercase and not the whole string, this operation will help with that. Say if you have a string netherlands, this operation will convert it to Netherlands.

8. Add before value
You want to add some text before a value in import or export then use this operation. Say if the value is happy and you want to add I am before this value, set I am in Value field, save the rule and apply the rule on the field this value to be applied. It will output as I am happy.

9. Add after value
Use this operation to append a string to the value. For example if the value is Bad and you want it to be exported or imported as Bad guy. In the value field set guy, save the rule and apply the rule on the field the value to be applied. Your output will be Bad guy.

10. Date
Get the current date and time in the format you want. More about date formats can be found at the PHP date manual. If the Date format field is set as Y-m-d, the output will be 2019-02-08.

11. Custom date format
The previous operation will output the current date and time whereas this operation is used to convert the format of date stored in database. The best example will be Orders created date. You can change this order created date to the format you want in export.

12. Unique ID
Most of the times, you would need to generate a random string automatically. This operation will help with that. Setting this operation will generate random value like 4b3403665fea6.

13. Uppercase words.
Use this operation to uppercase all the starting letter in words in a sentence. If the sentence is like i love to eat icecream, this operation will change this to I Love To Eat Icecream.

14. Round.
Use this operation to round a value to specified decimals.
Examples:
round(5.045, 2) will be rounded to 5.05
round(3.6, 0) will be rounded to 4
round(135.79, 1) will be rounded to 135.8

15. Floor.
Use this operation to rounds the number to the nearest integer below its current value.
Examples:
floor(5.2) becomes 5
floor(8.9) becomes 8

16. Ceil.
Use this operation to round the number it to the nearest integer above its current value.
Examples:
ceil(5.2) becomes 6
ceil(8.9) becomes 9

Multiple Operations
The best of Multi replace plugin is that you can add multiple operations as one rule. Here are few examples which explains on how to use multiple rules.
1. For example you have text 'My CSVI Support' and it needs to be changed to 'My CSVI Team', Find 'Support' and Replace with 'Team'. Also add ' from Netherlands' text at the end so the full text is 'My CSVI Team from Netherlands'. Here we need two operations one using Find and Replace and other using Add after value. The rule for this will look like

2. Say if you want to convert all the letters to lowercase in the string 'MY CSVI TEAM' and then select only team from the string and then finally need to add a text at front as Super so the final text changes to 'Super team'.

The use and non-use of ID fields
| RO CSVI
The use of ID fields in import files often gives many users problems, whether this is due to not reading the documentation or expecting different behaviour from CSV Improved is not the question I want to answer here. What I do want to hightlight is the problems that might occur using ID fields.
What is an ID field?
An ID field is a field that holds a unique reference number for data in the database. Examples of ID fields are:
- product_id: Holds the ID for a product
- manufacturer_id: Holds the ID for a manufacturer
- category_id: Holds the ID for a category
- etc.
What is the life expectancy of an ID field?
The life expectancy of an ID field can range from days to years. As long as the data does not get deleted from the database the ID stays the same. Regularly deleting and importing new data makes the ID change as often as this process is repeated.
How important is the ID field?
As mentioned earlier, the ID field is unique. This makes it important however not as important as other fields that are more consistent than the ID field. Some examples of more important fields:
- product_sku: The Stock Keeping Unit will almost never change as it identifies a specific product
- manufacturer_name: The name of a manufacturer is also unlikely to change
- category_path: The name of a category is unlikely to change
Even though the ID field is important to the shop, other fields are more important for import.
Which field should I use?
It is advised not to use ID fields for import. CSV Improved will find the correct ID based on the other fields you import. If an ID is ever changed and you don't know about it, the import will go wrong.
Another example is when you are importing new data, the ID field does not exist and nothing will be imported as the database cannot find the ID and your shop will remain empty.
Final words
Be cautious using ID fields in your import file, imports are more likely to succeed not using these fields.
Run an RO CSVI cron job using a URL on the frontend
| RO CSVI
In the document Setting up a cron job we explain how to run import and export jobs using the command line in RO CSVI. This is the preferred way of running cron jobs because this is generally not limited by the limitations imposed by running an import or export through the browser. However in some cases you may need to run a cron job using a URL on the frontend, in this document we explain how to set this up.
Deal with different collations in MySQL
| RO CSVI
One of the common issue which arises after migration of database is dealing with different collations in tables. Database cannot handle the mix of these collations and throw error like
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
The cause for this error is because two different fields are been set with two different collation in same table.

To solve this problem
1. Go to PhpMyAdmin, select your database.
2. Look for the table having the issue, in this case it is #__virtuemart_products table.
3. Check the field which is having a different collation than other fields, in this example it is product_gtin. Normally fields use utf8_general_ci as collation or check what is the collation for your other fields in the table.
4. Select the Structure tab to see the complete field structure of the table.
5. Click on the edit icon or Change link for the field, here it is product_gtin. In the collation drop down look for utf8_general_ci and save the field.

Thats all to be done. If you still continue having the error, check for the same issue in other related tables.
Here are the few queries which can be used to convert column name or table or database to required collation.
To convert a column:
ALTER TABLE `your_table` CHANGE `your_column` `your_column` your_field_column_type
CHARSET utf8 COLLATE utf8_general_ci NULL;
your_field_column_type is the data type of the column like VARCHAR(10).
You need to replace this to the type of your column you are changing the collation.
To convert a Table:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
To convert a Database
ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci
If you have collation looking good on tables and columns and you still have this error, Check if your import file is UTF-8 encoded. You can check that by using CSVI Analyser page. If you see any unreadable characters as in the image then you need to Save your CSV file as UTF8 encoded file before running the import.

More articles on this subject
I want to import articles with images
| RO CSVI
With RO CSVI it is possible to import Joomla articles with images for fields image_intro and image_fulltext.