Drupal - template.php dosyanın mantığı

7 Cevap php

Ben yüz konular aşağı benim ısmarlama SQL sorgusuna olduğunu ikna, ben miras bir drupal sitesi genişleyen içine bakarak bugün zaman iyi bir oran geçirdim.

Ben beri SQL (phpMyAdmin bunu kontrol ve drupal web sitesi içinde bir tür yürütme var) Tamam olduğunu anlamışlardır. Ben de içlerinden döngü ve özel biçimlendirme sayfada onları çıktısı ihtiyacım veritabanındaki tüm sonuçlar alıyorum mutluyum.

Döngü görüntülüyor nerede var sorundur. Ben tema sistemini anlamaya ya template.php içinde ne olup bittiğini anlamak için görünmüyor olabilir.

Anlatayım:

Ben değiştirmek için gereken kod template.php dosyasında oldu. Benim anlayış bu dosyayı belirli işlevleri ve tema öğeleri overide olanak sağlamasıdır.

Template.php dosya içinde bu ben değiştirmek için gereken kod:

//old function from original development
function abc($node,$submitted,$node_url) {
//execute code

}

Ben eski kod çıkışı oldu çıktı olmak istedim bu yüzden () fonksiyonu abc içinde benim kod eklendi.

Bu sql ve döngü benim pseudo kodu:

 function abc($node,$submitted,$node_url) {
$sql = 'my sql query'
$results =db_query($sql);
while ($data = db_fetch_array($results)) {
  //output my results here
}

}

Ne sql yanlış olduğuna inanmak götürdü ben 23 sonuç var olmasıdır, ama ben daha çok yinelenen girdileri başlamıştı. Zamanda yanlış yerde arıyor, ve sql tetkik sürü israf sonra, birden çok kez sql yinelenen girdileri dönen değil, sql ve döngüye işlevi olduğunu fark etti. Ben şöyle yaptım:

function abc($node,$submitted,$node_url) {
 $sql = 'my sql query'
 $results =db_query($sql);
 $x = 1;
 while ($data = db_fetch_array($results)) {
   if ($x == 1) {
     echo '<p style="background-color:#ccc;">'. $x . '. '.$data['title'] . '</p>';
   }else{
 echo '<p>'. $x . '. '.$data['title'] . '</p>';
   }
 $x = $x + 1;
}

}

Kod idam gibi bir artan sayı gibi birçok yinelenen girdileri ve gölge gri ilk girişin arka plan için gitmek için bekliyordum, ama olmadı. Sonuç 23 anda, 1 kendisini sıfırlamak ve sql ve döngü birden çok kez yürütme işlevi olduğunu bana gösteren, griye girişinin arka plan gölgeli.

Ben bu abc () fonksiyonunun ne olduğunu tamamen emin değilim, aslında dışında ben onun içinde benim kod yerleştirdiğinizde, ben başka hiçbir yerde (hiçbir yinelenen girdileri ile) belirli bir sayfada bunu ihtiyaç ve çıkış görüntüler.

Ben (hala template.php içinde) Bu işlevin dışında kodumu almak, benim kod arzu değil tüm sayfaların baş çıktı.

Herkes neler olabileceğini olarak herhangi bir fikir var mı, nerede benim kod görüntüsünü belirlemek için bu fonksiyon ne olduğunu bulmak ya da bir yol biliyor bakabilirsiniz?

Ben temalar vb hakkında biraz okuma olmuştur, ama başkasının kodu ile çalışan bir karışıklık kabus biraz dönüşüyor.

Önceden Cheers!

7 Cevap

Eğer Drupal nasıl çalıştığını deneyimsiz, muhtemelen çünkü burada yanlış yolda olduğunu, bu yüzden sana biraz bilgi ve tavsiye vereyim.

You could say that Drupal have to layers in which it execute code, the modules/core and the theming. Generally you could say that the first layer, the modules/core is the generation/fetching of data, while the 2nd is the presentation of that data. What you are doing is fetching data in the presentation layer, which really should be avoided. This is also the reason why you had so much trouble tracking down the cause, because of the confusion of what is getting the data and what is presenting it. What you did is also very much a waste of resource, I'll come to that later, but first what happened?

You have taken over a site, which probably have a custom theme, and I can tell that it has been made in an hacky way. Maybe the one who did it, didn't know the proper way but made something that “works”. Now what trying to alter it, you broke it. When Drupal presents a node (a node is a piece of content), it gets a lot of data, modules can hook in and add, alter or delete that data, and in the end the data gets to the template (all template files are denoted tpl.php - that is unless a different template engine is used). The way this works, is that it uses the “page” template to create the basics of the site, the navigation, the different regions ect. Now when displaying a list of nodes, each node will be displayed within the page template by having it's data outputted to the node template. Normally there's a lot of divs ect. combined with some php printing of data. In your example a function was also called. In some cases this can be fine, if you use fx translate functions for multi lingual sites or a simple function that checks something for you. However in your case you used that function to get data. By looking at the SQL you created it seems like you actually was trying to get the list of blog nodes you wanted to show. This could kind of work if only a single node was displayed, but when a list of nodes are displayed, you run the SQL and print the result for every node listed which is what got you in this mess. This is also very ineffective, as you run the query each time the node template is used. As you can see, it's very confusing and hard to control fetching data in the theming layer. But how do you do it then?

