CCK: можно ли "втиснуть" блок между CCK полей? РЕШЕНО.

Аватар пользователя anreyyyy anreyyyy 7 мая 2009 в 3:07

привет всем, у меня есть такая проблема.

модуль quick tabs создает блоки с неким контентом, этот контент надо "втиснуть" между CCK полей.

на ум приходит только - создать CCK поле с типом "блок".
есть ли подобное для CCK, или может как то по другому можно решить?

спасибо.

Комментарии

Аватар пользователя anreyyyy anreyyyy 7 мая 2009 в 15:09

нашел вот такое решение:

Иногда заранее неизвестно, как будут располагаться блоки. Особенно интересна ситуация, когда надо вставить блок между полями CCK.

Конечно, можно решить это дело шаблонами, но во-первых это громоздко и не изящно, а во-вторых придётся менять код только ради того, чтобы поменять что-либо местами.

На мой взгляд, проблема достаточно красиво решается созданием своего CCK-поля. Для этого потребуется всего два хука: hook_content_extra_fields и hook_nodeapi.....
http://rmcreative.ru/blog/post/drupal-6-dobavljaem-blok-v-vide-polja-cck

только пока ничего не понял (изучаю), есть ли более простое решение?

Аватар пользователя dfaker dfaker 8 мая 2009 в 13:31

contemplate полный контроль вывода cck материала, правда это не всегда удобно, и желательно хоть немного знать php и друпал api

Аватар пользователя anreyyyy anreyyyy 8 мая 2009 в 17:00

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

тема остается открытой.

Аватар пользователя beerman beerman 8 мая 2009 в 17:18

[ru-api=hook_form_alter]hook_form_alter[/ru-api]
<?php
function mymodule_form_alter(&$form, $form_state, $form_id) {
// раскомментируйте, чтобы узнать $form_id
// drupal_set_message('

'. print_r($form, 1) .'

');
switch ($form_id) {
case 'myform_node_form':
$form['name_field_here']['#suffix'] = 'you code here';
$form['name_field2_here']['#prefix'] = 'you code2 here';
break;
}
}
?>

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

создаем в теме регион к примеру "myregion"а именно в файле info темы
создаем CCK поле типа text с форматированным вводом
на ноде на которой хотим видеть блок пишем:


<?php $myregion?>

Идем в блоки и ставим нужному блоку выводится в нашем регионе.

По идее должно помочь.

Аватар пользователя anreyyyy anreyyyy 8 мая 2009 в 19:54

glu2006
идея понятна, но че-то не работает.. нифига не выводит.

формат ввода - включил "PHP code"

Аватар пользователя anreyyyy anreyyyy 8 мая 2009 в 19:59

зато отлично работает код:
<?
echo "11111111111111111111111111111111111";
?>

выводит единицы, а блок не хочет..

Аватар пользователя anreyyyy anreyyyy 9 мая 2009 в 0:25

нашел решение!!! ))))
помогла тема http://drupalproject.ru/node/20238 (Вставка блоков в страницы Drupal)

короче получается такое решение моей задачи:

1) создаем в теме регион - к примеру "myregion", а именно в файле info нашей темы (с) glu2006
2) создаем CCK поле типа text с форматированным вводом (с) glu2006
3) включаем модуль PHP filter, если не включен
4) начинаем редактировать страницу, для CCK поля устанавливаем формат ввода PHP Code и вставляем следующий код:

<?php
$block = module_invoke('quicktabs', 'block', 'view', 2);
print $block['content'];
?>
где quicktabs - тип блока, созданный модулем quicktabs. для обычного блока пишем block, для вьюсов - наверное views и т.д.
цифра 2 - id блока
эти параметры видны, если навести курсор на ссылку "настроить" для нужного блока, в разделе Блоки (admin/build/block)

5) сохраняем страницу, блок выведется там, где у нас стоит CCK поле.

Аватар пользователя anreyyyy anreyyyy 9 мая 2009 в 0:25

1) создаем в теме регион - к примеру "myregion", а именно в файле info нашей темы (с) glu2006
я думаю, этот пункт лишний, и без него все работает. зачеркнул

