Еще раз здравствуйте!
Сразу попрошу "старших" и более опытных товарищей не крыть меня матом и не отправлять читать 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 мне форма очень нравится, как пользователю, поэтому и хочу сделать если не такую, то похожую, чтобы моим пользователям было удобно.
Всем, не пославшим в "путешествие", заранее спасибо. Для меня формы - единственный вопрос, оставшийся без ответа.
Комментарии
А что конкретно вы не можете понять в form.api? hook_form_alter? или что-то иное
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.
}
}
Спасибо. Пригодится.
Скажем так, до меня никак не дойдет, как данный хук использовать и его ли мне нужно использовать...
С выводом матерала все куда проще: Создал файл "node-vacancy.tpl.php".
В нем прописал:
И вывел на эран поле "Должность", в том виде, каком хочется.
А в данном случае не пойму с какой стороны вообще подойти. в этом проблема.
Я читал статьи про темизацию форм Друпала ( http://drupaldance.com/blog/темизация-форм )
Вывел на экран массив формы (return print_r($form);), а что потом, ума не приложу... хоть вешайся. А потом окажется, что все просто, как 2+2.
Хочу понять, можно ли сделать что-то вроде файла "add(edit)-node-vacancy.tpl.php" и в нем все прописать.
В общем, чувствую себя дятлом. Знаю, что решение под носом, но не вижу его в упор, блин...
Прошу простить сумбур в моих фразах, но уже так намучался с формами... хоть нанимай кого-нибудь, чтобы одну форму сделал, а я уже по аналогии другие сделал.
Интересно, кто-нибудь возьмется "незадорого" одну форму сваять? А то чувствую сам не пойму...
ЗЫ. Пока писал, получил ответ от neochief.
Спасибо, буду "курить".
Я с этими "формами" скоро снова пить начну, подгружая пиво, как оперативную память...
2 neochief
Т.е. хочу я того или нет, придется делать через модуль или я снова не в ту степь побрел?
Страница для добавления Вакансии выглядит так: 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 на Друпал.ру.
Но лично я поняла что написано в этих статьях когда получила книжку Друпал Про Девелпмент - там очень хорошо про формы, и вообще...
Либо закажите на Озоне, либо купите (скачайте оригинал на английском.
«- page-add-type.tpl.php крутите как хотите, я в эту страницу вставила код смс-замка, например»
а и ничего не выходит - пробовал добавить такой файл для темизации формы ввода CCK - но при добавлении ноды его как бы и нет
помогите - ну почему все так сложно!!!
2 Geldora
Со ссылкой http://rb7.ru/node/add/resume я просто ошибся :), но я их указал, чтобы показать, что я хочу сделать, потому тип материала в данном случае не важен, важна суть вопроса.
Пошел снова "курить" API глядишь к пяти утра, что-то и прояснится в моей туманной голове...
думаю вот этих статей должно хватить
http://drupaldance.com/blog/10-steps-to-drupal-forms
http://drupaldance.com/blog/темизация-форм
Вам шаблоны страницы никак не помогут, потому что вам нужно темить сами элементы формы, а это можно делать только в коде модуля, либо темы. Еще раз повторяю, в написании кастомного модуля ничего плохого, зазорного или сложного совершенно нет. Это нормальный способ решения друпаловских задач.
Большое спасибо за пояснение, буду разбираться.
Меня в темизации форм до сих пор смущает одно — если я хочу всего лишь немного изменить внешний вид формы (изменить порядок следования полей, например), нужно ли для этого заново расписывать каждый элемент формы? Например, с помощью cck, filefield, imagefield создаётся поле, у которого есть отличный виджет добавления/загрузки картинки, использующий АЯКС и т.д. и т.п. Я себе совершенно не представляю, как мне работать с _form_alter и при этом не переписывать руками элемент, созданный imagefield, а без этого нечего даже браться за такую задачу -\
У вас в параметрах функции _form_alter УЖЕ приходит заполненный массив, и вы просто его модифицируете. Чтобы подвинуть один элемент, вы просто выставляете только у него #weight
neochief
Спасибо! Значит я всё-таки плохо читал Forms API -\
А кто подскажет, есть ли скринкасты (видео) с примером темизации формы на конкретном примере? язык "повествования" не важен.
Я бы с удовольствием посмотрел.
Просто с той же темизацией профиля (пример: http://test.bkamen.ru/users/yakov ) я разбирался с помощью мануала на сайте Shell Multimedia. Там по шагам описан конкретный пример. После того, как я его разобрал я "врубился" в темизацию типов нод. Правда, для шестой версии все несколько иначе, но тоже понятно т.к. последовательность действий уже известна.
Я соорудил свой модуль и поместил туда свой код (его еще писать и писать, но результат уже есть и я уже сЧАстлив :)):
<?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", чтобы не писать под каждую форму отдельный модуль.
Отсуда вопрос: Что лучше отдельный модуль под конкретную форму или один, но с Кейсами под различные формы?
Кейсы. Задолбетесь создавать модули для каждой мелочи. Еще, начиная с шестерки, можно использовать функции фида
my_module_form_{form_id}_alter
(напр.my_module_form_vacancy_node_form_alter
) с теми же параметрами.Да, еще не перестарайтесь при сносе ненужных полей. Иногда их лучше скрыть, а то получите непонятные ошибки валидации. Это касается в первую очередь полей автора ноды и урла ноды. Просто помните об этом, если вдруг появится что-то странное.
2 neochief
Хочу попросить, если возможно, обращяться ко мне на "Ты". Так проще.
Большое спасибо за ответы/советы.
Я пока сношу только поля, которые в ССК создавал. Мне нужно было посмотреть как этот код работает. С перехватом, вроде разобрался, теперь буду обмозговывать темизацию каждого поля отдельно. т.е. как добавить свой комментарий, как назначить свой css-класс и т.д.
Если кто "пнет" в нужную сторону, буду благодарен
Тема закрыта.
Всем спасибо!
Особенно neochief за "пинок" в нужном направлении.
Подскажите почему в 6 не работает вот это:
<?php
function phptemplate_node_form($form) {
$output = '<br>HELLO<br>';
return $output;
}
?>
ничего не происходит, ноль внимания, что не так?
помогите - как 6-му друпалу сказать где искать page-add-type.tpl.php - в 5-м все работало - функцией _phptemplate_callback() указывали имя шаблона, а в 6-м вообще убрали эту функцию и ничего вместо нее невозможно найти - опять все перепуталось - код теперь пишут в свалку под названием themplate.php, скоро модули править будем... ужас какое средневековье
Все очень просто.
спасибо, надо-же, к недоделанному ядру - модуль придумали - http://drupal.org/project/node_form_template
ну хоть какой-то выход
а вот как быть с шаблоном отдельно своего меню... menu_template - нигде найти не могу просто руки опускаются... (((
Ваши стенания, вкупе с тем, что поиск предыдущего ответа занял 45 секунд, не способствуют появлению желания указать вам на поиск еще раз.
не, ответ занял 3 месяца
стандартных нормальных средств для его решения нет
для этого пришлось людям придумывать костыль в виде модуля
как буд то это мне одному только надо (((((
в друпале похоже с меню тоже самое
в документации нет http://drupal.org/node/190815
модуль тоже пытались http://drupal.org/project/menu_attributes но видать не сложилось...
да и не один я стенаю - вот тоже бедняга -> "Theming menu... GOING MAD!" http://drupal.org/node/475454
Так чем вас не устраивает Menu attributes? Модуль рабочий, я сам его использую время от времени. Шаблон у меню делать бессмысленно в виду устройства формирования его содержания — вы получите в шаблоне всего одну переменную, само меню в разметке. Не думаю, что это кому-то надо. С другой стороны, 99% темизации меню это просто навешивание стилей на элементы, что запросто делается с Menu Attributes.
Но так как вы называете модули костылями, то это решение вам может и не подойдет, а заодно CCK, Views и все остальное
CCK, Views и все остальное является дополнением к ядру, а если в ядре принцип темизации заложен, при чем одноообразный для всего - для блоков, для полей CCK и т.д., то почему его нет для меню и форм ввода? вот я к чему - раз модуль меню в ядре и формы в ядре - то и их темизация должна быть в ядре, но это такое дело...
насчет меню - все таки ведь есть шаблон - menu-tree.tpl.php и menu-item-link.tpl.php, однако он воздействует на все меню, и нельзя написать шаблон для одного конкретного по имени или ID
Вы просто не задумываетесь о природе вещей и обвиняете в этом всех, кроме себя. А винить стоит только себя и свою инертность, ибо решение в стандартной системе темизации: http://drupal.org/node/223440
Все выглядит не более чем одна функция препроцессинга:
$vars['template_files'][] = 'menu-tree'. str_replace('_', '-', $vars['menu_name']);
}
при существующем шаблоне menu-tree.tpl.php, теперь можно будет использовать и menu-tree-primary-links.tpl.php.
На этом обсуждение считаю закрытым. Если вам нужна поддержка, вы можете за ней обратиться.
Думаю будет интересна ссылка:
Theming forms in your theme