10
votes

Commutation de thème utilisateur avec Sass - Ruby sur rails

J'ai donc un système d'administrateur Rails qui permettra à un utilisateur de choisir un thème, essentiellement un ensemble de variables de couleur Sass qui recompilera les applications.css.scss avec les nouvelles couleurs. Quelle serait la meilleure façon de changer cela lorsque l'utilisateur sélectionne à partir d'une liste déroulante et soumise? J'ai lu quelque chose sur certains problèmes de mise en cache et de recompilation, mais je ne suis pas totalement claire comment la configurer.

Actuellement, j'ai ... P>

Application.css.scsss P>

$theme_sprite_path: '/images/sprite_theme_name.png';
$main_color:#009DDD;
$secondary_color:#b3d929;
$light_background:#f2f2f2;
$border_line:#e6e6e6;
$off_white:#f9f9f9;
$white:#ffffff;
$font_body:#565b59;
$font_headers:#363a36;


2 commentaires

Au fait, si vous ne le saviez pas, vous êtes censé accepter une réponse si vous trouvez cela utile (s'il y en a plusieurs, choisissez le meilleur). De cette façon, vous remerciez vos pairs pour l'aide :-)


J'ai raté ça, trié maintenant. Merci.


4 Réponses :


1
votes

Je crois que vous pouvez utiliser ERB sur des variables en ligne en sass. Je ne suis pas positif, mais je pense que cela ressemblerait à ce que ceci:

thèmes / _whatever_theme.sass.erb xxx

Ceux-ci doivent être créés de manière dynamique pour chaque charge de page . Je ne sais pas comment la mise en cache fonctionnerait ici.


2 commentaires

Qui vaincre essentiellement le but de l'actif de l'actif :-)


Il pourrait tout aussi facilement être fait dans un fichier d'actifs / feuilles de style / style.sass.erb.



12
votes

3 étapes faciles:

  1. compiler tous les thèmes dans différents fichiers lors du déploiement. Cela s'occupera de l'horodatage, de la zippation, etc. p> li>

  2. Render Page avec thème par défaut. p> li>

  3. Utilisez JavaScript pour charger un thème alternatif CSS. P> LI> ol>

    Pas besoin de déconner avec la compilation dynamique et de tout cela. P>

    Pour charger un CSS Dynamiquement, vous pouvez utiliser quelque chose comme ceci: p>

    function loadCSS(url) {
      var cssfile = document.createElement("link");
      cssfile.setAttribute("rel", "stylesheet");
      cssfile.setAttribute("type", "text/css");
      cssfile.setAttribute("href", url);
    }
    


2 commentaires

En y réfléchissant, cela semble le moyen le plus simple de la mettre en œuvre. Essentiellement, je pourrais avoir .. theme_one.css.scss theme_two.css.scssssSSS à l'intérieur comprenant ce que j'ai besoin ... @import "thèmes / theme_one_colors"; @import "commun"; @ Import "RESET"; @import "base"; ' appeler simplement <% = stylesheet_link_tag "# {nom_name}"%> et changer si nécessaire, je pense que je pense :)


En fonction de la quantité de chevauchement entre vos thèmes, ma suggestion pourrait être plus sèche



2
votes

Une option consiste simplement à charger simplement un ensemble de règles CSS personnalisées (votre thème) après votre application.css et de laisser votre thème remplacer les couleurs par défaut de l'application.css. Vous pouvez simplement ajouter une colonne de base de données "Theme" et charger le CSS avec ce nom de manière dynamique.

Sass n'est pas conçu pour la compilation de données dynamiques à la volée. Si vous souhaitez un traitement dynamique du CSS, vous pouvez ajouter une méthode de contrôleur appelée "Custom_CSS" et faire cette réponse au format CSS et le charger de manière dynamique avec des variables en ligne, mais je ne pense pas que SASS est destiné à être utilisé pour le tout.


4 commentaires

Oui, les suggestions de Sergio sont super. Je diviserais toujours le thème.css et l'application.css, il me semble tout simplement plus propre pour moi.


