Làm thế nào để hiển thị một trường trước tiêu đề nút?


41

Tôi đang tìm cách kết xuất một trường nhất định trước tiêu đề của nút khi hiển thị một lời trêu ghẹo trong D7.

Hiệu quả tôi muốn đi từ này đến này .

Tôi đã xem xét việc cập nhật node.tpl.php nhưng tôi nhận thấy rằng nó tách $titlera $contentvì vậy tôi không chắc cách tiếp cận này. Sau một số tìm kiếm, tôi thấy rằng mọi người đã đề xuất sử dụng các mô-đun CCKConTemplate để khắc phục điều này trong Drupal-6 nhưng tôi tự hỏi liệu có giải pháp Drupal-7 nào nữa không.

Bất kỳ đề xuất?


Ngoài tất cả các giải pháp mẫu dựa trên php, bạn cũng có thể đi một chặng đường dài chỉ với CSS. Lợi nhuận âm có thể làm rất nhiều. Trong ví dụ jsfiddle của bạn, nó sẽ trông như thế này .
marcvangend

Tôi đã xem xét điều này nhưng điều gì xảy ra cho các tiêu đề dài ?
irishbuzz

Bạn hoàn toàn đúng, điều này chỉ hoạt động nếu tiêu đề có chiều cao cố định. Giống như mọi giải pháp, nó có điểm yếu. Cá nhân, tôi nghĩ rằng (bất kể thiết kế và công nghệ bạn đang sử dụng) các tiêu đề dài nên được ngăn chặn bằng cách giáo dục các biên tập viên, nhưng tôi nhận ra rằng đó không phải lúc nào cũng là một lựa chọn.
marcvangend

Câu trả lời:


53

Điều này thực sự khá đơn giản với Drupal 7.

Với renderhidebạn biết có khả năng kiểm soát vị trí của một yếu tố duy nhất $contentmà không phải in ra tất cả các mục mà bạn muốn là cần thiết trong Drupal 6.

Một mẫu nút được đơn giản hóa trông như thế này:

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

Một sửa đổi nhỏ sẽ xử lý nhu cầu của bạn:

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

Sử dụng render, bạn có thể xuất ra một yếu tố. Điều này thông minh hơn là chỉ đơn giản là in các công cụ, vì Drupal sẽ theo dõi những gì đã được hiển thị, để tránh điều tương tự được in hai lần tại chỗ. Khi kết xuất trường phía trên tiêu đề, bạn cũng sẽ xóa phần hiển thị khi $contentđược hiển thị.


2
Rất đẹp. Trong một thế giới lý tưởng, tốt hơn là chỉ cần nói với Drupal đối xử với lĩnh vực tiêu đề như bất kỳ lĩnh vực nào khác, nhưng ít nhất trong Drupal 7, chúng ta có những giải pháp đơn giản như thế này. Kudos @googletorp!
irishbuzz

Đối với hồ sơ: Điều này hầu như không khác với Drupal6, trái ngược với những gì nhận xét ở trên có thể làm mất giá trị.
berkes

1
@berkes: Nếu bạn in ra các trường riêng lẻ trong D6, bạn phải duy trì mẫu nút và chỉnh sửa mã để có thể thêm các trường mới. Đây là một sự khác biệt lớn so với D7 nơi bạn có thể tiếp tục thêm các trường và sử dụng UI để sắp xếp chúng.
googletorp

kết xuất là thực sự mới. Nhưng khái niệm của nó thì không. Có một số thủ thuật để đạt được như vậy. Tôi không có ý nói rằng trong Drupal6, điều này đơn giản, sạch sẽ và tốt đẹp. Chỉ là nó có thể quá.
berkes

@googletorp có cách nào để in một trường trong page.tpl.php không?
CocoSkin

9

Display Suite cũng khá tuyệt.

Display Suite cho phép bạn kiểm soát hoàn toàn cách hiển thị nội dung của mình bằng giao diện kéo và thả. Sắp xếp các nút, chế độ xem, nhận xét, dữ liệu người dùng, v.v. theo cách bạn muốn mà không phải thực hiện theo cách của bạn thông qua hàng tá tệp mẫu. Một danh sách bố trí được xác định trước (chỉ dành cho D7) có sẵn để kéo và thả nhiều hơn!


