strapi-community / strapi-plugin-slugify

A plugin for Strapi Headless CMS that provides the ability to auto slugify a field for any content type.
https://market.strapi.io/plugins/strapi-plugin-slugify
MIT License
45 stars 21 forks source link

[FR] add component reference type support #101

Open pgsfredda opened 1 year ago

pgsfredda commented 1 year ago

Hi.

No slug is generated for components.

I have analyzed the 'setting-service.js' file. I developed a possible fix that is working for me (see below).

With that fix, to produce the slug for the fields in a component, you have to set the plugin settings file field contentTypes using the value of the collectionName field used in the component configuration file.

Strapi: 4.11.4 Strapi Plugin Slugify: 2.3.3 MySQL: 8.0.30 (MySQL Community Server - GPL)

Here is a possible fix to generate a slug for components by changing the build method:


build(settings) {

    const buildModel = (contentType, uid, nameAttr,displayName) => {
        const model = settings.contentTypes[contentType[nameAttr]];
        if (!model) {
            return;
        }

        // ensure provided fields are present on the model
        const hasField = isValidModelField(contentType, model.field);
        if (!hasField) {
            strapi.log.warn(
                `[slugify] skipping ${contentType.info[displayName]} registration, invalid field provided.`
            );
            return;
        }

        let references = _.isArray(model.references) ? model.references : [model.references];
        const hasReferences = references.every((referenceField) =>
            isValidModelField(contentType, referenceField)
        );

        if (!hasReferences) {
            strapi.log.warn(
                `[slugify] skipping ${contentType.info[displayName]} registration, invalid reference field provided.`
            );
            return;
        }

        const data = {
            uid,
            ...model,
            contentType,
            references,
        };
        settings.modelsByUID[uid] = data;
        settings.modelsByName[contentType[nameAttr]] = data;
    };

    // build models
    settings.modelsByUID = {};
    settings.modelsByName = {};

    _.each(strapi.contentTypes, (contentType, uid) => buildModel(contentType, uid, 'modelName', 'singularName'));
    _.each(strapi.components, (contentType, uid) => buildModel(contentType, uid, 'collectionName', 'displayName'));

    _.omit(settings, ['contentTypes']);

    return settings;
}
ComfortablyCoding commented 1 year ago

Thanks for the request and suggestion. For now this plugin only supports fields define don the model directly.

I will at some point add relational and component support. At the moment their is no eta for that.

I am thinking instead to change how the settings work. For reference fields it will allow for a string or object. In object mode you can specify the path and type (field,relation,component) that the reference field is.

RayHughes commented 1 year ago

Also requesting support for object reference. Example: We have categories like cat cat2 and we would like to be able to auto generate cat/article cat2/article2

Each category has a field on it called slug path