There are some different ways to do things kind of things, there are even made modules for this. Now it seems you want to display a list of blog nodes based on 2 CCK date fields.
The easy non coding way:
Simply create a view, using the views module. You can select nodes of type blog and filter based and the current data and the date on the cck fields. You can choose different displays. Showing either the full node or only part of the node, list, table ect. Lastly you select an URL for the view and you're done. The harder coding way:
Create a custom module. First you need to implement hook_menu() to create a menu item which is how you setup the URL. Doing that you assign a function that you must create for that URL. In it you put much of the above code, fetching the data with SQL, however you will also need to run that data through various theming functions that will generate the markup and lastly you return the data. This is actually quite easy to do, if you know how Drupal works. If not, it will be hard to do this properly as you will need to call a lot of functions you don't know, and implement hooks ect.

Bu biraz uzun ben rendelenmiş daha olmanın sona erdi, ama yeni Drupal site size yardımcı olur umarım.

Edit:

Deftere SQL çalışıyor görünen bir görünümden oluşturulan SQL gibi aslında görünüyor. Tek kusuru size daha fazla ya da artık eşit olması hem tarih alanları için sormak olmasıdır. CCK alanları varsayılan bir değer olabilir ama düğüm formu alanlarını gizlemek için düzenlendi sürece, düğümü düzenlerken her zaman istediğiniz gibi bunu düzenleyebilirsiniz inanıyorum. Ayrıca tarih yayımlamak için bir CCK tarih alanını kullanmak için herhangi bir neden olmaz. Bu bilgi son düzenlenmiş tarih ile birlikte her düğüm mevcuttur.

Sen Lullabot iyi şeyler bir sürü bulabilirsiniz. Onlar CCK ve görüşlerini nasıl kullanılacağı hakkında bir sürü şey yaptık. Sattıkları Bazıları ve bazı ücretsiz alabilirsiniz. Sizin örnekte, zor kısmı istediğiniz düğümleri oluyor. Eğer filtre eklemek için yapmamız gerekir. Eğer herhangi bir tarihe göre sıralamak istiyorsanız zaman, tarih grubunda bulunan bir tarih filtresi eklemeniz gerekir. Bu, size kullanmak istediğiniz alanları kontrol edebilirsiniz. Ancak sizin durumunuzda size alanlar için farklı değerlere sahip olarak, iki tarih alanları her biri için tarih filtresi eklemek istiyorum. Senin kusur olduğunu ve ne size sorun veriyor Burası muhtemelen.

Sadece benim yorum netleştirmek için, bu gibi görünmelidir:

function getData(){
   $sql='my sql query';
   results =db_query($sql);
   $return_string = '' ;
   while ($data = db_fetch_array($results)) {
      //Loop through data and save to $db_data
      $return_string .= $db_data;
   }
   return $return_string;

}

Eğer page.tpl.php içinde bu arama fonksiyonu ile doğru yoldayız gibi geliyor; Eğer koşullu $ node-> Nid belirli değerleri için çağrılırken tarafından sadece belirli sayfalarda görüntülemek olabilir unutmayın:

<?php if ($node->nid == xxx || $node->nid == yyy) print getData() ;?>

Eğer CCK kullanarak ve belirli içerik türleri için işlevinin sonuçlarını görüntüleyen ediyorsanız sadece, Contemplate esp, iyi bir modül. Drupalers başlangıç ​​için, bu biraz daha kolay hale getirir.

Kodu çalıştırdığınızda (örneğin yüklenmeye ise sayfanın en üstünde) oldukça değişkenlere daha basacaktır beri Eh, başlamak için, echo kullanmanız gerektiğini de şablon görüntüler Sayfanın uygun noktalar. (Bu, echo olmaz ever çalışmak demek değildir, ama bunu kullanarak iyi bir uygulama değildir.)

