วิธีแสดงเขตข้อมูลก่อนชื่อโหนด?


41

ฉันต้องการเรนเดอร์ฟิลด์หนึ่งหน้าชื่อของโหนดเมื่อแสดงทีเซอร์ใน D7

ได้อย่างมีประสิทธิภาพที่ฉันอยากจะไปจากที่นี่ไปนี้

ฉันตรวจสอบการอัพเดต node.tpl.php แล้ว แต่ฉันสังเกตว่ามันแยก$titleจาก กัน$contentดังนั้นฉันจึงไม่แน่ใจว่าจะใช้วิธีนี้ได้อย่างไร หลังจากการค้นหาบางอย่างฉันพบว่ามีคนแนะนำให้ใช้โมดูลCCKและConTemplateเพื่อแก้ไขปัญหานี้ใน Drupal-6 แต่ฉันสงสัยว่ามีวิธีแก้ไขปัญหา Drupal-7 มากขึ้นอีกหรือไม่

ข้อเสนอแนะใด ๆ


นอกเหนือจากโซลูชันเทมเพลตที่ใช้ php ทั้งหมดแล้วคุณยังสามารถใช้ CSS ได้ในระยะยาว ระยะขอบติดลบสามารถทำได้มาก ในตัวอย่าง jsfiddle ของคุณก็จะมีลักษณะเช่นนี้
marcvangend

ฉันเคยพิจารณาเรื่องนี้แล้ว แต่จะเกิดอะไรขึ้นสำหรับชื่อเรื่องที่ยาว ?
irishbuzz

คุณพูดถูกต้องมันใช้ได้ผลก็ต่อเมื่อชื่อมีความสูงคงที่ เช่นเดียวกับวิธีแก้ปัญหาทุกอย่างมันมีจุดอ่อน โดยส่วนตัวฉันคิดว่า (โดยไม่คำนึงถึงการออกแบบและเทคโนโลยีที่คุณใช้) ชื่อยาว ๆ ควรได้รับการป้องกันโดยการให้ความรู้แก่บรรณาธิการ แต่ฉันรู้ว่านั่นไม่ใช่ตัวเลือกเสมอไป
marcvangend

คำตอบ:


53

มันค่อนข้างง่ายสำหรับ Drupal 7

ด้วยrenderและhideคุณรู้ว่ามีความเป็นไปได้ที่จะควบคุมตำแหน่งขององค์ประกอบเดียว$contentโดยไม่ต้องพิมพ์รายการทั้งหมดที่คุณต้องการใน Drupal 6

เทมเพลตโหนดที่เรียบง่ายมีลักษณะดังนี้:

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

การปรับเปลี่ยนเล็กน้อยจะตอบสนองความต้องการของคุณ:

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

ใช้renderคุณสามารถส่งออกองค์ประกอบ นี่ฉลาดกว่าการพิมพ์เพียงอย่างเดียวเนื่องจาก Drupal จะติดตามสิ่งที่แสดงผลเพื่อหลีกเลี่ยงการพิมพ์สองครั้งในสถานที่เดียวกัน เมื่อเรนเดอร์ฟิลด์เหนือชื่อคุณจะลบสิ่งที่แสดงเมื่อ$contentมีการเรนเดอร์


2
ดีมาก. ในโลกในอุดมคติเราควรบอก Drupal ให้ปฏิบัติต่อฟิลด์ชื่อเหมือนฟิลด์อื่น ๆ แต่อย่างน้อยใน Drupal 7 เรามีวิธีแก้ปัญหาแบบง่าย ๆ เช่นนี้ รุ่งโรจน์ @googletorp!
irishbuzz

:
berkes

1
@berkes: หากคุณพิมพ์ฟิลด์เป็นรายบุคคลใน D6 คุณต้องบำรุงรักษาเทมเพลตโหนดและแก้ไขรหัสเพื่อให้สามารถเพิ่มฟิลด์ใหม่ได้ นี่คือความแตกต่างที่ยิ่งใหญ่เมื่อเทียบกับ D7 ที่คุณสามารถเพิ่มเขตข้อมูลและใช้ UI เพื่อเรียงลำดับได้เช่นกัน
googletorp