Аватар пользователя glu2006 glu2006 9 мая 2009 в 0:31

Спасибо. приятно общаться и работать. Поверьте не в плане вознаграждения, а в четкости поставленных задач.

Аватар пользователя beerman beerman 9 мая 2009 в 5:22

"anreyyyy" wrote:
4) начинаем редактировать страницу, для CCK поля устанавливаем формат ввода PHP Code и вставляем следующий код:

не храните код в базе. решение, мягко говоря, через "ж"

Аватар пользователя beerman beerman 9 мая 2009 в 5:26

на мой взгляд, это более правильное решение. и регионов никаких не надо
<?php
function mymodule_form_alter(&$form, $form_state, $form_id) {
// drupal_set_message('

'. print_r($form, 1) .'

');
switch ($form_id) {
case 'myform_node_form':
$block = module_invoke('quicktabs', 'block', 'view', 2);
// Указываем поле, после которого должен быть ставлен блок
$form['name_field_here']['#suffix'] = ''. $block['content'] .'';
break;
}
}
?>

Аватар пользователя glu2006 glu2006 9 мая 2009 в 11:18

beerman wrote:
на мой взгляд, это более правильное решение. и регионов никаких не надо
<?php
function mymodule_form_alter(&$form, $form_state, $form_id) {
// drupal_set_message('

'. print_r($form, 1) .'

');
switch ($form_id) {
case 'myform_node_form':
$block = module_invoke('quicktabs', 'block', 'view', 2);
// Указываем поле, после которого должен быть ставлен блок
$form['name_field_here']['#suffix'] = ''. $block['content'] .'';
break;
}
}
?>

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

Аватар пользователя beerman beerman 9 мая 2009 в 14:46

"glu2006" wrote:
Это применится ко всем нодам данного типа, а если надо выборочно? ID хардкодить?

да ну?

Аватар пользователя anreyyyy anreyyyy 9 мая 2009 в 17:28

в идеале, конечно, было бы написать такой модуль. который бы представлял собой CCK поле (fieldtype = block), внутри которого есть выпадающий список всех блоков.

создал поле, выбрал блок и готово. проектирование дизайна станет намного гибче.

могу выделить под это дело призовой фонд - 20 WMZ, если у кого будет интерес.

Аватар пользователя anreyyyy anreyyyy 9 мая 2009 в 18:08

даже набросал приблизительное техзадание (как понимаю его я - не программист):

1) создать заготовку для модуля cck_block_feild
2) в режиме редактирования страницы на месте поля отображается выпадающий список, пунктами которого являются все блоки из базы друпала, по порядку.

конечный код html код должен выглядеть приблизительно так (на примере моего сайта):

<select name="cck_block_field">
    <option value=block-nice_menus_id-1>Nice Menu 1 (Nice Menu)
    <option value=block-block_id-1>Баннер1
    <option value=block-primary_links>Primary links
    <option value=block-system_id-0>Создано на Drupal
    <option value=block-secondary-links>Secondary links
    <option value=block-user_id-0>Вход в систему
    <option value=block-uc_cart_id-0>Корзина
    <option value=block-user_id-2>Новые пользователи
    <option value=block-locale_id-0>Переключатель языка
    <option value=block-nice_menus_id-2>Nice Menu 2 (Nice Menu)
    <option value=block-menu_id-menu-menu-catalog>Каталог автомобилей
    <option value=block-quicktabs_id-1>qTab Mazda 3 sedan, описание
    <option value=block-quicktabs_id-2>qTab Mazda 3 sedan, параметры
    <option value=block-user_id-1>Навигация
    <option value=block-comment_id-0>Последние комментарии
    <option value=block-node_id-0>Сбор новостей
    <option value=block-user_id-3>Сейчас на сайте
    <option value=block-search_id-0>Форма поиска
</select>

3) далее, парсится параметр value и разбивается на две части: $тип_блока' и $id_блока. генерится код:
<?php
$block = module_invoke('$тип_блока', 'block', 'view', $id_блока);
print $block['content'];
?>
данный код отображается на месте нашего cck_block_feild