La base de données est également une bonne suggestion, même si cela n'a de sens que si vous devez prendre en charge les thèmes définis par l'utilisateur. Sinon, vous stockez / migration / gestion des détails de la présentation dans la couche de données de l'application. Cela semble être un mauvais flux de travail et un choix de performance.


Oh, j'ai compris cela comme si l'utilisateur doit choisir son thème qui doit être stocké et utilisé pour son profil. Dans ce cas, je ne connais aucun autre moyen de stocker le nom de thème dans la base de données.


Oui, l'utilisateur choisirait un thème qui serait ensuite stocké dans la base de données, j'ai baissé la déroute suggérée de Segio pour l'instant, mais merci pour toutes vos suggestions.



7
votes

La réponse de Sergio est valide, mais omet les détails impertinents et j'avais utilisé une approche légèrement différente.

Vous utilisez Sass dans les rails - ne vous battez pas le courant, soyez rabais et laissez le pipeline d'actif avant tout votre CSS. Sauf si vous essayez de faire quelque chose d'extrême comme CSSZengarden avec des centaines de thèmes strong>, ou chaque thème est des milliers de lignes forts> je vous recommanderais de définir chaque thème car sa propre classe CSS plutôt que son propre fichier. p>

  • 1kb de CSS supplémentaire dans le fichier d'application rendue.CSS ne va pas déranger vos utilisateurs li>
  • Il est simple d'allumer des cours de thème avec jQuery: $ (". thème thème"). Removeclass ([[tous vos thèmes]). addclass ("myLittlePonytheme"); Code> LI>
  • Comme impliqué, vous devrez marquer les éléments que vous souhaitez la mise à jour avec le thème ThemedElement Code> Classe Li> ul>

    Vous pouvez également changer la classe sur votre élément de niveau supérieur et faire une utilisation libérale de l'héritage et du ! Important code> Déclaration, bien que je trouve l'autre approche plus maintenue. P >

    Si vous pensez que vous pouvez gérer vos thèmes avec des classes plutôt que des fichiers, voici comment nous les générer avec SASS. Sass ne prend pas en charge les objets de style JSON, nous devons donc nous retrouver et mettre en place un tas de matrices parallèles avec les propriétés thématiques. Ensuite, nous iTerons sur chaque thème, remplacez les propriétés dynamiques dans la classe de thème générée automatiquement et vous êtes partis sur les courses: p>

    themes.css.scss. / strong> p> P> P>

    @import "global.css.scss";
    
    /* iterate over each theme and create a CSS class with the theme's properties */
    @for $i from 1 through 4{
    
                /* here are the names and dynamic properties for each theme class */
        $name: nth(("DefaultTheme", 
                            "MyLittlePonyTheme",
                            "BaconTheme",
                            "MySpaceTheme"
                            ), $i);
        $image: nth(("/assets/themes/bg_1.png", 
                             "/assets/themes/bg_2.png",
                             "/assets/themes/bg_3.png",
                             "/assets/themes/bg_4.png"
                            ), $i);
        $primary: nth((#7ca8cb,
                               #3c6911,
                               #d25d3a,
                               #c20d2c
                              ), $i);
        $font: nth((Rosario, 
                            Helvetica,
                            Comic Sans,
                            WingDings
                           ), $i);
    
    
        /* Now we write our Theme CSS and substitute our properties when desired */
    .#{$name}{
        &.Picker{
          background-image:url($image);
        }
        color: $primary;
        .BigInput, h1{
          color: $primary;
          font-family: $font, sans-serif !important;
        }
        .Frame{
            background-image:url($image);
        }
        .Blank:hover{
            background-color:mix('#FFF', $primary, 90%) !important;
        }
        .BigButton{
            background-color:$primary;
            @include box-shadow(0,0,10px, $primary);
        }
                /* and so on... */
           }
    


1 commentaires

Très bonne réponse! J'ai beaucoup aimé cette idée. En outre, des points de reconnaissance des pièges dans votre propre solution.