Использование классов в узлах


Мне нужно немного указаний, я создал собственный класс и пытаюсь использовать его в узле, но, конечно, он бросает на меня белый экран. Поэтому мой вопрос в том, как я могу использовать пользовательский класс для d7, чтобы я мог включить тег в свой узел с помощью php.

Я поместил этот код в template.tpl.php файл и попытался использовать его в моем узле, но затем он выдал белый экран.

<?php class Colors {

  public function red_form() {
        echo 'color red is here';
  }

    public function blue_form() {
        echo 'color blue is here';
  }

    public function green_form() {
        echo 'color green is here';
  }

    public function purple_form() {
        echo 'color purple is here';
  }

    public function yellow_form() {
        echo 'color yellow is here';
  }
}

$colorforms = new Colors();

?>

И я использую это в узле.

Text here here and here.

<?php $colorforms->red_form(); ?>

More text here here and here.

Вывод, который я пытаюсь получить, используя приведенный выше код.

Text here here and here.

color red is here

More text here here and here

Есть ли для этого модуль или что-то в этом роде? или что-нибудь в этом роде, я немного в неведении по этому поводу.

 1
7
Author: kiamlaluno, 2012-02-13

2 answers

Быстрое исправление: объявите класс в template.php но создайте его в своем шаблоне узла (если вы проверите свой журнал ошибок php, у вас, вероятно, было что-то вроде "Вызов функции-члена red_form() для не-объекта в..." в нем). Кроме того, я предполагаю, что это опечатка, что у вас были $colorforms и $color_form в приведенном выше примере.

 2
Author: Jimajamma, 2012-02-13 20:23:05

Не создавайте экземпляры классов (или не выполняйте никакой бизнес-логики) в своих файлах .tpl.php: содержимое файлов шаблонов должно быть в окончательной, доступной для визуализации форме.

Вместо этого используйте функцию предварительной обработки в template.php:

// Replace MYTHEME with your theme's short name
function MYTHEME_preprocess_node(&$variables) {
  $variables['colorforms'] = new Color();
}

Затем, в node.tpl.php, ссылка $colorforms1:

<?php $colorforms->red_form(); ?>

В качестве отступления рассмотрите возможность разделения вашего класса на отдельный модуль: это позволит вам воспользоваться загрузчиком Drupal. Создайте пользовательский модуль, поместите класс в отдельном файле в каталоге модуля (скажем, includes/color.php).

В файле пользовательского модуля .info добавьте следующую строку:

files[] = includes/color.php

Если вы просто хотите воспользоваться загрузчиком и вам не нужны никакие другие пользовательские функции, просто используйте файл-заполнитель .module:

<?php

/**
 * @file
 * This file is a placeholder.
 */

Примечание 1: Также подумайте о том, чтобы не echo выводить информацию в своем классе, а возвращать строку, чтобы другие могли решить, как отображать вывод:

public function red_form() {
  return 'color red is here';
}

И, предполагая, что вы использовали упомянутое здесь решение, используйте это в node.tpl.php:

<?php print $colorforms->red_form(); ?>
 2
Author: , 2012-02-14 10:03:57