Önceki fonksiyon çıktı ne veri kullanabilir mi? (Işlev adlı if (abc) Eğer uygun değişken adlarını bulmak yardımcı olacak abc.tpl.php gibi bir şey adında bir sayfa olabilir.

Eğer kullandığınız SQL dizeleri eklerseniz, ben de bu sorunu teşhis etmek mümkün olabilir.

EDIT:

(Ben senin bir düğüm blog.tpl.php eksikliği söz üzerine bu temel) bir blog düğüm biçimlendirmek için çalışıyoruz, sizin daha önceki Yorumlarınız dayalı varsayarsak:

Bir sayfayı işlerken Drupal varsayımlar, böyle bir şey (basitleştirilmiş) gidin:

  1. Çekirdek yükleyin. Veritabanından içeriği tut. Taksonomi ve diğer güzellikler olsun ve modüller ve temalar bu kullanılabilir hale

  2. Then, look in all the modules to see if they have hooks that, based on their function name, will modify the page. If they do, run the functions. If they don't, leave the page alone.

  3. Then, look in all the theme to see if template.php have hooks that, based on their function name, will modify the page. If they do, run the functions. If they don't, leave the page alone.

  4. Son tpl.php dosyalara bakmak ve bu kullanarak sayfayı görüntülemek. Doğru dosya adı ile hiçbir tpl.php dosya varsa, o node.tpl.php kullanarak yükleyin

Tüm bu iyi bir özeti http://drupal.org/node/173880 yer almaktadır

Eğer sayfayı değiştirmek olacak gibi bakmak ve size aradığınız düğümü eşleşen tpl.php dosyaları template.php hiçbir işlevleri varsa, bu tüm sayfaları varsayılan şablonu kullanılarak yüklenen ediliyor demektir.

(Senin selefi o yaptığını garip inşaat kurmak Bu yüzden muhtemelen. Bir fonksiyonunu kullanarak bu Drupal tema fonksiyonlar aracılığıyla otomatik olarak yapabileceklerini yapmak için bir tür hacky yolu gibi)

Yani:

Devam edin ve tpl.php dosya olun. Içerik türü bir blog düğüm, ya da başka bir şey olup olmadığını düğüm-blog.tpl.php diyoruz. Muhtemelen sadece şimdi için varolan tpl.php dosyaları kopyalayabilirsiniz. Sonra, onunla birlikte gitmek için template.php bir preprocess işlevi oluşturun.

(- Zaten Devel modülü yüklü, böylece oradan Ziyaret / admin / build / sitenizde modüller de çalışacaktır kolay olmalıdır Drupal değişiklikleri tanıması için tema kayıt yeniden inşa etmek gerekir.).

Sonra, ziyareti http://drupal.org/node/223430 ve http://drupal.org/node/337022 bazı hızlı açıklamalar ve şablon sonra sayfalarınızda hale getirebilir ki, bir değişken olarak veri geçmek sağlayacak kod parçacıkları

Bir Son Düzenleme:

Bir ihtimal, bu fonksiyon blog yazılarını bir listesini oluşturmak etmez ve özet şeklinde (örn. bekleyen mesajların bir listesi) bilgi sunmak?

Eğer öyleyse, Görünüm modülü muhtemelen sizin için all bu işin yapabilirim çünkü ben soruyorum. Fonksiyonu abc veri işleme () gerçekten olmadıkça, gerçekten, fantezi, bu Views için inşa edildiğini şey sadece bir tür gibi görünüyor.

Template.php o da (size tarafından da site nasıl hacky yapıldığını bağlı özel bir modül mevcut olması template.php zorlayabilir sadece şablonları denir fonksiyonları saklamak için kullanılabilecek çeşitli tema işlevleri geçersiz için kullanılır olsa da orijinal geliştirici (ler)). Yani bir fonksiyon template.php olduğu sırf otomatik olarak (siz işlevi için o gerçek adını sağlayabilir eğer o olsa olmadığını belirlemek için yardımcı olacaktır) bir tema geçersiz olduğunu kabul etmez.

Ve nedeni fonksiyonu dışında kodunuzu alarak ama template.php içinde bırakarak template.php her sayfasında yer almaktadır, çünkü her sayfada çıkış neden olur. Teorik template.php sadece işlevleri daha fazla koyabilirsiniz. Büyük bir sitede ben geliştiricilerinden biri çok template.php sadece 2 ya da 3 fonksiyonları ve 3 veya 4 () 'ler arasında bir çift küçük dosyalar halinde işlevlerini dağıldı çalıştı.

Bu özel bir fonksiyon ya da bir tema geçersiz ise işlevin gerçek adını bilmek gerçekten belirlemek yardımcı olacaktır.

Eğer yükseltilmiş bir kaç soruyu cevaplamak için:

Önceki fonksiyon bu yapıyordu:

function abc($node,$submitted,$node_url) {
echo $node->taxonomy['color'];
$a = explode(",",$submitted);
$b = explode("-",$a[1]);

// THIS IS THE DESCRIPTION
if(strlen($node->content['body']['#value'])>180)
{
$c = str_split($node->content['body']['#value'],180);
$d = $c[0]."...";

}
else{
$d = $node->content['body']['#value'];
}


$multiple = $node->field_mul_event[0]['view'];
$eventcode = $node->field_event_code[0]['value'];

$strdata="";
$strdata.="specific markup to output here";
return $strdata;

}

Bu functionjust bir başlangıç ​​ve bitiş tarihi ve açıklama çıkardı

Benim kod sql dizesi:

select DISTINCT node.nid AS nid, node.title AS node_title, 
		  content_type_blog.field_tarih_from_value AS node_data_field_tarih_from_field_tarih_from_value, 
		  DATE_FORMAT(content_type_blog.field_tarih_from_value, '%%d/%%m/%%Y') AS tarihFrom, 
		  content_type_blog.field_tarih_from_value2 AS node_data_field_tarih_from_field_tarih_from_value2, 
		  content_type_blog.nid AS node_data_field_tarih_from_nid, 
		  field_mul_event_value AS multiEvent,
		  field_event_code_value AS eventCode,
		  node.type AS node_type, 
		  content_type_blog.field_event_excerpt_value AS node_data_field_tarih_from_field_event_excerpt_value, 
		  görüntü_attach.iid AS görüntü_attach_iid, 
		  node_görüntüs.filepath AS görüntüPath,
		  color AS catColour
		  FROM node 
		  node LEFT JOIN content_type_blog content_type_blog ON node.vid = content_type_blog.vid
			   LEFT JOIN görüntü_attach görüntü_attach ON node.nid = görüntü_attach.nid
               LEFT JOIN node_görüntüs node_görüntüs ON node.nid = node_görüntüs.nid
               LEFT JOIN term_node term_node ON node.nid = term_node.nid
               LEFT JOIN term_data term_data ON term_node.tid = term_data.tid
        WHERE node.type LIKE 'blog' AND content_type_blog.field_tarih_from_value >= DATE(NOW()) AND content_type_blog.field_tarih_from_value2 >= DATE(NOW()) 
        ORDER BY content_type_blog.field_tarih_from_value ASC

Ben size söyleyebilirim eminim gibi, bu sql hepsi aynı verileri çekiyor (ve bazı ekstra bilgi) günümüzün güncel ve daha sonra tarih sırasına emir onu daha eski verileri hariç.

Ben tema klasöründe bir görünüm almış ve iki tpl.php dosyaları onlara aynı kodla vardır:

<?php print $fields['title']->content; ?>
<?php print $fields['introduction']->content; ?>

Ben siteler / all / modules içinde gibi herhangi bir özel modülleri göremiyorum. Bu orada listesi (ama hepsi bana özgü modüller gibi görünüyor):

  1. CCK
  2. tarih
  3. devel
  4. extlink
  5. fckeditor
  6. görüntü
  7. IMCE
  8. menu_breadcrumb
  9. nice_menus
  10. node_görüntüs
  11. OtoYol'un
  12. bölümler
  13. swftools
  14. simge
  15. views
  16. wysiwyg

Benim cehalet dilerim - ama birlikte gitmek gibi ben drupal öğreniyorum. Ne demek istediğimi biliyorum, genellikle eğer bir wordpress gal daha. Benim bilgi eksikliği için benim temel bahane düğümler / taksonomi / drupal sistemi ve benzeri kullanılmaz.

Ben bu işlevi bulmak ve ne yaptığını belirlemek gerekiyor - GAH!

Herkese teşekkürler!

Tamam tema geliştirici kullanma hakkında bir göz vardı:

Parents: theme_taxonomy_term_page < page.tpl.php Template called: node.tpl.php File used: modules/node/node.tpl.php Candidate template files: node-blog.tpl.php < node.tpl.php Preprocess functions: template_preprocess + template_preprocess_node + content_preprocess_node + nodereference_preprocess_node + views_preprocess_node Duration: 6.84 ms

Burada modules/node/node.tpl.php bak ve abc fonksiyonu başvurular bulundu

 <?php print abc($node,$submitted,$node_url); ?>

Düğüm-blog.tpl.php bulamıyor ve işlevleri template_preprocess + template_preprocess_node + content_preprocess_node + nodereference_preprocess_node + views_preprocess_node için herhangi bir referans bulamıyor

Koçan.

Tema kancalar ve şablon dosyaları ile ilgili neler olup bittiğini görmek için çok iyi bir başlangıç ​​devel module olduğunu. Etkinleştirme ve siteye gidiyor ve "Tema Geliştirici" modülü sağlayan bir onay kutusunu ve sonra sayfadaki herhangi bir öğe üzerinde tıklayarak edebilirsiniz sayfaların sol alt kısmında size biraz widgety şeyi alırsınız - ve o olacak bu yüzden, ve yürütme olabilir başka ne yürütme, ne size gösterecektir.

Bir başlangıç ​​olabilir.