render เป็นของใหม่แน่นอน แต่แนวคิดของมันไม่ได้ มีหลายเทคนิคเพื่อให้บรรลุเหมือนกัน ฉันไม่ได้ตั้งใจจะพูดว่าใน Drupal6 นี่มันเรียบง่ายสะอาดและดี เพียงว่าเป็นไปได้เช่นกัน
berkes

@googletorp มีวิธีพิมพ์ฟิลด์ใน page.tpl.php หรือไม่
CocoSkin

9

Display Suiteนั้นยอดเยี่ยมเช่นกัน

Display Suite ช่วยให้คุณควบคุมการแสดงเนื้อหาของคุณได้อย่างสมบูรณ์โดยใช้ส่วนต่อประสานแบบลากและวาง จัดเรียงโหนดมุมมองความคิดเห็นข้อมูลผู้ใช้และอื่น ๆ ในแบบที่คุณต้องการโดยไม่ต้องทำงานผ่านไฟล์เทมเพลตนับสิบ รายการเค้าโครงที่กำหนดไว้ล่วงหน้า (D7 เท่านั้น) มีให้สำหรับการลากและวางที่สนุกยิ่งขึ้น!


เป็นโมดูลที่ยอดเยี่ยม แต่น่าเสียดายที่ดูเหมือนว่าจะเสนอการควบคุมสำหรับฟิลด์ที่ไม่มีชื่อเท่านั้นดังนั้นจึงไม่มีความช่วยเหลือที่นี่ ขอบคุณเหมือนกันทั้งหมด
irishbuzz

ที่จริงแล้วไม่เป็นความจริงคุณเพียงแค่ต้องติดตั้งโมดูลที่จำเป็นทั้งหมด: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
ถอดรหัส

@Decipher: การติดตั้ง 3 โมดูลเพื่อย้าย image-tag เหนือ h2 tag หรือไม่ คุณจะต้องล้อเล่นขวา :)
Berkes

@berkes - การติดตั้ง Drupal เพื่อแสดงหน้าเว็บเดียวคุณต้องล้อเล่นใช่มั้ย ประเด็นของฉันคือเมื่อติดตั้งโมดูลเหล่านี้คุณสามารถทำอะไรได้มากมายเช่นเดียวกับ Drupal คุณสามารถทำอะไรได้มากมาย แต่คุณสามารถใช้มันเพื่อแก้ปัญหาที่ต้องใช้ความพยายาม
ถอดรหัส

@Decipher: แน่นอนการติดตั้งโมดูลทั่วไปนำโอกาสใหม่มาสู่เว็บไซต์ของคุณ แต่มันเป็นคำแนะนำที่ไม่ดีในการติดตั้งมุมมอง, มุมมองแกลเลอรี่, cck, filefiend และฟิลด์รูปภาพเพื่อแสดงแถวของภาพ มันจะเป็นการดีถ้าให้คำแนะนำมุมมอง cck และส่วนที่เหลือจะถูกใช้สำหรับรายการภาพเท่านั้น แต่ OP ไม่ได้พูดถึงเรื่องนี้เลย
berkes

8

มีลักษณะที่โมดูลชื่อเรื่อง - http://drupal.org/project/title มันอาจพิสูจน์ว่ามีประโยชน์สำหรับสถานการณ์ของคุณ ฉันติดตั้ง / เปิดใช้งานด้วยเหตุผลบางอย่างอาจคล้ายกับของคุณและดูเหมือนจะให้ความยืดหยุ่นในการวางฟิลด์ชื่อ

ฉันได้ปิดใช้งานตั้งแต่นั้น (และกำลังใช้งาน Display Suite) ดังนั้นการเรียกคืนของฉันอาจจะค่อนข้างสั้น


5

นี่เป็นวิธีการแฮ็กและฉันแน่ใจว่าบางคนจะเกิดอะไรขึ้นกับสิ่งที่สวยงามกว่า แต่ในกรณีที่คุณติดอยู่และไม่มีใครทำ ...

