Welcome to the support center for

Fancy Product Designer & Multistep Product Configurator


Process automation

First of all - a wunderful product you gave us with FancyProductDesigner!

As we plan to do some automation for order processing, it would be nice to have the following possibilities:

- automatically export FancyProduct with completion of an order

- therefor it would be nice to be able to define default export settings for a product

- exclude layers or images from export (like Paddaman requested earlier)

- callback hook (to do further processing like converting RGB-PDF to CMYK-PDF and so on..)

Is it possible to add (at least some of) the requested features?

If not, any suggestions or workarounds?

Thanx a lot!

15 people like this idea

This is a two year old post, and it has still not been implemented. Many much less important features have been added during this time. Sure, we have different needs, but you need to see the importance of this, Radykal.

Some points:

  • There are many posts here about this same thing.
  • We're willing to pay for it, wouldn't cost you an thing.
  • You could even hire someone else to do write the changes if you don't have time.
  • And then you could even sell it as another add-on, or just add to the main plugins price.
  • It would greatly improve your good product and it's value.

Agreed !!!

Please hire help. We need this before christmas !

Some companies are screaming for this feature to be able to process thousands and thousands of orders quickly.

Would also like this function!!

This is what I have been doing.

It's a python script, using selenium with Firefox and the geckodriver

It's very rough and dirty, but basically it simulates/automates a person going to admin.fancyproductdesigner.com and clicking on buttons, filling out fields etc.

Maybe someone will find it useful, if you do have thousands of orders then it could be optimized to run faster, but anything running in the background will chomp through orders rather fast.

I've broken this script out for you, but normally it's integrated into the rest of our production environment which all runs on python. For example I use a woocom api binding to pull in all the order info.

# This is a script file to do the web retrieval of orders
# Quick and dirty hack
# By Chris Murray
# 9-17-2017

import time,os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

LOGIN = ""  #admin.fancyproductdesigner.com  login
PASSWORD = "" #admin.fancyproductdesigner.com  password

orderIds = []  #put list of order id's here
path = "" #put a path to download images/pdfs here
excludes = [] #list of layer names you would like to exclude

tempPath = os.path.abspath(path+"/Pdfs/Temp") #change if you need to
pdfPath = os.path.abspath(path+"/Pdfs") #change if you need to

profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.dir", tempPath)
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("plugin.disable_full_page_plugin_for_types", "application/pdf")
profile.set_preference("pdfjs.disabled", True)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")  

browser = webdriver.Firefox(firefox_profile=profile)
browser.find_element_by_id('at-field-password').send_keys(PASSWORD + Keys.RETURN)
#there are better ways than using sleep, selenium can search for when a page or elements load, but this is easy.
#have a look here if you are interested 'http://selenium-python.readthedocs.io/waits.html'
browser.get("http://admin.fancyproductdesigner.com/website/https-XXXXXXXXX-com/order")  #change this to reflect your website

for orderId in orderIds:
    browser.find_element(By.XPATH, "//div[@data-id='%s']"%(orderId)).click()
    designButtons = browser.find_elements(By.XPATH, "//div[contains(@class,'fpd-order-item-btn')]")
    for n,button in enumerate(designButtons):
        itemId = int(button.get_attribute('data-id'))
        if n > 0:
        #bit to remove excluded layers    
        browser.find_element(By.XPATH, "//div[@data-action='manage-layers']").click()
        layerRows = browser.find_elements(By.XPATH, "//div[@class='fpd-list ui-sortable']/div[@class='fpd-list-row']")
        for layer in layerRows:
            layerName = layer.find_element(By.XPATH,".//div[@class='fpd-cell-1']").text
            if layerName in excludes:

        #bit to set options for download, you'll have to figure these out for your situation
        browser.find_element(By.XPATH, '//div[@class="ui radio checkbox"]/label["PDF"]').click()
        browser.find_element(By.XPATH, '//div[@class="ui radio checkbox"]/label["PNG"]').click()
        browser.find_element(By.XPATH, '//div[@class="ui radio checkbox"]/label["All"]').click()
        browser.find_element(By.XPATH, "//div[contains(@class,'ui search dropdown selection')]").click()
        browser.find_element(By.XPATH, "//div[@data-value='man']").click()
        browser.find_element(By.XPATH, "//input[@id='pdf-dpi']").clear()
        browser.find_element(By.XPATH, "//input[@id='pdf-dpi']").send_keys('90')
        browser.find_element(By.XPATH, "//input[@id='fpd-pdf-width']").clear()
        browser.find_element(By.XPATH, "//input[@id='fpd-pdf-width']").send_keys('296.3')
        browser.find_element(By.XPATH, "//input[@id='fpd-pdf-height']").clear()
        browser.find_element(By.XPATH, "//input[@id='fpd-pdf-height']").send_keys('254')
        checkBox = browser.find_element(By.XPATH, "//input[@id='pdf-include-text-summary']/parent::*")
        if 'checked' not in checkBox.get_attribute('class').split(' '):
        #bit to save the file
        #I use the temp directory to save the file, then change the filename
        #change file name to append item id (in case of multiple items per order). 
        #to avoid this step, there is probably a 'save as' option for selenium but I don't know what it is           
        if "%s.pdf"%(orderId) in os.listdir(tempPath):
        browser.find_element(By.XPATH, "//button[@id='fpd-generate-file']").click()
        for n in range(20):
            if "%s.pdf"%(orderId) in os.listdir(tempPath):
                if "%s_%s.pdf"%(orderId,itemId) in os.listdir(pdfPath):
                os.rename( os.path.join(tempPath,"%s.pdf"%(orderId)), os.path.join(pdfPath,"%s_%s.pdf"%(orderId,itemId)))


Login or Signup to post a comment