Đây là một mô-đun tuyệt vời, nhưng thật không may, nó dường như chỉ cung cấp quyền kiểm soát cho các trường không có tiêu đề nên không có trợ giúp ở đây. Cảm ơn vì tất cả.
irishbuzz

Trên thực tế điều đó không đúng, bạn chỉ cần cài đặt tất cả các mô-đun cần thiết: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Giải mã

@ Mã hóa: Cài đặt 3 mô-đun để di chuyển thẻ hình ảnh phía trên thẻ h2? Bạn phải đùa thôi, phải không :)
berkes

@berkes - Cài đặt Drupal để hiển thị một trang web, bạn phải đùa chứ? Quan điểm của tôi là với các mô-đun được cài đặt, bạn có thể làm rất nhiều, giống như với Drupal bạn có thể làm rất nhiều, nhưng bạn cũng có thể sử dụng nó để giải quyết một nhiệm vụ nguy hiểm.
Giải mã

@ Mã hóa: Chắc chắn, cài đặt các mô-đun chung mang lại cơ hội mới cho trang web của bạn. Nhưng việc cài đặt các khung nhìn, view-gallery, cck, filefiend và trường hình ảnh chỉ đơn giản là hiển thị một hàng hình ảnh. Sẽ là một lời khuyên tốt nếu các khung nhìn, cck và phần còn lại sẽ được sử dụng nhiều hơn cho danh sách hình ảnh này. Nhưng OP đã không đề cập đến điều này cả.
berkes

8

Hãy xem mô-đun Tiêu đề - http://drupal.org/project/title . Nó có thể chứng minh hữu ích cho kịch bản của bạn. Tôi đã cài đặt / kích hoạt nó vì một số lý do, có thể tương tự như của bạn và dường như nó linh hoạt về cách đặt trường tiêu đề.

Tôi đã vô hiệu hóa nó (và đang sử dụng Display Suite), vì vậy việc thu hồi của tôi có thể hơi sơ sài.


5

Đây là một giải pháp hackish và tôi chắc chắn ai đó sẽ nghĩ ra thứ gì đó thanh lịch hơn, nhưng trong trường hợp bạn bị mắc kẹt, và không ai làm ...

Bạn có thể sử dụng page.tpl.phpđể loại bỏ việc in $titlehoàn toàn và thêm trường tùy chỉnh mới có tên Tiêu đề với tên máy $ new_title hoặc đại loại như thế. Sau đó, trên nút chỉnh sửa, ẩn hộp Tiêu đề gốc và trên nút Lưu sử dụng Trường được tính toán hoặc một số php tùy chỉnh để sao chép $new_titlevào $title.

Sau tất cả, hãy viết một số css để làm cho $ new_title trông giống như tiêu đề trang đã làm trước đó và bạn sẽ có thể đặt bất kỳ trường nào theo bất kỳ thứ tự nào bạn thích, chỉ bằng cách kéo và thả trong màn hình trường quản lý. Vì bạn đã sao chép $new_titlesang $title, tiêu đề trang trong thanh trình duyệt vẫn hoạt động và không có gì phải phàn nàn về việc thiếu tiêu đề nút.

Như tôi đã nói, đó là một hack - nhưng nó sẽ hoạt động. Hãy cho tôi biết nếu bạn cần thêm thông tin


1
Cảm ơn lời đề nghị Frederik. Như bạn chỉ ra nó không lý tưởng nhưng có vẻ như là một trong số ít cách giải quyết có thể. Tôi sẽ thêm vào giải pháp của bạn bằng cách đề xuất rằng mô-đun auto_nodetitle nên được sử dụng nếu thực hiện phương pháp này. Tôi sẽ để lại câu hỏi mở bây giờ vì tôi thực sự hy vọng có một cách tốt hơn và tôi có thể bắt đầu một tiền thưởng. +1 cho nỗ lực của bạn như nhau.
irishbuzz

4

page.tpl.php (vòng hoa)

...
      <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';
  }
}

Tôi không chắc chắn tôi theo dõi những gì đang diễn ra ở đây vì đoạn mã đầu tiên đưa ra ít dấu hiệu về những gì mới và những gì đang tồn tại. Tôi cũng đang sử dụng chủ đề Zen chứ không phải là Garland mặc dù những thay đổi bắt buộc phải tương tự nhau. Trong đoạn mã thứ hai, bạn có đang gọi hook_pre process_page () không? Bạn có thể mở rộng với một ví dụ cụ thể hơn?
irishbuzz