คุณสามารถใช้page.tpl.phpเพื่อลบการพิมพ์$titleทั้งหมดและเพิ่มฟิลด์ที่กำหนดเองใหม่ชื่อ Title ด้วยชื่อเครื่อง $ new_title หรืออะไรทำนองนั้น จากนั้นบนโหนดแก้ไขซ่อนเดิมกล่องชื่อและบนโหนดบันทึกการใช้งานคอมพิวเตอร์หรือสนามบาง PHP ที่กำหนดเองเพื่อคัดลอกไป$new_title$title

หลังจากนั้นให้เขียน css บางอย่างเพื่อทำให้ $ new_title มีลักษณะเหมือนชื่อหน้าก่อนหน้านี้และคุณควรวางฟิลด์ใดก็ได้ตามลำดับที่คุณต้องการเพียงแค่ลากและวางในหน้าจอจัดการฟิลด์ เนื่องจากคุณคัดลอกไป$new_titleยัง$titleชื่อหน้าในแถบเบราว์เซอร์ยังคงใช้งานได้และไม่มีอะไรควรบ่นเกี่ยวกับชื่อโหนดที่หายไป

อย่างที่ฉันพูดมันเป็นแฮ็ค - แต่มันใช้ได้ แจ้งให้เราทราบหากคุณต้องการข้อมูลเพิ่มเติม


1
ขอบคุณสำหรับคำแนะนำ Frederik ตามที่คุณระบุว่ามันไกลจากอุดมคติ แต่ดูเหมือนว่าจะเป็นหนึ่งในวิธีการแก้ปัญหาที่เป็นไปได้สองสามอย่าง ฉันจะเพิ่มวิธีแก้ปัญหาของคุณโดยแนะนำว่าควรใช้โมดูลauto_nodetitleหากใช้วิธีนี้ ฉันจะปล่อยให้คำถามเปิดตอนนี้เพราะฉันหวังว่าจะมีวิธีที่ดีกว่าและฉันอาจเริ่มได้รับรางวัล +1 สำหรับความพยายามของคุณเหมือนกันทั้งหมด
irishbuzz

4

page.tpl.php (พวงมาลัย)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}

ฉันไม่แน่ใจว่าฉันติดตามสิ่งที่เกิดขึ้นที่นี่เนื่องจากข้อมูลโค้ดแรกให้การบ่งชี้เพียงเล็กน้อยว่ามีอะไรใหม่และมีอะไรบ้าง ฉันยังใช้ชุดรูปแบบเซนมากกว่าการ์แลนด์ถึงแม้ว่าการเปลี่ยนแปลงที่จำเป็นควรจะคล้ายกัน ในตัวอย่างโค้ดที่สองคุณเรียกใช้ hook_preprocess_page () หรือไม่ คุณสามารถขยายตัวอย่างที่เป็นรูปธรรมมากขึ้นได้ไหม?
irishbuzz

ในรหัสที่สองเราได้กำหนดตัวแปรใหม่ 'custom_block' ดูที่ส่วนของรหัสแรกที่เรากำลังพิมพ์ 'custom_block' <? php if ($ custom_block): พิมพ์ '<div id = "custom-block" class = "clear-block">' $ custom_block. '</div>'; endif; ?> เพียงกำหนดกฎสำหรับสร้างตัวแปรนี้ ดังนั้น? :)
dobeerman

4

สิ่งนี้ไม่สามารถใช้ได้กับคำถามทีเซอร์ในโพสต์ต้นฉบับ แต่สำหรับคนที่สะดุดในเรื่องนี้และต้องการทำให้มันเกิดขึ้นในมุมมองแบบเต็มนี่คือตัวเลือกที่ไม่มีรหัส: แสดงฟิลด์ในบล็อก (ใช้มุมมอง ตัวอย่าง) และวางบล็อกนั้นไว้เหนือบล็อกเนื้อหาของคุณ แต่อยู่ในภูมิภาคเดียวกัน


ฉันยังคงเป็น drupal n00b คุณช่วยอธิบายความหมายของคุณได้ไหม?
Kenny Wyland

3

ฉันคิดว่าคุณควรใช้ฟังก์ชัน preprocess ใน template.php ของคุณ

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

และเป็นเพิ่มเติม

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

ดัมพ์ตัวแปรและทำสิ่งที่คุณต้องการ เพิ่ม / ลบ / อัปเดต


