How can I change the favicon / icon in plone 6 classic

I have replace the PNG files inside egg but it still using the plone icon.

Any idea?

Many thanks

I finally find out it's cache issue thanks

You can add a favicon through the web via the Site Settings - Website.
There you can upload a custom favicon image.
This might also have some caching
as you can see here it was added in 6.0.0a3: Customise favicon TTW in same way as logo. · Issue #1122 · plone/Products.CMFPlone · GitHub

Does anyone know if you could also adjust the icon via code using the configuration registry (profiles/default/registry.xml).
The setting is called plone.site_favicon
When I look at it in the registry after uploading it looks like this: filenameb64:ZmF2aWN, so I would guess the base64 encoding of the image
I'd like to use a public url in the settings instead of an image.

An url means a subrequest on every page rendering, while icons are heavly cached in the and by the browser. If you mean the icon should have an icon, it has at /favicon.ico.

That makes sence, not having too many request when not needed :slight_smile:
We would like to set a custom favicon on many plone sites that exist, and on every new site we create.
But I guess I will have to look at some theming solution then probably

you can make a script to run from command line. I think you can use also restapi if installed.

https://docs.plone.org/develop/plone/misc/commandline.html

I once did this in registry.xml with Image to Base64 | Base64 Encode | Base64 Converter | Base64 for the image and Text to Base64 | Base64 Encode | Base64 Converter | Base64 for the filename. But beware: if your customer updates the logo afterwards it gets reset by genericsetup once you reimport your profile.

The following would set the current Plone Logo SVG file:

