[РЕШЕНО]Темизация страницы "/node/add/node_type"

Главные вкладки

Аватар пользователя mr_james@drupal.org mr_james@drupal.org 16 марта 2009 в 14:29

Еще раз здравствуйте!
Сразу попрошу "старших" и более опытных товарищей не крыть меня матом и не отправлять читать form API.
Читал, но видимо голова уже настолько забита всякой ..., что не усваивается материал...
Я задаю не так уж много вопросов, стараясь разобраться во всех вопросах самостоятельно, но некоторые вещи мне не поддаются.
Как всегда, начну издалека.
После 2-ч лет работы над сайтом своего города ко мне "неожиданно" пришло понимание, что максимум на что тянет определение сайта - это "Хомяк"! А ведь хочется сделать что-то действительно нужное и полезное для жителей моего города и района.
Я уже говорил, что работаю (разбираюсь с кодом, дизайном, ищу материалы и т.д.) над проектом один. Есть помощник, но толку от него мало ибо сейчас он сидит без нета.
Так вот, я решил сделать свой проект более серьезным, взрослым что-ли... Начал разработку на Drupal'e. Соорудил частично функционирующий "скелет" на 5-м Drupal'е, но увидел, что к выходу уже готовится 7-я ветка из чего следует, что поддержка 5-й прекратится, как было с 4-й. Сейчас собираю тот же скелет на 6-й ветке.
С темизацией вывода различных типов данных я разобрался. Даже сделал страницы профилей пользователей так, как хотел, благодаря англоязычной статье (случайно наткнулся).
Но к сожалению, мне никак "не даются" формы. "Я уж к ним и так и эдак, со словами и без слов..." (с)

Просьба.

Может ли кто-нибудь показать мне, на реальном примере, как сделать свое оформление для формы добавления ноды?
Хотя бы пример с темизацией одного поля. с учетом, что создано оно в ССК.
Для примера:
Я делаю раздел "Работа", в нем Вакансии.
Страница с Вакансией выглядит так: http://test.bkamen.ru/rabota/vacancy/3 (D5) и http://test2.bkamen.ru/rabota/vacancy/редактор-для-примера-100-руб (D6)

Страница для добавления Вакансии выглядит так: http://test2.bkamen.ru/node/add/vacancy , а хочется так: http://rb7.ru/node/add/job .
На RB7 мне форма очень нравится, как пользователю, поэтому и хочу сделать если не такую, то похожую, чтобы моим пользователям было удобно.
Всем, не пославшим в "путешествие", заранее спасибо. Для меня формы - единственный вопрос, оставшийся без ответа.

Комментарии

Аватар пользователя neochief neochief 16 марта 2009 в 15:22
1
function mymodule_form_alter(&$form, $form_state, $form_id) {
  if (($form_id == 'vacancy_node_form')){
    // Как загнать все в две колонки?
    // Допустим у вас все это есть на форме: $form['field1'], $form['field2'], $form['field3'], $form['field4']
    // Вы создаете два контейнерных элемента, которые будут обернуты в флоаты
    $form['cont1']['#prefix'] = '<div style="float:left;">';
    $form['cont1']['#suffix'] = '</div>';
    $form['cont2'] = $form['cont1'];
    // (очищаем границы флоата, чтобы верстка не разлезлась)
    $form['cont2']['#suffix'] .= '<div style="clear:both"></div>';
    // И помещаете в них свои поля, например так:
    $form['cont1']['field1'] = $form['field1'];
    $form['cont1']['field2'] = $form['field2'];
    $form['cont2']['field3'] = $form['field3'];
    $form['cont2']['field4'] = $form['field4'];
    // !!! И не забудьте снести старые
    unset($form['field1']);unset($form['field2']);unset($form['field3']);unset($form['field4']);
    // После этого вы получите две колонки по два поля в каждом.
    // Можно извернуться, и сделать таблицей, для этого стоит просто подставить нужные теги в префиксы/суффиксы.
   

    // Из остальных фокусов — можно подвигать все элементы как нужно
    $form['revision_information']['#weight'] = 100;
    $form['author']['#weight'] = 105;
    // ...или один за одним
    $form['options']['#weight'] = $form['author']['#weight'] + 1;

    // ...снести элемент вообще с формы
    unset($form['menu']);
    // ...или спрятать
    $form['path']['#prefix'] = '<div style="display:none">';
    $form['path']['#suffix'] = '</div>';

    // Учите FormAPI.
  }
}

