Вы здесь

Помогите c решением вывода материалов через свой модуль

0

Необходимо создать кастомный тип формы, подобный стандартному “tableselect”. Разница между стандартным “tableselect” и новым типом, заключается в том, что вместо первой колонки с чекбоксами у нас в последней колонке должны выводится подряд три инпута.

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

  1. Предусмотреть валидацию вводимых данных.

  2. Идентификатором строки, должнен выступать node id.

  3. Значение из полей необходимо записывать в созданный филд ноды.

Вот само задание

В этом деле начинающий, подтолкните в правильном направлении пожалуйста. Я так понимаю надо добавить инпут в форму, а в базу добавить через db_insert. Но как правильно? Вот что сделал:

<?php
//Menu
function advinfo_menu(){

$items['advinfo'] = array(

    'title'=> t('Advanced Info'),
    'page callback' => 'nodelist_form',
    'access callback' => 'user_access',
    'access arguments' => array('access content'),
    'expanded' => TRUE
    );
// Элемент ведущий к списку пользователей
$items['advinfo/nodeslist'] = array(

    'title' => t('Nodes list'),
    'description' => t('List of nodes'),
    'page callback' => 'nodelist_form',
    'access callabck' => 'user_access',
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM
    );
return $items;
}

function nodelist_form(){

$perpage = 10;
// HEADER TABLE
$header = array(
    array('data'=> 'Заголовок', 'field'=> 'title'),
    array('data'=> 'Создано', 'field'=> 'created'),
    array('data'=> 'Тип', 'field'=> 'type'),
    array('data'=>'NID', 'filed'=>'nid'),
    array('data'=>'Статус', 'field'=>'status'),
    array('data'=>'ITEM', 'field'=>'item'),
    array('data'=>'Комментарий', 'field'=>'comment'),

    );
    // Запрос к БД о материале
    $nodes = db_select('node','n')
    ->fields('n', array('title', 'created', 'type', 'nid', 'status','item'))
    ->extend('PagerDefault')
    ->limit(10)
    ->extend('TableSort')
    ->OrderByHeader($header)
    ->execute();

    global $base_url;
    $rows = array();

//создаем массив который выведим в таблицу после шапки
        foreach ($nodes as $node) 
        {
            $rows[]=array(
                l($node->title, $base_url."/node/".$node->nid), // Ссылка на конкретную ноду
                format_date($node->created), // дата публикации
                $node->type, //тип
                $node->nid,  //номер ноды
                $node->status, //status
                $node->item,
                $node='<form action="advinfo.module" method="post"> Item1: <input type="text" name="item1" size="5"><input type="submit" value="Save"></form>',
                );  
}   

        $nodes1 = db_update('node') 
        ->fields(array(
            'item' => '13'))    
            ->execute();

        $output = theme('table', array('header'=>$header, 'rows'=>$rows));
        $output.= theme('pager'); // навигация по результатам
        return $output; 
}

Возможно надо делать через _schema - я так понимаю, она создает таблицу в БД и не совсем подходит?

Версия Drupal: 
7.x
Категория: 
Database APIForm API
Вопрос задан 03.12.2015 - 13:54

Как мне связать input с title ноды, чтобы используя код ~~~php
<?php
$nodes1 = db_update('node')
->fields(array(
'item' => POST['item1']))
->execute();

~~~
он добавлял item к конкретной ноде (поле ITEM существует в БД).

Комментарий оставлен 03.12.2015 - 15:53

Ответы

0

судя по коду, вы в первый раз пишете что-то для друпал. Подход в данном случае совершенно не верный.
Не используйте db_select для загрузки нод, если нет необходимости выигрыша по производительности. Есть node_load, entity_load и EntityFieldQuery для загрузки сущностей из базы.

 $node='<form action="advinfo.module" method="post"> Item1: <input type="text" name="item1" size="5"><input type="submit" value="Save"></form>'

В друпале формы так никогда не создают. Почитайте про renderable arrays и про формы в частности.
Чтобы создать форму по аналогии с tableselect, смотрите hook_element_info, пример его реализации в модуле system. Ну и функцию theme_tableselect берите за основу.

Ответ дан 03.12.2015 - 21:01
0

из nodelist_form() вынести всю логику обработки в кастомную функцию.
В функции формы оставить только создание элементов формы, как положено.
В кастомной форме к форме стучаться через drupal_get_form(), объявляя его там, где в табличку нужно вставить.
Конкретно, вместо вот этого:

$node='<form action="advinfo.module" method="post"> Item1: <input type="text" name="item1" size="5"><input type="submit" value="Save"></form>',

Остается вопрос сабмита, если фся таблица - единая форма, то ок. Иначе нужно еще пошаманить. В рунете есть варианты.
Валидация и сабмит делаются через отдельные функции.
Кактус дал хорошую ссылку на пример работы с формами, ксати )

Ответ дан 04.12.2015 - 02:04
0

у андеда есть пример http://xandeadx.ru/blog/drupal/205

по вашему коду
создаем форму примерно так

function MODULE_form($form, $form_state, $nid){
    $form['one'] = array(
        //....
        '#ajax' => array(
            'callback' => 'MODULE_form_ajax_callback'
        )
    );

    //второе поле
    //третье поле

    return $form;
}


function MODULE_form_ajax_callback($form, &$form_state){
    $nid = $form_state['build_info']['args'][0];
    $node = node_load($nid);

    //задаем знаение полей

    node_save($node);
}

и потом

$rows[]=array(
    l($node->title, $base_url."/node/".$node->nid),

    //....

    render(drupal_get_form('MODULE_form', $node->nid))
); 
Ответ дан 04.12.2015 - 04:18

при том, что либо нужна общая кнопка под формой, которая будет все сохранять, либо автосохранение на ajax, как я предложил
второе удобнее

Комментарий оставлен 05.12.2015 - 03:56