<record name="plone.site_logo">
    <value>filenameb64:cGxvbmVfbG9nby5zdmc=;data64:PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDEzLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMTQ5NDgpICAtLT4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJwbG9uZS1sb2dvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjIxNXB4IiBoZWlnaHQ9IjU2cHgiIHZpZXdCb3g9IjAgMCAxNTguMjUzIDQwLjY4NiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTU4LjI1MyA0MC42ODYiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik02NS4zMjcsMjMuMjA4aC02LjU4OXYxMS4zODhoLTQuMzkzVjUuNjM4aDEwLjk4MWM1LjY1MywwLDkuMjcxLDMuNzQyLDkuMjcxLDguNzg1ICAgUzcwLjk3OSwyMy4yMDgsNjUuMzI3LDIzLjIwOHogTTY1LjA4Miw5LjU4M2gtNi4zNDV2OS42MzloNi4zNDVjMy4wNSwwLDUuMTI0LTEuNzQ5LDUuMTI0LTQuNzk5ICAgQzcwLjIwNiwxMS4zNzIsNjguMTMyLDkuNTgzLDY1LjA4Miw5LjU4M3oiLz4KCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik04My45NjksMzQuNTk2Yy0zLjkwNCwwLTUuNjUyLTIuNjQ0LTUuNjUyLTUuNjkzVjUuNjM4aDQuMTQ4djIzLjAyMWMwLDEuNTg3LDAuNTY3LDIuMzk5LDIuMjM1LDIuMzk5aDEuODMgICB2My41MzhIODMuOTY5eiIvPgoJPHBhdGggZmlsbD0iIzAwODNCRSIgZD0iTTEwNC43NjIsMzIuMzk5Yy0xLjM0NCwxLjM4NC0zLjM3NywyLjQ0LTYuMTg0LDIuNDRjLTIuODA1LDAtNC43OTktMS4wNTgtNi4xNDEtMi40NCAgIGMtMS45NTEtMi4wMzItMi40MzktNC42MzctMi40MzktOC4xMzRjMC0zLjQ1NywwLjQ4OC02LjA2MSwyLjQzOS04LjA5NGMxLjM0Mi0xLjM4MywzLjMzNi0yLjQ0LDYuMTQxLTIuNDQgICBjMi44MDcsMCw0Ljg0LDEuMDU5LDYuMTg0LDIuNDRjMS45NTEsMi4wMzMsMi40MzksNC42MzcsMi40MzksOC4wOTRDMTA3LjIwMywyNy43NjMsMTA2LjcxMywzMC4zNjYsMTA0Ljc2MiwzMi4zOTl6ICAgIE0xMDEuNjI5LDE4LjYxM2MtMC43NzMtMC43NzMtMS44My0xLjE4MS0zLjA1MS0xLjE4MWMtMS4yMTksMC0yLjIzNiwwLjQwNi0zLjAxLDEuMTgxYy0xLjI2LDEuMjYxLTEuNDIyLDMuNDE2LTEuNDIyLDUuNjUyICAgczAuMTYyLDQuMzkzLDEuNDIyLDUuNjUzYzAuNzczLDAuNzcxLDEuNzkxLDEuMjIsMy4wMSwxLjIyYzEuMjIxLDAsMi4yNzctMC40NDcsMy4wNTEtMS4yMmMxLjI2Mi0xLjI2MiwxLjQyNC0zLjQxNywxLjQyNC01LjY1MyAgIFMxMDIuODkxLDE5Ljg3MywxMDEuNjI5LDE4LjYxM3oiLz4KCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik0xMjMuNjQzLDM0LjU5NlYyMi4wMjljMC0zLjIxNC0xLjgzLTQuNTk3LTQuMTQ3LTQuNTk3cy00LjI3MSwxLjQyMy00LjI3MSw0LjU5N3YxMi41NjZoLTQuMTQ3di0yMC42MiAgIGg0LjA2NXYyLjA3NGMxLjQyNS0xLjU0NiwzLjQxNi0yLjMxOCw1LjQ5LTIuMzE4YzIuMTE1LDAsMy44NjUsMC42OTEsNS4wODQsMS44NzFjMS41ODYsMS41NDUsMi4wNzQsMy40OTcsMi4wNzQsNS44MTV2MTMuMTc4ICAgTDEyMy42NDMsMzQuNTk2TDEyMy42NDMsMzQuNTk2eiIvPgoJPHBhdGggZmlsbD0iIzAwODNCRSIgZD0iTTEzNS43NzIsMjUuNDg2YzAsMy41MzcsMS44NzEsNS43NzQsNS4yNDYsNS43NzRjMi4zMTcsMCwzLjUzOS0wLjY0OSw1LjAwNC0yLjExNWwyLjY0MywyLjQ4MSAgIGMtMi4xMTUsMi4xMTQtNC4xMDcsMy4yMTMtNy43MjcsMy4yMTNjLTUuMTY2LDAtOS4yNzMtMi43MjUtOS4yNzMtMTAuNTc0YzAtNi42NzEsMy40NTctMTAuNTM0LDguNzQ0LTEwLjUzNCAgIGM1LjUzMSwwLDguNzQ0LDQuMDY3LDguNzQ0LDkuOTI1djEuODNIMTM1Ljc3MnogTTE0NC40NzUsMTkuNzkxYy0wLjY1LTEuNTQ1LTIuMTEzLTIuNjA0LTQuMDY2LTIuNjA0ICAgYy0xLjk1MSwwLTMuNDU3LDEuMDU5LTQuMTA3LDIuNjA0Yy0wLjQwNiwwLjkzNi0wLjQ4OCwxLjU0Ni0wLjUyOSwyLjgwN2g5LjI3M0MxNDUuMDAzLDIxLjMzNywxNDQuODgzLDIwLjcyNiwxNDQuNDc1LDE5Ljc5MXoiLz4KCTxjaXJjbGUgZmlsbD0iIzAwODNCRSIgY3g9IjE3LjgxNSIgY3k9IjExLjUxNiIgcj0iNC40MDIiLz4KCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik0zMS4xNjcsMjAuMzExYzAsMi40MzMtMS45NjksNC40MDEtNC40MDMsNC40MDFjLTIuNDI3LDAtNC40MDEtMS45Ny00LjQwMS00LjQwMSAgIGMwLTIuNDMzLDEuOTc1LTQuNDAxLDQuNDAxLTQuNDAxQzI5LjIsMTUuOTA5LDMxLjE2NywxNy44NzksMzEuMTY3LDIwLjMxMXoiLz4KCTxjaXJjbGUgZmlsbD0iIzAwODNCRSIgY3g9IjE3LjgwMSIgY3k9IjI5LjEzMSIgcj0iNC40MDIiLz4KCTxnPgoJCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik0yMC40NDEtMC4wNDVDOS4yMDctMC4wNDQsMC4xLDkuMDYzLDAuMDk5LDIwLjI5OEMwLjEsMzEuNTMyLDkuMjA3LDQwLjYzOSwyMC40NDEsNDAuNjQxICAgIGMxMS4yMzUtMC4wMDIsMjAuMzQxLTkuMTA3LDIwLjM0My0yMC4zNDNDNDAuNzgzLDkuMDYzLDMxLjY3Ny0wLjA0NCwyMC40NDEtMC4wNDV6IE0zMS44OTEsMzEuNzQ3ICAgIGMtMi45MzcsMi45MzQtNi45NzIsNC43NDItMTEuNDUsNC43NDNjLTQuNDc4LTAuMDAxLTguNTEzLTEuODExLTExLjQ1LTQuNzQzQzYuMDU4LDI4LjgxLDQuMjUsMjQuNzc1LDQuMjQ5LDIwLjI5OCAgICBjMC4wMDEtNC40NzgsMS44MDktOC41MTMsNC43NDMtMTEuNDVjMi45MzctMi45MzQsNi45NzItNC43NDIsMTEuNDUtNC43NDNjNC40NzgsMC4wMDEsOC41MTMsMS44MSwxMS40NSw0Ljc0MyAgICBjMi45MzQsMi45MzgsNC43NDIsNi45NzMsNC43NDMsMTEuNDVDMzYuNjMzLDI0Ljc3NSwzNC44MjUsMjguODEsMzEuODkxLDMxLjc0N3oiLz4KCTwvZz4KCTxnPgoJCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik0xNTMuOTg1LDkuOTVjLTEuMTk1LDAtMi4xNjQsMC45NzEtMi4xNjQsMi4xNjhjMC4wMDIsMS4xOTcsMC45NjksMi4xNjgsMi4xNjQsMi4xNjggICAgYzEuMTk5LDAsMi4xNzItMC45NzEsMi4xNzItMi4xNjhTMTU1LjE4NCw5Ljk1LDE1My45ODUsOS45NXogTTE1My45ODUsMTMuOTY4Yy0xLjAyMS0wLjAwMi0xLjg0Ni0wLjgyNy0xLjg0Ni0xLjg1ICAgIGMwLjAwMi0xLjAyMSwwLjgyNS0xLjg0OSwxLjg0Ni0xLjg1MWMxLjAyMywwLjAwMiwxLjg1MiwwLjgyOCwxLjg1NCwxLjg1MUMxNTUuODM2LDEzLjE0MSwxNTUuMDA4LDEzLjk2NiwxNTMuOTg1LDEzLjk2OHoiLz4KCTwvZz4KCTxnPgoJCTxwYXRoIGZpbGw9IiMwMDgzQkUiIGQ9Ik0xNTQuNTA3LDEzLjQwOWwtMC41NC0xLjA4aC0wLjQ4NnYxLjA4aC0wLjM4OXYtMi41NjRoMC45OTRjMC40ODQsMCwwLjc5NiwwLjMxMywwLjc5NiwwLjc1ICAgIGMwLDAuMzY3LTAuMjI0LDAuNjAyLTAuNTEzLDAuNjhsMC41OTIsMS4xMzZMMTU0LjUwNywxMy40MDlMMTU0LjUwNywxMy40MDl6IE0xNTQuMDU2LDExLjE5NWgtMC41NzV2MC44MDNoMC41NzUgICAgYzAuMjYxLDAsMC40MzctMC4xNDcsMC40MzctMC4zOTlTMTU0LjMxNywxMS4xOTUsMTU0LjA1NiwxMS4xOTV6Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==</value>
