سؤال

أود أن عرض دروبال عرض دون قالب الصفحة الذي عادة ما يحيط به - أريد فقط HTML عادي المحتوى من عرض هذا العقد.

هذا الرأي ستدرج في مكان آخر غير موقع دروبال.

أتوقع أن تفعل هذا مع عدد من وجهات النظر ، لذلك الحل الذي يتيح لي أن تعيين هؤلاء بسرعة و بسهولة يمكن أن يكون أفضل - أنا أفضل أن لا إنشاء .tpl.php الملف في كل مرة أحتاج أن تشمل عرض في مكان ما.

هل كانت مفيدة؟

المحلول

وكنت أبحث عن وسيلة لسحب البيانات العقدة عبر اياكس، وجاء مع الحل التالي لدروبال 6. بعد تنفيذ التغييرات أدناه، إذا قمت بإضافة اياكس = 1 في URL (على سبيل المثال mysite.com/node/1 ؟ اياكس = 1)، ستحصل فقط على المحتوى وليس تخطيط الصفحة.

في ملف template.php للموضوع الخاص بك:

function phptemplate_preprocess_page(&$vars) {

  if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
        $vars['template_file'] = 'page-ajax';
  }

}

وبعد ذلك إنشاء صفحة ajax.tpl.php في الدليل الموضوع الخاص بك مع هذا المحتوى:

<?php print $content; ?>

نصائح أخرى

واستنادا إلى إجابة لUfonion مختبرات وكنت قادرا على إزالة كافة إخراج HTML حول محتوى الصفحة في دروبال 7 عن طريق تنفيذ كل hook_preprocess_page وhook_preprocess_html في الموضوعات بلدي template.php، مثل هذا:

function MY_THEME_preprocess_page(&$variables) {
  if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
    $variables['theme_hook_suggestions'][] = 'page__embed';
  }
}

function MY_THEME_preprocess_html(&$variables) {
  if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
    $variables['theme_hook_suggestions'][] = 'html__embed';
  }
}

وثم أضفت اثنين من القوالب لموضوعي: html--embed.tpl.php:

<?php print $page; ?>

ووpage--embed.tpl.php:

<?php print render($page['content']); ?>

والآن عندما فتح صفحة العقدة، مثل http://example.com/node/3 ، أرى صفحة كاملة كالمعتاد، ولكن عندما أضيف المعلمة RESPONSE_TYPE، مثل http://example.com/node/3؟response_type = تضمين ، I <م> فقط الحصول على <div> مع محتويات الصفحة بحيث أنه يمكن أن تكون جزءا لا يتجزأ في صفحة أخرى.

وأنا أعلم وقد تم بالفعل الإجابة على هذا السؤال، ولكنني أريد أن أضيف حل بلدي الذي يستخدم عناصر من (PWD) الجواب فيلادلفيا تصميم الويب ويستخدم hook_theme_registry_alter، على النحو الذي اقترحه أوين. باستخدام هذا الحل، يمكنك تحميل القالب مباشرة من حدة مخصصة.

أولا، أضفت raw.tpl.php إلى المجلد الذي تم إنشاؤه حديثا "قوالب" داخل وحدة بلدي. محتويات raw.tpl.php مماثلة لصفحة ajax.tpl.php الأشخاص ذوي الإعاقة في:

<?php print $content; ?>

وبعد ذلك، نفذت hook_preprocess_page في وحدة بلدي في نفس منوال الأشخاص ذوي الإعاقة (باستثناء أنني تعديل المعلمة $ _GET وتحديث مرجع ملف قالب:

function MY_MODULE_NAME_preprocess_page(&$vars) {
    if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
        $vars['template_file'] = 'raw';
    }
} 

