Tek bir sayfa / düğüm için CSS eklemenin bir yolu var mı?


79

Büyük çılgın stil sayfalarımı temizleyeceğim (muhtemelen gelecekteki bir soruyla ilgili) ve belirli bir düğüme veya sayfaya özel CSS eklemenin en iyi yolunu düşünüyorum.

Özellikle, çalışma sitemin ana sayfası bir Panel Sayfasıdır ve farklı stillere sahiptir. Şu anda CSS sadece ana tema stil sayfasına dahil edilmiştir.

"Bu, Foo düğümü ise, o zaman foo.css ekleyin" demenin bir yolu var mı? Aradığım CSS Enjektör mü ?

Ben belki vb diğer düğümler / bölümlere / bu genelleme ilgi, ama şu anda ben sadece bu bir öğe işlemek istiyorum.

Yaptığım şeyi yaptım.

Bir Zen alt öğesi kullanıyorum ve template.php yoluyla okurken, koşullu stil sayfalarını dahil etmek için bazı kodların yorumlandığını keşfettim. Aşağıdaki kod tam olarak ihtiyacım olanı yaptı:

if (drupal_is_front_page()) {
  drupal_add_css(path_to_theme() . "/foo.css", 'theme','all'); 
}

(Bir hisse senedi Zen template.php dosyasındaki Satır 80, FWIW.)



oluşturmak page--front.tpl.phpvepage.tpl.php
M ama D

Yanıtlar:


69

Bu kodla yapacağım türden bir şey, ama bunun nedeni sadece yuvarlamam.

Template.php'de şöyle bir şey isteyeceksiniz:

function MYTHEME_preprocess_node($vars) {
  if (drupal_get_path_alias("node/{$vars['#node']->nid}") == 'foo') {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/css/foo.css");
  }
}

Foo'yu kendi kodunuzla ilgili değerlerle değiştirin.