Аватар пользователя mr_james@drupal.org mr_james@drupal.org 16 марта 2009 в 15:36

Скажем так, до меня никак не дойдет, как данный хук использовать и его ли мне нужно использовать...
С выводом матерала все куда проще: Создал файл "node-vacancy.tpl.php".
В нем прописал:

Должность: <?php print $node->field_vdolznost[0]['value'] ; ?>

И вывел на эран поле "Должность", в том виде, каком хочется.

А в данном случае не пойму с какой стороны вообще подойти. в этом проблема.
Я читал статьи про темизацию форм Друпала ( http://drupaldance.com/blog/темизация-форм )
Вывел на экран массив формы (return print_r($form);), а что потом, ума не приложу... хоть вешайся. А потом окажется, что все просто, как 2+2.
Хочу понять, можно ли сделать что-то вроде файла "add(edit)-node-vacancy.tpl.php" и в нем все прописать.
В общем, чувствую себя дятлом. Знаю, что решение под носом, но не вижу его в упор, блин...
Прошу простить сумбур в моих фразах, но уже так намучался с формами... хоть нанимай кого-нибудь, чтобы одну форму сделал, а я уже по аналогии другие сделал.
Интересно, кто-нибудь возьмется "незадорого" одну форму сваять? А то чувствую сам не пойму...

ЗЫ. Пока писал, получил ответ от neochief.
Спасибо, буду "курить".
Я с этими "формами" скоро снова пить начну, подгружая пиво, как оперативную память...

Аватар пользователя Geldora Geldora 16 марта 2009 в 15:47

Страница для добавления Вакансии выглядит так: http://test2.bkamen.ru/node/add/vacancy , а хочется так: http://rb7.ru/node/add/resume .

- может pathauto?

- либо переименуйте свой тип ноды.

- Редирект еще или алиас сделайте

Темизация страницы "/node/add/node_type"

- page-add-type.tpl.php крутите как хотите, я в эту страницу вставила код смс-замка, например

как сделать свое оформление для формы добавления ноды?

- рекомендую drupaldance.com и статьи neochief`a на Друпал.ру.

Но лично я поняла что написано в этих статьях Wink когда получила книжку Друпал Про Девелпмент - там очень хорошо про формы, и вообще...

Либо закажите на Озоне, либо купите (скачайте Smile оригинал на английском.

Аватар пользователя kiev1 kiev1 1 июня 2009 в 3:22

«- page-add-type.tpl.php крутите как хотите, я в эту страницу вставила код смс-замка, например»

а и ничего не выходит - пробовал добавить такой файл для темизации формы ввода CCK - но при добавлении ноды его как бы и нет

помогите - ну почему все так сложно!!!

Аватар пользователя mr_james@drupal.org mr_james@drupal.org 16 марта 2009 в 16:00

2 Geldora
Со ссылкой http://rb7.ru/node/add/resume я просто ошибся :), но я их указал, чтобы показать, что я хочу сделать, потому тип материала в данном случае не важен, важна суть вопроса.

Пошел снова "курить" API Smile глядишь к пяти утра, что-то и прояснится в моей туманной голове...

Аватар пользователя neochief neochief 16 марта 2009 в 18:07

Вам шаблоны страницы никак не помогут, потому что вам нужно темить сами элементы формы, а это можно делать только в коде модуля, либо темы. Еще раз повторяю, в написании кастомного модуля ничего плохого, зазорного или сложного совершенно нет. Это нормальный способ решения друпаловских задач.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 16 марта 2009 в 19:55

Меня в темизации форм до сих пор смущает одно — если я хочу всего лишь немного изменить внешний вид формы (изменить порядок следования полей, например), нужно ли для этого заново расписывать каждый элемент формы? Например, с помощью cck, filefield, imagefield создаётся поле, у которого есть отличный виджет добавления/загрузки картинки, использующий АЯКС и т.д. и т.п. Я себе совершенно не представляю, как мне работать с _form_alter и при этом не переписывать руками элемент, созданный imagefield, а без этого нечего даже браться за такую задачу -\

Аватар пользователя neochief neochief 16 марта 2009 в 21:36

У вас в параметрах функции _form_alter УЖЕ приходит заполненный массив, и вы просто его модифицируете. Чтобы подвинуть один элемент, вы просто выставляете только у него #weight

Аватар пользователя mr_james@drupal.org mr_james@drupal.org 17 марта 2009 в 4:35

А кто подскажет, есть ли скринкасты (видео) с примером темизации формы на конкретном примере? язык "повествования" не важен.
Я бы с удовольствием посмотрел.
Просто с той же темизацией профиля (пример: http://test.bkamen.ru/users/yakov ) я разбирался с помощью мануала на сайте Shell Multimedia. Там по шагам описан конкретный пример. После того, как я его разобрал я "врубился" в темизацию типов нод. Правда, для шестой версии все несколько иначе, но тоже понятно т.к. последовательность действий уже известна.

Аватар пользователя mr_james@drupal.org mr_james@drupal.org 17 марта 2009 в 13:36

Я соорудил свой модуль и поместил туда свой код (его еще писать и писать, но результат уже есть и я уже сЧАстлив :)):

<?php

  

function my_module_form_alter(&$form$form_state$form_id) {

    switch (

$form_id) {
      
// Создаю case для своей формы
      
case 'vacancy_node_form'//vacancy_node_form беру из ID формы
        
             
$form['cont1']['#prefix'] = '<div style="float:left;">';
            
$form['cont1']['#suffix'] = '</div>';
            
$form['cont2'] = $form['cont1'];
            
// (очищаем границы флоата, чтобы верстка не разлезлась)
            
$form['cont2']['#suffix'] .= '<div style="clear:both"></div>';
            
// И помещаете в них свои поля, например так:
            
$form['cont1']['field_vorganisation'] = $form['field_vorganisation'];
            
$form['cont1']['field_vdolznost'] = $form['field_vdolznost'];
               
$form['cont2']['field_vzarplata'] = $form['field_vstazch'];
            
$form['cont2']['field_vphone'] = $form['field_vphone'];
            
            
//Далее сношу "к чертовой бабушке" :) оригинальные поля
            //unset($form['field_voblast']);
            
unset($form['field_vorganisation']);
            unset(
$form['field_vdolznost']);
            unset(
$form['field_vobyazanosty']);
            unset(
$form['field_vzarplata']);
            unset(
$form['field_vdrsv']);
            unset(
$form['field_vstazch']);
            unset(
$form['field_veducation']);
            unset(
$form['field_vproff_naviki']);
            unset(
$form['field_vpersonal_kachestva']);
            unset(
$form['field_vvother']);
            unset(
$form['field_vphone']);
            unset(
$form['field_vcont_lico']);
            unset(
$form['field_vemail']);
            unset(
$form['field_vweb']);
        
        break;
  }
}
?>

За основу взял конструкцию с "case", чтобы не писать под каждую форму отдельный модуль.
Отсуда вопрос: Что лучше отдельный модуль под конкретную форму или один, но с Кейсами под различные формы?

Аватар пользователя neochief neochief 17 марта 2009 в 15:46

Кейсы. Задолбетесь создавать модули для каждой мелочи. Еще, начиная с шестерки, можно использовать функции фида my_module_form_{form_id}_alter (напр. my_module_form_vacancy_node_form_alter) с теми же параметрами.

Аватар пользователя neochief neochief 17 марта 2009 в 15:48

Да, еще не перестарайтесь при сносе ненужных полей. Иногда их лучше скрыть, а то получите непонятные ошибки валидации. Это касается в первую очередь полей автора ноды и урла ноды. Просто помните об этом, если вдруг появится что-то странное.

Аватар пользователя mr_james@drupal.org mr_james@drupal.org 17 марта 2009 в 16:16

2 neochief
Хочу попросить, если возможно, обращяться ко мне на "Ты". Так проще.
Большое спасибо за ответы/советы.

Я пока сношу только поля, которые в ССК создавал. Мне нужно было посмотреть как этот код работает. С перехватом, вроде разобрался, теперь буду обмозговывать темизацию каждого поля отдельно. т.е. как добавить свой комментарий, как назначить свой css-класс и т.д.
Если кто "пнет" в нужную сторону, буду благодарен Wink

Аватар пользователя Stein Stein 3 июня 2009 в 16:27

Подскажите почему в 6 не работает вот это:

<?php
function phptemplate_node_form($form) {
    
$output '<br>HELLO<br>';
    return 
$output;
}
?>

ничего не происходит, ноль внимания, что не так?

Аватар пользователя kiev1 kiev1 4 июня 2009 в 2:32

помогите - как 6-му друпалу сказать где искать page-add-type.tpl.php - в 5-м все работало - функцией _phptemplate_callback() указывали имя шаблона, а в 6-м вообще убрали эту функцию и ничего вместо нее невозможно найти - опять все перепуталось - код теперь пишут в свалку под названием themplate.php, скоро модули править будем... ужас какое средневековье

Аватар пользователя kiev1 kiev1 4 июня 2009 в 3:13

спасибо, надо-же, к недоделанному ядру - модуль придумали - http://drupal.org/project/node_form_template
ну хоть какой-то выход

а вот как быть с шаблоном отдельно своего меню... menu_template - нигде найти не могу просто руки опускаются... (((

Аватар пользователя neochief neochief 4 июня 2009 в 4:47

Ваши стенания, вкупе с тем, что поиск предыдущего ответа занял 45 секунд, не способствуют появлению желания указать вам на поиск еще раз.

Аватар пользователя kiev1 kiev1 4 июня 2009 в 14:02

не, ответ занял 3 месяца
стандартных нормальных средств для его решения нет
для этого пришлось людям придумывать костыль в виде модуля

как буд то это мне одному только надо (((((
в друпале похоже с меню тоже самое
в документации нет http://drupal.org/node/190815
модуль тоже пытались http://drupal.org/project/menu_attributes но видать не сложилось...

да и не один я стенаю - вот тоже бедняга -> "Theming menu... GOING MAD!" http://drupal.org/node/475454

Аватар пользователя neochief neochief 4 июня 2009 в 15:47

Так чем вас не устраивает Menu attributes? Модуль рабочий, я сам его использую время от времени. Шаблон у меню делать бессмысленно в виду устройства формирования его содержания — вы получите в шаблоне всего одну переменную, само меню в разметке. Не думаю, что это кому-то надо. С другой стороны, 99% темизации меню это просто навешивание стилей на элементы, что запросто делается с Menu Attributes.

Но так как вы называете модули костылями, то это решение вам может и не подойдет, а заодно CCK, Views и все остальное Smile

Аватар пользователя kiev1 kiev1 4 июня 2009 в 17:40

CCK, Views и все остальное является дополнением к ядру, а если в ядре принцип темизации заложен, при чем одноообразный для всего - для блоков, для полей CCK и т.д., то почему его нет для меню и форм ввода? вот я к чему - раз модуль меню в ядре и формы в ядре - то и их темизация должна быть в ядре, но это такое дело...

насчет меню - все таки ведь есть шаблон - menu-tree.tpl.php и menu-item-link.tpl.php, однако он воздействует на все меню, и нельзя написать шаблон для одного конкретного по имени или ID

Аватар пользователя neochief neochief 4 июня 2009 в 18:25

Вы просто не задумываетесь о природе вещей и обвиняете в этом всех, кроме себя. А винить стоит только себя и свою инертность, ибо решение в стандартной системе темизации: http://drupal.org/node/223440

Все выглядит не более чем одна функция препроцессинга:

function phptemplate_preprocess_menu_tree(&$vars) {
  $vars['template_files'][] = 'menu-tree'. str_replace('_', '-', $vars['menu_name']);
}

при существующем шаблоне menu-tree.tpl.php, теперь можно будет использовать и menu-tree-primary-links.tpl.php.

На этом обсуждение считаю закрытым. Если вам нужна поддержка, вы можете за ней обратиться.