وأخيرا، وأنا نفذت hook_theme_registry_alter لإضافة دليل "قوالب" بلدي وحدة لتسجيل موضوع (على أساس HTTP: // دروبال كافيه / عقدة / 1105922 # تعليق-4265700 ):

function MY_MODULE_NAME_theme_registry_alter(&$theme_registry) {
   $modulepath = drupal_get_path('module','MY_MODULE_NAME');
   array_unshift($theme_registry['page']['theme paths'], $modulepath.'/templates');
}

والآن، عندما أضيف؟ الخام = 1 إلى مسار URL وجهة نظر، فإنه سيتم استخدام القالب المحدد داخل وحدة بلدي.

لغيرهم ممن قد ضرب هذه الصفحة، إذا كنت مجرد العمل مع الاسترجاعات القياسية (لا وجهات النظر بالضرورة)، وهذا سيكون أمرا سهلا. في وظيفة رد الاتصال الخاصة بك، بدلا من العودة رمز لتقديم داخل الصفحة، واستخدام وظيفة "طباعة".

وعلى سبيل المثال:

function mymodule_do_ajax($node)
{
    $rval = <<<RVAL
        <table>
            <th>
                <td>Data</td>
                <td>Data</td>
                <td>Data</td>
            </th>
            <tr>
                <td>Cool</td>
                <td>Cool</td>
                <td>Cool</td>
            </tr>
        </table>
RVAL;

    //return $rval; Nope!  Will render via the templating engine.
    print $rval; //Much better.  No wrapper.
}

وهتاف!

وهناك طريقة أخرى للقيام بذلك والتي أجد مفيد جدا هو إضافة عنصر قائمة مع وظيفة الصفحة رد لا يقوم بإرجاع سلسلة:

مثال:

/**
 * Implementation of hook_menu.
 */
function test_menu(){
  $items['test'] = array (
    /* [...] */ 
    'page callback' => 'test_callback',
    /* [...] */ 
  );
  return $items;
}

function test_callback() {
  // echo or print whatever you want
  // embed views if you want
  // DO NOT RETURN A STRING
  return TRUE;
}    

- تحديث

وسيكون من الأفضل بكثير لاستخدام exit(); بدلا من return TRUE; (انظر التعليق).

ويا، وهنا طريقة أخرى للقيام بذلك:

1) تنزيل وتثبيت المشاهدات مكافأة حزمة ( http://drupal.org/project/views_bonus) 2) إنشاء المشاهدات عرض "تغذية" واستخدام أسلوب "XML" (أو شيء كنت تعتقد يناسب احتياجاتك بشكل أفضل). 3) إذا كنت غير راض مع الإخراج XML القياسية، يمكنك تغييره عن طريق تعديل القالب لطريقة العرض. تحقق من "موضوع" الضبط للحصول على اقتراحات لأسماء قالب بديلة لهذا الرأي معين (لذلك عليك أن لا تزال لديها انتاج XML الافتراضي غادر لاستخدامها في المستقبل).

وحظا سعيدا! // يوهان فولك، NodeOne، السويد

بناء على إجابة من فيلادلفيا تصميم مواقع الإنترنت (شكرا) و بعض غوغلينغ (http://drupal.org/node/957250) هنا هو ماذا عملت لي في دروبال 7 إلى الحصول على اختيار الصفحات المعروضة دون القالب:

function pixture_reloaded_preprocess_page(&$vars)
{
  if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
        $vars['theme_hook_suggestions'][] = 'page__vlozeno';
  }   
}

بدلا من phptemplate في D7 هناك name_of_your_theme في اسم الدالة.أيضا, كنت قد وضعت اثنين يبرز __ في متغير php مع اسم الملف ، ولكن الفعلي القالب اسم الملف يحتاج شرطتين --

محتوى page--vlozeno.tpl.php :

<?php print render($page['content']); ?>

الإخراج ، ومع ذلك ، ما زال لديه الكثير من التفاف و موضوع CSS المراجع.غير متأكد من كيفية إخراج تماما unthemed البيانات...

وعلى افتراض كنت في دروبال 6، وأسهل طريقة للقيام بذلك هي لوضع مكالمة phptemplate_views_view_unformatted_VIEWNAME في template.php (يفترض وجهة نظركم هو غير منسق - إذا كان شيئا آخر، وتقول لائحة، استخدم الدالة موضوع المناسبة). موضوع نتائج عرض في هذه الدعوة موضوع ثم، بدلا من إرجاع النتائج كما تفعل عادة، طباعتها والعودة NULL. هذا سوف يظهر HTML مباشرة.

وPS - تأكد من مسح ذاكرة التخزين المؤقت (في / المشرف / إعدادات / الأداء) لرؤية هذا العمل

ربما يكون هناك عدد من الطرق في جميع أنحاء هذا ، ومع ذلك ، فإن "أسهل" قد يكون مجرد وضع موضوع المخصصة الخاصة بك ، وجود page.tpl.php مجرد أن تكون فارغة أو بعض عشوائي divs

// page.tpl.php
<div id="page"><?php print $content ?></div>

هذا الأسلوب هو في الأساس مجرد السماح node.tpl.php أن تظهر (أو أي من دروبال شكل وجهات النظر ، ... الخ) و تكون طريقة سهلة لتجنب تعديل الأساسية ، أو الحاجة إلى تغيير موضوع التسجيل لتجنب عرض page.tpl.php في المقام الأول.

تحرير:انظر التعليقات

طيب أنا لعبت حوالي مع وجهات النظر قليلا, يبدو أن يأخذ أكثر ويبني نفسه "node.tpl.php" (في المعنى) من أجل عرض ضمن "page.tpl.php".على وهلة الأولى ، شعوري الداخلي أن ربط في theme_registry_alter().

عندما كنت تبحث في الآراء الصفحة ، يمكنك الوصول إلى أكوام من المعلومات هنا ، وكذلك page.tpl.php مسارات/الملفات.كما أود أن تفعل شيئا مثل:

function modulejustforalteration_theme_registry_alter(&$variables) {
  if (isset($variables['views_ui_list_views']) ) {
  // not sure if that's the best index to test for "views" but i imagine it'll work
  // as well as others
    $variables['page']['template'] = 'override_page';        
  }
}

هذا يجب أن تسمح لك لاستخدام "override_page.tpl.php" القالب في موضوع الحالي الخاص بك الذي يمكنك إزالة أي شيء تريده (أول الجواب أعلاه).

عدد قليل من الأشياء:

  • كما قلت لست متأكدا إذا كان views_ui_list_views هو دائما متاحة تحقق ضد, ولكن يبدو أنه يجب تعيين إذا كنا نبحث عن عرض
  • يمكنك تغيير theme paths من page مجموعة إذا كنت تفضل (تغيير موقع من حيث دروبال سوف ابحث عن page.tpl.php بدلا من تسمية ذلك تماما)
  • هناك لا يبدو أن يكون أي تعريف لهذا من وجهة نظر محددة ، لذلك قد تكون هذه الطريقة "جميع الآراء تجريد" النهج.إذا كنت بحاجة إلى الشريط page.tpl.php من أجل عرض معينة فقط, ربما يعيق template_preprocess_page() قد يكون فكرة أفضل.

وأنا أحب وحدة دروبال. ولكن، وهنا طريقة أخرى.

ونسخة page.tpl.php في موضوع مجلد إلى ملف جديد يسمى صفحة VIEWNAME.tpl.php، حيث VIEWNAME هو اسم readible آلة للعرض.

وبعد ذلك تحرير صفحة VIEWNAME.tpl.php لرفع الدعوى.

وهناك أيضا http://drupal.org/project/pagearray وهو الحل العام ...

وأيضا حلScott Evernden هو ثغرة أمنية عبر موقع البرمجة (XSS). لا تفعل ذلك. قراءة الوثائق على drupal.org حول كيفية التعامل مع النص في الأزياء http://drupal.org/node/ 28984

وهناك طريقة بسيطة لعرض محتوى خاص نوع المحتوى الذي ترغب في عرضه دون كل الاشياء من page.tpl.php:
إضافة المقتطف التالي إلى ملف template.php الخاص بك:

function mytheme_preprocess_page(&$vars) {
  if ($vars['node'] && arg(2) != 'edit') {
      $vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
    }
}

وإضافة إلى page-nodetype-examplecontenttype.tpl.php الموضوع الخاص بك، مثل page.tpl.php الخاص بك ولكن بدون الاشياء التي لا ترغب في عرض ومع print $content في الجسم.

إذا فهمت سؤالك، كنت تريد أن يكون العقد والتي تحتوي على جميع HTML لصفحة، من DOCTYPE إلى . ما أود القيام به هو خلق نوع محتوى لهذه العقد - "fullhtml" كاسم المقروءة آليا في - ثم إنشاء قالب عقدة لذلك يسمى عقدة fullhtml.tpl.php. لا يمكنك مجرد تفريغ محتويات العقدة، ولقد تم HTML مطهرة. سوف node.fullhtml.tpl.php يكون حرفيا فقط:

echo htmlspecialchars_decode($content);

وبعد ذلك عليك ان تحصل على وسيلة لتجاوز page.tpl.php المعيار. I <م> التفكير ما يمكن أن تفعله هو في الجزء العلوي من page.tpl.php بك تحقق نوع المحتوى العقدة $، ووإنقاذ ما اذا كان fullhtml. أو، تعيين متغير عمومي في عقدة fullhtml.tpl.php أن page.tpl.php أن تحقق ل.

وأنا لست خبيرا دروبال، ولكن هذه هي الطريقة التي كنت تفعل ذلك. أنا أتحدث قبالة الكفة، وذلك لمشاهدة الشياطين في التفاصيل.

وأرى كنت قد ذهبت بالفعل وجعلت نفسك وحدة نمطية، لذلك هذه المساعدة قد لا أطول، ولكن من السهل إلى حد ما للحصول على عرض لفضح آر إس إس، والتي قد تكون وسيلة أسهل من الحصول على المحتوى، خصوصا إذا كنت ترغب في إدراجه على موقع مختلف.

في D7 يمكنك استخدام menu_execute_active_handler

$build = menu_execute_active_handler('user', FALSE);
return render($build);

يروين الجواب كان ما فعلت بالنسبة لي بعد اللعب معها.لدي دروبال 7 الموقع.

  1. أولا وقبل كل شيء تأكد من استبدال MY_THEME مع الموضوع الخاص بك اسم.نعم هو واضح ولكن معظم نوبي تفوت هذه.

  2. أنا في الواقع بالفعل function MY_THEME_preprocess_page(&$variables) {.لا إعادة وظيفة ولكن إضافة هذه التعليمة البرمجية في نهاية الدالة قبل إغلاقه مع }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. بلدي وظيفة تستخدم $vars لا $variables, لذا كان علي أن التحديث أيضا.مرة أخرى واضحة إذا كنت تعتقد أن البحث عن ذلك.

وأجاب بلدي أولا سمح لي لعرض فقط عقدة عندما اتصلت عنه في متصفح الويب. ولكن الهدف النهائي من ذلك هو ترسيخ عقدة دروبال في موقع 3rd الطرف باستخدام IFRAME.

ومنذ صدور دروبال الأساسية 7.50 الإطار من هو افتراضيا منعت لمنع Clickjacking

لتحصل فقط العقدة لتضمين بنجاح في موقع 3rd الطرف تحتاج أيضا إلى تجاوز الإعداد الافتراضي س الإطار. بدأ كل شيء في العمل بعد أن أضاف ما يلي في template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top