Öyleyse, giriş sayfası için if(drupal_is_front_page()) {yerine kullanır if(drupal_get_path_alias [etc]mısın?
epersona

Evet, şartlar tamamen size kalmış. İstersen basitçe bir $vars['#node']->nid == $nidçek yapabilirsin.
Deşifre

8
Deşifre, kodunuzla ilgili herhangi bir hata bulamıyorum. Ancak Drupal izin yapılandırmasından bahsetmediğiniz sürece, rolünüzün gerçekten yuvarlanma şekliniz olması gerektiğine işaret etmemi umursamayınız. ;-)
medden

2
Bilginize, Drupal 7 kullanıyorum $vars['elements']['#node']->nidve takma ad araması yerine kullanmam gerektiğini öğrendim . Son Drupal 7’de ise #nodeköklerinden hiçbir kök çıkmadı vars.
Wes Johnson

MYTHEME__preprocess_node ($ vars) önünde bir işleve sahip olmamalı mı? Oradaki tüm kodu sadece işlevler açısından görüyorum?
pal4life


16

Sayfanız / bölümünüz için bir Bağlam oluşturun ve verilen bağlam için CSS ve / veya javascript'i yüklemek için Bağlam Varlıkları modülünü kullanın.

Bağlam:

Bağlam, sitenizin farklı bölümleri için bağlamsal koşulları ve reaksiyonları yönetmenizi sağlar. Her bağlamı sitenizin bir "bölümünü" temsil ediyor olarak düşünebilirsiniz. Her içerik için, bu içeriği aktif olmak üzere tetikleyen koşulları seçebilir ve Drupal'ın bu aktif içeriğe tepki vermesi gereken farklı yönlerini seçebilirsiniz.

Hangi içeriğin aktif olduğunu görmek için koşulları sayfa yükleme sırasında kontrol edilen bir kurallar kümesi olarak düşünün. Aktif bağlamlarla ilişkili olan herhangi bir reaksiyon daha sonra ateşlenir.

Bağlam Varlıkları Ekleme:

Bağlam ekleme varlıkları bunu yapmanıza izin verir. Bunları herhangi bir kod yazmadan yapabilmeniz için kullanıcı arayüzünü kullanmak kolaydır. Ctools kullandığı için bunların hepsi de ihraç edilebilir.


Yaptığım her web sitesinde Context Add Assets'i kullanıyorum - eğer Context'lerin içine giriyorsanız (bu benim yapımımın her bölümünü yönlendirir) Add Assets mükemmeldir!
electblake

13

Küçük bir CSS tutarıysa, CSS seçicinizi düğüme göre oluşturup css'inizin CSS'sine dahil etmeyi düşünebilirsiniz. Drupal 7, body.page-node-NODEID seçicisini sağlar ve Drupal 6 için Zen, benzer vücut CSS sınıfları sağlar.


temelde yaptığım şey buydu ... ve neredeyse 200 satırdı, bu yüzden başka bir yere taşımak iyi bir fikir gibi görünüyordu. (evet, muhtemelen kısa olmalıdır ayrı bir adım olabileceğini..)
epersonae

Diğer taraftan, cevabınız beni (Zen çocuğum) şablonumdaki template.php dosyasını okudum ve bu da beni son cevaba ulaştı.
epersonae

7

Özel bir modül oluşturabilir ve stilel sayfaları düğüm kimliğine göre seçmeli olarak yüklemek için hook_preprocess_node () işlevini kullanabilirsiniz.

İşte bir örnek:

function MYMODULE_preprocess_node($vars) {
  $nid = 3;
  if (arg(0) == 'node' && is_numeric(arg(1)) && arg(1) == $nid) {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/foo.css");
  }
}

MYMODULE'ı modülünüzün adıyla değiştirin ve MYTHEME'yi css dosyasını içeren temanın adıyla değiştirin.


hook_init () her sayfa yükünde ve genellikle birden çok kez (AHAH) çalışır, neden yalnızca bir düğüm işlendiğinde çalışan hook_preprocess_node () (ya temada ya da bir modülde) kullanılmaz?
deşifre

İyi nokta, init'in birçok kez yüklendiğini bilmiyordu.
Camsoft

Şifre çözme, ön işleme işlevini kullanma örneğimi düzelttim. Hala öğreniyorum!
Camsoft

O zaman bir sonraki soru node için değişkenleri $ vars geçerken nid için arg (1) 'in neden kullanılacağı olacaktır. Bu daha sonra benim
cevabımdan

Sanırım hook_preprocess_node () belgelerini okumalıydım. Kesinlikle haklısın. Epersonae, Decifher'in cevabını kabul etmenizi öneririm.
Camsoft

7

Bir CSS stili ekleme kriterleri bir düğümün bazı özelliklerine bağlıysa, uygulayacağım MYTHEME_preprocess_node(&$variables); işleve iletilen değerlerden biri $variables['node'](olmadığını fark etmek $variables['#node']).

MYTHEME_preprocess_node(&$variables) {
  if ($variables['node']->nid == 3) {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/foo.css");
  }
}

Kriterler herhangi bir düğüm özelliğine bağlı değilse, uygulayacağım MYTHEME_preprocess_page(&$variables); $variables['node']Gösterilen sayfa bir düğüm sayfasıysa, bir düğüm nesnesi içerir. Drupal 6'da işlem fonksiyonu da alır $variables['is_front'], ancak Drupal 7'de aynı değişken geçilmez; Sayfanın ön sayfa olup olmadığını bilmeniz gerekiyorsa, kullanmanız gerekir drupal_is_front_page().

MYTHEME_preprocess_page(&$variables) {
  if ($variables['is_front']) {
    drupal_add_css(drupal_get_path('theme', 'MYTHEME') . "/foo.css");
  }
}

5

Yönetici tabanlı bir şekilde yapmak için CSS modülüne bakarım . Size ekleyebilirsiniz alanı ekler CSS ile node/addve node/editsayfalara.

CSS:

CSS modülü, yeterli izinlere ve etkin düğümlere sahip kullanıcılar için, düğüm oluşturma sayfasındaki bir CSS alanını ekler.

Kullanıcılar CSS düğüm alanına CSS kuralları ekleyebilir ve bu kurallar düğüm görüntüleme üzerinde ayrıştırılır.

Bu şekilde CSS deneyimli kullanıcıları, düğüm içerikleri için karmaşık CSS tabanlı tasarım oluşturabilir.

Önemli: CSS düzenleme izinlerinin yalnızca güvenilir kullanıcılara (yöneticiler) verilmesi gerektiğini unutmayın. Bu izne sahip kötü niyetli kullanıcılar, site tasarımınızı bozabilir ve ayrıca güvenlik sorunları (XSS) sunabilir.


3

CodePerNode harika, ancak CSS Enjektörünün kurulumu daha kolaydır (kitaplığa gerek yoktur). Modül, içerik yöneticisinin PHP koduna veya INFO dosyalarına hiç dokunmadan belirli sayfalara dinamik olarak CSS eklemesini sağlar. 15777 kurulumları yanlış olamaz - bu, modülün çalıştığı sosyal bir kanıt. CSS ayrıca normal önbellekleme sistemi ile önbelleğe alınır.


2

Zaten Paneller kullandığınızdan, ana panelinizin her bölgesi için CSS'nizi Panel Stili olarak eklemeniz daha kolay olabilir. Özel biçimlendirmeyi burada tanımlayabilir ve sitenizde yeniden kullanabilirsiniz.

Ayrıca, ana sayfanız için sayfa yöneticisi değişken kuralının Genel bölümüne de gidebilirsiniz. Burada sadece mevcut panel için CSS kimlikleri ve kuralları eklemek için bir bölüm var.

Not: Bunların hepsi D7’dedir, bu nedenle bu yaklaşım Paneller tarafından önceki sürümlerde olduğundan daha iyi destekleniyor olabilir.


2

/ * İçerik türüne göre css eklemek için bartik temasını kullanan bir örnek * /

function bartik_preprocess_node(&$variables) {
if(!empty($variables['node'])) {
    if($variables['node']->type == 'my_custom_content_type')
    {
      drupal_add_css(drupal_get_path('theme', 'any_theme_name') . "/css/foo.css");   
    }
  }
  // Some other code here
}

2

Bunu 'template.php' dosyanıza eklemeyi deneyin:

function mytheme_preprocess_page (&$variables)
{
  if (drupal_is_front_page()) {
    drupal_add_css(drupal_get_path('theme','mytheme'). '/css/front.css');
  } 
}

'Mytheme'i' tema dizininizin adı ve '/css/front.css' yerine CSS dosyanızın bulunduğu yolla değiştirin.

'Front.css' dosyasını diğer sayfalardan kaldırmak için 'template.php' dizinine eklemeyi deneyin:

function hook_css_alter(&$css) {
  if (!drupal_is_front_page()) {
    unset($css[drupal_get_path('theme', 'mytheme') . '/css/front.css']);
  }
}

Yine, 'mit'i' tema dizininizin adıyla değiştirin.

'Styles.css' dosyasını ön sayfadan kaldırmanız gerekirse, bu iki kodu birleştirmeniz yeterlidir.

Ön sayfada 'styles.css' olmadan 'front.css' ve diğer tüm sayfalarda 'front.css' olmadan 'style.css' gerektiğini varsayalım. Kod şöyle görünecek:

function mytheme_preprocess_page (&$variables)
{
  if (drupal_is_front_page()) {
    drupal_add_css(drupal_get_path('theme','mytheme'). '/css/front.css');
  } 
  else {
    drupal_add_css(drupal_get_path('theme','mytheme'). '/css/styles.css');
  }
}

function hook_css_alter(&$css) {
  if (drupal_is_front_page()) {
    unset($css[drupal_get_path('theme', 'mytheme') . '/css/styles.css']);
  }
  else {
    unset($css[drupal_get_path('theme', 'mytheme') . '/css/front.css']);
  } 
}

Ayrıca, 'mit'i değiştirin.

Umuyorum ki faydalı olacaktır.


Son kod, ihtiyacım olan şeydi. Ve işe yarıyor, yani, tema sayfalarım [tümü] [] = css / front.css 'ı tema.info' dan çıkardıktan sonra - sanırım yanlış bir şekilde, stil sayfaları ile birlikte yapmamız gerektiğini düşündüm [all] [] = css / stiller .css. Ayrıca page - pl.tpl.php ile page.tpl.php geçersiz kıldığım için işe yaramayabilir ama her şey güzel gidiyor gibi göründüğü için endişelendim. Bu gerçekten yardımcı olur. Teşekkürler!
Sd1

Sadece herkesin bu çözümü aldığından emin olmak için; styles.css (varsayılan) ve front.css dosyalarını theme.info dosyanızdan kaldırdığınızdan emin olun. Tüm önbellekleri yıkayın ve gitmesi iyi olur.
Sd1

1

Template.php dosyasına dokunmayı tamamen atlar ve temanızın .info dosyasına başka bir öğe eklerdim

Stil sayfanızın içinde olduğunu söyleyin css/foo.css.

Bu, theme_name.info dosyanızın şöyle görünmesini sağlar:

name = Theme Name
...
stylesheets[all][] = css/foo.css

O zaman ana stil sayfalarıyla önbelleğe alınmasından faydalanırsınız ve bunun ana sayfanız için olduğunu varsaydığımdan, mantıklı olacağını düşünüyorum.


Ve elbette seçicilerinizi düğümün özelliklerine, yani nid, düğüm türüne, vb. Dayalı olarak nitelemeniz gerekir
Alexander Hripak

Bu yaklaşımla ilgili sorun, sitedeki tüm sayfaları buraya css eklenmiş olarak etkileyeceğidir
pal4life

1

Drupal yaklaşımının dışında, HTML5'inizin gövdesinde sadece kısa bir css parçasına ihtiyacınız olduğunda, css kapsamı Attribute'e sahipsiniz. Bkz. Https://stackoverflow.com/a/4607092/195812

Bu çözüm kod düzenlemekten ve daha fazla modül kurmaktan tasarruf etmenizi sağlar


0

Gövde etiketinde sayfa düğümünü yazdırabilirsiniz

<body page-node-26419 ...>

Sonra kısıtlayabilirsiniz

body.page-node-26419 {
    background: red
}

Bu küçük hızlı değişiklikler için kullanışlıdır


Drupal Cevaplarına Hoşgeldiniz! Bu cevap yukarıda zaten Dave Reid tarafından sağlanmıştır.
Kojo,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.