</record>
1 Like

Is the same problem here?

site_logo and site_favicon can also be added as following (e.g. via zconsole).

import os
import base64

def get_base64_image_from_file(file):
    with open(file, "rb") as image_file:
        datab64 = base64.b64encode(image_file.read())
    basename = os.path.basename(file)
    filenameb64 = base64.b64encode(str.encode(basename))
    base64_image = b"".join( [b"filenameb64:", filenameb64, b";datab64:", datab64] )
    return base64_image

from zope.component import getSiteManager
from plone.registry.interfaces import IRegistry
from plone.base.interfaces.controlpanel import ISiteSchema
import transaction

app._p_jar.sync()

site = app['Plone']
registry = getSiteManager(site).getUtility(IRegistry)
settings = registry.forInterface(ISiteSchema, prefix='plone', check=False)

settings.site_logo = get_base64_image_from_file('/path/to/logo.png')
settings.site_favicon = get_base64_image_from_file('/path/to/favicon.png')

transaction.commit()
2 Likes

You can use plone.api (untested) changing the lines between app._p_jar.sync() and transaction.commit() with :

from plone import api
api.portal.set_registry_record('plone.site_logo', get_base64_image_from_file('/path/to/logo.png'))
api.portal.set_registry_record('plone.site_favicon', get_base64_image_from_file('/path/to/favicon.png'))
1 Like

I did this for a project. With the context of How can I change the favicon / icon in plone 6 classic - #7 by petschki here the registry.xml:

<?xml version="1.0" encoding="UTF-8"?>
<registry>
  <record name="plone.site_favicon" interface="plone.base.interfaces.controlpanel.ISiteSchema" field="site_favicon">
    <field type="plone.registry.field.Bytes">
      <description>This shows a custom favicon on your site.</description>
      <required>False</required>
      <title>Site Favicon</title>
    </field>
    <value>filenameb64:«base 64 encoded name»;data64:«base 64 encoded favicon»</value>
  </record>
  <record name="plone.site_favicon_mimetype" interface="plone.base.interfaces.controlpanel.ISiteSchema" field="site_favicon_mimetype">
    <field type="plone.registry.field.TextLine">
      <default>image/vnd.microsoft.icon</default>
      <description>
MIME type of the favicon (automatically set when a new favicon is uploaded)
</description>
      <required>False</required>
      <title>MIME type of the site favicon</title>
    </field>
    <value>image/vnd.microsoft.icon</value>
  </record>
</registry>

Note: I removed the ns0 namespace for translation that is in the registry export, I didn't have time to find out.

Using z3c.jbot you can also override the default favicon. That was implemented in Add support for Plone resource overrides by malthe · Pull Request #12 · zopefoundation/z3c.jbot · GitHub

1 Like

Cool, is there an example? I think people will always find the registry way when searching for it.

If you refer to this:

you're overriding the barceloneta theme favicon but not the /favicon.ico which is stored in the registry.

This lines

don't use the Zope traverse to find the icon but lookup directly on the filesystem. So, no override. It works only for the viewlet (html), but you can see it when loading a file in the browser (pdf, an image) coming from Plone: the Plone icon is used.

This PR:

removed barceloneta-favicon.ico from the theme, so it can't be overridden as static resource :sleepy:

1 Like