Trong mã thứ hai, chúng tôi đã xác định một biến mới 'custom_block'. Nhìn vào một phần của mã đầu tiên nơi chúng tôi đang in 'custom_block'. <? php if ($ custom_block): in '<div id = "custom-block" class = "Clear-block">'. $ custom_block. '</ div>'; endif; ?> chỉ cần xác định quy tắc để tạo biến này. Vì thế? :)
dobeerman

4

Điều này không áp dụng cho câu hỏi Teaser trong bài viết gốc, nhưng đối với những người vấp phải điều này và chỉ muốn thực hiện nó trong chế độ xem đầy đủ, đây là một tùy chọn không có mã: hiển thị trường trong một khối (sử dụng chế độ xem, ví dụ) và đặt khối đó lên trên khối nội dung của bạn nhưng trong cùng một khu vực.


Tôi vẫn là một n00b drupal, bạn có thể giải thích ý của bạn không?
Kenny Wyland

3

Tôi nghĩ bạn nên sử dụng các hàm tiền xử lý trong template.php của bạn

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

Và như bổ sung

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

biến các biến và làm bất cứ điều gì bạn muốn. thêm / xóa / cập nhật.


1
Các hàm này không thay đổi thứ tự mà tiêu đề và các trường nút khác được xuất ra. Đối với điều đó, bạn nên thay đổi tập tin mẫu.
kiamlaluno

Tôi hiểu. Tôi nghĩ bạn muốn thêm một giá trị trường vào tiêu đề.
dobeerman

3

Tôi đã giải quyết vấn đề này bằng giải pháp không mã bằng Display Suite và tính năng bổ sung "Vùng để chặn". Tôi thích giải pháp này nhất vì tính linh hoạt của nó.

Về cơ bản, bật phần bổ sung "Vùng để chặn", bật hiển thị "Fulltext Content" trong Display Suite. (giả sử bạn muốn hiển thị nội dung trên tiêu đề trong màn hình toàn nút, tương tự bạn có thể sử dụng nó cho bất kỳ chế độ xem nào khác ngoại trừ Mặc định). Bây giờ, trong phần "Quản lý hiển thị" của "Nội dung Fulltext", ở cuối màn hình, tab "Chặn khu vực" sẽ xuất hiện. Nhập tên khối mới ở đó, lưu và kéo và thả các trường mong muốn vào khối này. Cuối cùng, di chuyển khối vừa tạo trong màn hình Blocks ở đâu đó phía trên tiêu đề nút.

Bạn có thể xem video về cách tiếp cận tương tự ở đây: http://www.youtube.com/watch?v=y4wyjxyhbNA , tất nhiên bạn cần đặt khối phía trên tiêu đề (không phải ở thanh bên trái) ở cuối.


2

Đối với các mẫu zen dưới đây mã làm việc cho tôi.

<?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;
}
?>

Vì vậy, cuối cùng, bạn có thể dễ dàng in trường của mình trong page.tpl.php;

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

liên quan đến page.tpl.php, tôi đã nhận được một cảnh báo biến không xác định với điều đó với Business Responsive Theme nhưng khi tôi loại bỏ điều kiện, nó hoạt động tốt. Nói cách khác, tôi đã thay đổi <? Php if ($ my_image_field): print render ($ my_image_field); endif; ?> thành <? php in kết xuất ($ my_image_field); ?> Dường như không đưa ra bất kỳ cảnh báo nào trên tất cả các trang của tôi.
Amy Niebel

2

Tôi biết bạn đã sử dụng một số chủ đề để xây dựng và bây giờ đang cố gắng thêm các trường ở đầu tiêu đề.

Đề xuất của tôi cho tất cả các nhà phát triển xây dựng chủ đề trên Drupal 7 sẽ được sử dụng: chủ đề Omega + mô-đun bối cảnh và Delta. Điều này mang lại một nền tảng rất mạnh cho bố cục của bạn.

Và linh hoạt trong việc sắp xếp các Vùng, Khối và Trường.


1

Bạn có thể làm ist với mô-đun bảng


Câu trả lời cũ ở đây, nhưng điều này bắt một lá cờ. Sẽ là tốt hơn để giải thích một chút làm thế nào Bảng có thể được sử dụng trong tình huống này.
mpdon Arena

Các bảng là chi phí rất lớn cho việc di chuyển một lĩnh vực ở một vị trí khác.
Akko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.