1
ฟังก์ชั่นเหล่านั้นจะไม่เปลี่ยนแปลงลำดับที่ชื่อเรื่องและฟิลด์โหนดอื่น ๆ ถูกส่งออก คุณควรเปลี่ยนไฟล์เทมเพลต
kiamlaluno

ฉันเข้าใจแล้วฉันคิดว่าคุณต้องการเพิ่มค่าของฟิลด์ในชื่อเรื่อง
dobeerman

3

ฉันแก้ไขปัญหานี้ด้วยโซลูชันที่ไม่ใช้รหัสโดยใช้Display Suiteและคุณสมบัติพิเศษ "Region to Block" ฉันชอบโซลูชันนี้มากที่สุดสำหรับความยืดหยุ่น

โดยทั่วไปเปิดใช้งานส่วนเสริม "Region to Block" เปิดใช้งานการแสดง "เนื้อหาแบบเต็ม" ใน Display Suite (สมมติว่าคุณต้องการแสดงเนื้อหาเหนือหัวเรื่องในการแสดงผลแบบเต็มโหนดในทำนองเดียวกันคุณสามารถใช้มันสำหรับโหมดมุมมองอื่น ๆยกเว้นค่าเริ่มต้น) ตอนนี้ในส่วน "จัดการจอแสดงผล" ของ "เนื้อหาแบบเต็ม" ที่ด้านล่างของหน้าจอแท็บ "บล็อกพื้นที่" จะปรากฏขึ้น ป้อนชื่อบล็อกใหม่ที่นั่นบันทึกและลากและวางฟิลด์ที่ต้องการลงในบล็อกนี้ สุดท้ายย้ายบล็อกที่สร้างขึ้นใหม่ในหน้าจอบล็อกที่ไหนสักแห่งเหนือชื่อโหนด

คุณสามารถดูวิดีโอของวิธีการเดียวกันได้ที่นี่: http://www.youtube.com/watch?v=y4wyjxyhbNAแน่นอนคุณต้องวางบล็อกด้านบนชื่อ (ไม่ใช่แถบด้านข้างซ้าย) ที่ท้าย


2

สำหรับแม่แบบ Zen รหัสด้านล่างใช้งานได้สำหรับฉัน

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

ในที่สุดคุณสามารถพิมพ์ฟิลด์ของคุณใน page.tpl.php ได้อย่างง่ายดาย

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>

เกี่ยวกับ page.tpl.php ฉันได้รับคำเตือนตัวแปรที่ไม่ได้กำหนดด้วยชุดรูปแบบที่ตอบสนองทางธุรกิจ แต่เมื่อฉันลบเงื่อนไขมันทำงานได้ดี กล่าวอีกนัยหนึ่งฉันเปลี่ยน <? php if ($ my_image_field): print render ($ my_image_field); endif; ?> ถึง <? php print render ($ my_image_field); ?> ซึ่งดูเหมือนว่าจะไม่โยนคำเตือนใด ๆ ในทุกหน้าของฉัน
Amy Niebel

2

ฉันรู้ว่าคุณจะได้ใช้ชุดรูปแบบเพื่อสร้างและตอนนี้พยายามเพิ่มเขตข้อมูลที่ด้านบนของชื่อเรื่อง

คำแนะนำของฉันสำหรับนักพัฒนาทั้งหมดที่สร้างชุดรูปแบบบน Drupal 7 จะต้องใช้: ชุดรูปแบบโอเมก้า + บริบทและโมดูลเดลต้า สิ่งนี้จะช่วยให้รากฐานที่แข็งแกร่งสำหรับเค้าโครงของคุณ

และความยืดหยุ่นในการจัดเรียงภูมิภาคบล็อกและฟิลด์


1

คุณสามารถทำ ist ด้วยโมดูลพาเนล


คำตอบเก่าที่นี่ แต่นี่ติดธง มันจะดีกว่าที่จะอธิบายเล็กน้อยว่าแผงสามารถใช้ในสถานการณ์นี้
mpdonadio

การติดตั้งเป็นค่าใช้จ่ายสูงมากเพียงแค่เคลื่อนย้ายสนามในตำแหน่งอื่น
Akko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.