Запись данных в переменную

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

Аватар пользователя fedor_cool fedor_cool 29 мая 2013 в 14:47

Всем привет.

Есть табличка пользователей (отдельная страничка).

Нужно сделать следующее:
- вывести колонкой checkbox
- при отметке checkbox id пользователя должно записывать в переменную (если id несколько, то записываться они должны через запятую)
- также есть кнопка - "Написать отмеченным партнерам". После нажатия на кнопку пользователя перекидывает по адресу /messages/new/id,id1,id2

Подскажите, как это сделать?

Комментарии

Аватар пользователя fedor_cool fedor_cool 30 мая 2013 в 12:56

serega111 wrote:
в form_submit собираете строку из отмеченных id, затем
<?php
$form_state['redirect'] = 'messeges/new/'.$ids;
?>

Задам наверно самый глупый вопрос, но как собрать в 1 переменную отмеченный id?..

Аватар пользователя fedor_cool fedor_cool 30 мая 2013 в 16:59

drupby wrote:
vbo?
или https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...

не до конца понял, что вы хотели этим сказать.

вот код функции, которая формирует табличку

/**
* Возвращает таблицу партнеров переданного человека.
*/
function get_table_partners($user) {
$rezult = db_select('fstructure', 'fs')
->fields('fs')
->condition('ruid', $user->uid)
->execute();
$fs = $rezult->fetchAll();

$uids = array();
foreach($fs as $fsitem) $uids[] = $fsitem->uid;

$users = user_load_multiple($uids);

// разрешать менять активность
$allow_change_active = user_access('set active partners');

$rows = array();
foreach($users as $uid => $su){

$link = 'Показать структуру';
//dsm($su);
$active = in_array('ФК', $su->roles);

$active_str = get_useractive_status($uid, $active, $allow_change_active);

$check_msg = $form['message'] = array(
'#type' => 'checkbox',
);;

$rows[] = array(
array('data'=>$check_msg),
array('data'=>theme('username', array('account'=>$su)) ),
array('data'=>format_date($su->created, 'short')),
array('data'=>$su->field_user_city['und'][0]['safe_value']),
array('data'=>$active_str, 'id'=>'link-active-'.$uid),
array('data'=>"Написать"),
array('data'=>$link, 'id'=>'link-load-'.$uid ),
);

$rows[] = array(
array('data'=>'', 'colspan'=>7, 'id'=>'row-structure-'.$uid, 'class'=>'row-structure-load', )
);
}

$header = array(
array('data'=>'Отметить'),
array('data'=>'Имя'),
array('data'=>'Дата регистрации'),
array('data'=>'Город'),
array('data'=>'Активность'),
array('data'=>'Написать'),
array('data'=>'Структура'),
);

$messages = null;

$colgroup = array(
array( array( 'class' => array('tpartners-col1') ) ),
array( array( 'class' => array('tpartners-col2') ) ),
array( array( 'class' => array('tpartners-col3') ) ),
array( array( 'class' => array('tpartners-col4') ) ),
array( array( 'class' => array('tpartners-col5') ) ),
array( array( 'class' => array('tpartners-col6') ) ),
array( array( 'class' => array('tpartners-col7') ) ),
);

$msg = $form['submit'] = array(
'#type' => 'submit',
'#value' => 'Написать всем выделенным пользователям',
);

$theme = theme('table', array(
'header' => $header,
'rows' => $rows,
'colgroups' => $colgroup,
'attributes'=> array('id'=>'table-structure'),
'empty' => 'Нет зарегистрированных партнеров',
));

return array($msg, array(
'#type' => 'markup',
'#markup' => $theme,
)
);
}

если я правильно понял api, то мне нужно сейчас прописать function get_table_partners_submit () в которой как раз и нужно собрать значения всех id пользователей.
вопрос - как же это сделать?
(понимаю, что несу глупости, но как-то так..)

Аватар пользователя serega111 serega111 30 мая 2013 в 19:11

"drupby" wrote:
https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...
Вам правильно советуют, вам нужна форма типа tableselect (как на странице admin/content). Пример смотрите по ссылке.

Ваша функция неправильная наверно (я не знаю точно, для чего вам этот модуль, но в контексте вопроса она неправильная).
Я бы сделал так примерно:
<?php
function module_name_get_table_partners($user){
return drupal_get_form('module_name_user_table', $user);
}

/**
* user form callback
*/
function module_name_user_table($form, $form_state, $user) {
// Тут ваша логика, загрузка юзеров, все как в старой функции

$rows[$uid] = array(
'username' => array('data'=>theme('username', array('account'=>$su)) ),
'created' => array('data'=>format_date($su->created, 'short')),
'city' => array('data'=>$su->field_user_city['und'][0]['safe_value']),
'activity' => array('data'=>$active_str, 'id'=>'link-active-'.$uid),
'send_message' => array('data'=>"Написать"),
'structure' -> array('data'=>$link, 'id'=>'link-load-'.$uid ),
);
// В $rows не добавляйте array('data'=>$check_msg),
// В $header не добавляйте поле 'Отметить', добавьте такие же ключи

$form = array (
'#type' => 'tableselect',
'#header' => $header,
'#options' => $rows,
'#empty' => t('Какой то текст для пустой таблицы'),
};
return $form;
}

/**
* submit callback
*/
funciton mcdule_name_user_table_submit($form, &$form_state) {
$values = $form_state['values'];
$ids = '';
foreach ($values as $uid => $value) {
if ($value) // вроде должно быть ноль или один, но лучше проверьте
$ids .= $uid.',';
}
if (!empty($str)) {
$ids = substr($ids, 0, strlen($ids) - 1); // удалить последнюю запятую
$form_state['redirect'] = 'messeges/new/'.$ids; //перенаправить юзера на нужную страницу
}
}
?>

Аватар пользователя fedor_cool fedor_cool 30 мая 2013 в 19:34

serega111 wrote:
"drupby" wrote:
https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...
Вам правильно советуют, вам нужна форма типа tableselect (как на странице admin/content). Пример смотрите по ссылке.

Ваша функция неправильная наверно (я не знаю точно, для чего вам этот модуль, но в контексте вопроса она неправильная).
Я бы сделал так примерно:
<?php
function module_name_get_table_partners($user){
return drupal_get_form('module_name_user_table', $user);
}

/**
* user form callback
*/
function module_name_user_table($form, $form_state, $user) {
// Тут ваша логика, загрузка юзеров, все как в старой функции

$rows[$uid] = array(
'username' => array('data'=>theme('username', array('account'=>$su)) ),
'created' => array('data'=>format_date($su->created, 'short')),
'city' => array('data'=>$su->field_user_city['und'][0]['safe_value']),
'activity' => array('data'=>$active_str, 'id'=>'link-active-'.$uid),
'send_message' => array('data'=>"Написать"),
'structure' -> array('data'=>$link, 'id'=>'link-load-'.$uid ),
);
// В $rows не добавляйте array('data'=>$check_msg),
// В $header не добавляйте поле 'Отметить', добавьте такие же ключи

$form = array (
'#type' => 'tableselect',
'#header' => $header,
'#options' => $rows,
'#empty' => t('Какой то текст для пустой таблицы'),
};
return $form;
}

/**
* submit callback
*/
funciton mcdule_name_user_table_submit($form, &$form_state) {
$values = $form_state['values'];
$ids = '';
foreach ($values as $uid => $value) {
if ($value) // вроде должно быть ноль или один, но лучше проверьте
$ids .= $uid.',';
}
if (!empty($str)) {
$ids = substr($ids, 0, strlen($ids) - 1); // удалить последнюю запятую
$form_state['redirect'] = 'messeges/new/'.$ids; //перенаправить юзера на нужную страницу
}
}
?>

Извините меня, но я по ходу совсем глупый.

<?php

/**
* возвращает строку статуса пользователя - с возможностью активации
*/
function get_useractive_status($uid, $active, $allow_change) {
if( $allow_change ) {
$active_str = $active ? 'Активен' : 'Неактивен';
}
else {
$active_str = $active ? 'Активен' : 'Неактивен';
}
return $active_str;
}
/**
* Возвращает таблицу партнеров переданного человека.
*/
function get_table_partners_form($user) {
return drupal_get_form('stalfond_user_table', $user);
}
function stalfond_user_table($form, $form_state, $user) {
// Тут ваша логика, загрузка юзеров, все как в старой функции
$rezult = db_select('fstructure', 'fs')
->fields('fs')
->condition('ruid', $user->uid)
->execute();
$fs = $rezult->fetchAll();

$uids = array();
foreach($fs as $fsitem) $uids[] = $fsitem->uid;

$users = user_load_multiple($uids);

// разрешать менять активность
$allow_change_active = user_access('set active partners');

$rows = array();
foreach($users as $uid => $su){

$link = 'Показать структуру';
//dsm($su);
$active = in_array('ФК', $su->roles);

$active_str = get_useractive_status($uid, $active, $allow_change_active);

$check_msg = $form['message'] = array(
'#type' => 'checkbox',
'#default_value' => FALSE,
);;

$rows[] = array(
array('data'=>$check_msg,$uid),
array('data'=>theme('username', array('account'=>$su)) ),
array('data'=>format_date($su->created, 'short')),
array('data'=>$su->field_user_city['und'][0]['safe_value']),
array('data'=>$active_str, 'id'=>'link-active-'.$uid),
array('data'=>"Написать"),
array('data'=>$link, 'id'=>'link-load-'.$uid ),
);

$rows[] = array(
array('data'=>'', 'colspan'=>7, 'id'=>'row-structure-'.$uid, 'class'=>'row-structure-load', )
);
}
$header = array(
array('data'=>'Отметить'),
array('data'=>'Имя'),
array('data'=>'Дата регистрации'),
array('data'=>'Город'),
array('data'=>'Активность'),
array('data'=>'Написать'),
array('data'=>'Структура'),
);

$colgroup = array(
array( array( 'class' => array('tpartners-col1') ) ),
array( array( 'class' => array('tpartners-col2') ) ),
array( array( 'class' => array('tpartners-col3') ) ),
array( array( 'class' => array('tpartners-col4') ) ),
array( array( 'class' => array('tpartners-col5') ) ),
array( array( 'class' => array('tpartners-col6') ) ),
array( array( 'class' => array('tpartners-col7') ) ),
);

$rows[$uid] = array(
'username' => array('data'=>theme('username', array('account'=>$su)) ),
'created' => array('data'=>format_date($su->created, 'short')),
'city' => array('data'=>$su->field_user_city['und'][0]['safe_value']),
'activity' => array('data'=>$active_str, 'id'=>'link-active-'.$uid),
'send_message' => array('data'=>"Написать"),
'structure' => array('data'=>$link, 'id'=>'link-load-'.$uid),
);
// В $rows не добавляйте array('data'=>$check_msg),
// В $header не добавляйте поле 'Отметить', добавьте такие же ключи

$form = array (
'#type' => 'tableselect',
'#header' => $header,
'#options' => $rows,
'#empty' => t('Какой то текст для пустой таблицы'),
);
return $form;
}

/**
* submit callback
*/
function stalfond_user_table_submit($form, &$form_state) {
$values = $form_state['values'];
$ids = '';
foreach ($values as $uid => $value) {
if ($value) // вроде должно быть ноль или один, но лучше проверьте
$ids .= $uid.',';
}
if (!empty($str)) {
$ids = substr($ids, 0, strlen($ids) - 1); // удалить последнюю запятую
$form_state['redirect'] = 'messeges/new/'.$ids; //перенаправить юзера на нужную страницу
}
}
/**
* page partners for user
*/
function user_partners() {
global $user;
global $hide_second_sidebar;
$hide_second_sidebar = true;

$outputTable = get_table_partners_form($user);

drupal_add_js('misc/ajax.js');

$title = '

Структура ' . theme('username', array('account'=>$user)) . '

';

$msg = "Столбец активность позволяет Вам активировать аккаунт Вашего партнера. Активация аккаунта подразумевает то, что Вы знаете этого человека, и этот человек уже работает или готов работать в компании. После активации ему станут доступны скрытые материалы, и после этого он также сможет менять активность уже своих партнеров.";

return array(
array(
'#type' => 'markup',
'#markup' => $title,
),
array(
'#type' => 'markup',
'#markup' => $msg,
),
$outputTable
);
}

/**
* ajax load partners
*/
function user_partners_ajax($user, $mode=null) {
if($mode != 'ajax') {
drupal_goto('user/'.$user->uid.'/partners');
}

$outputTable = get_table_partners($user);
$outputTable = "

$outputTable

";//скрыть/показать

$commands = array();
$commands[] = ajax_command_html('#row-structure-'.$user->uid, $outputTable);
$commands[] = ajax_command_html('#link-load-'.$user->uid, "

Cкрыть/показать

");
$commands[] = ajax_command_data('#link-load-'.$user->uid, 'uid', $user->uid);

return array(
'#type' => 'ajax',
'#commands' => $commands,
);
}

/**
* меняет статус активности пользователя - добавляет/убавляет роль ФК
*/
function set_user_active($user, $status=0, $mode=null) {

if($mode != 'ajax') {
drupal_goto('user/'.$user->uid.'/partners');
}

$roles = user_roles();
$roles = array_flip($roles);
$role_fk = $roles['ФК'];

if($status) {
$user->roles[$role_fk] = 'ФК';
} else {
unset($user->roles[$role_fk]);
}
user_save($user);

$active = in_array('ФК', $user->roles);

$output = get_useractive_status($user->uid, $active, 1);

$commands = array();
$commands[] = ajax_command_html('#link-active-'.$user->uid, $output);

return array(
'#type' => 'ajax',
'#commands' => $commands,
);
}
?>

вот весь код.
Но выводится в итоге у меня только выводится $title и $msg.

Аватар пользователя serega111 serega111 30 мая 2013 в 19:48

я же не могу за вас все написать и протестировать. Я писал код прям тут, возможны баги. Я пытался донести до вас идею, а не решение.А вы просто скопировали даже не прочитав мой код и комменты в нем.
Во первых, удалите свою инициализацию rows вставьте мою. она должна быть в foreach. Во вторых,

"fedor_cool" wrote:
// В $header не добавляйте поле 'Отметить', ДОБАВЬТЕ ТАКИЕ ЖЕ КЛЮЧИ

В третьтих, это действительно весь код? Это ваш модуль? А вы читали, как правильно именовать функции в модулях? О системе хуков?

Аватар пользователя fedor_cool fedor_cool 13 июня 2013 в 16:20

В итоге все получилось.
Вышло так:

<?php 

/**
 * возвращает строку статуса пользователя - с возможностью активации
 */
function get_useractive_status($uid$active$allow_change) {
        if( 
$allow_change ) {
            
$active_str $active '<a class="user-active use-ajax" href="/set_user_active/'.$uid.'/0/nojs">Активен</a>' '<a class="user-noactive use-ajax" href="/set_user_active/'.$uid.'/1/nojs">Неактивен</a>';
        }
        else {
            
$active_str $active '<span class="user-active">Активен</span>' '<span class="user-noactive">Неактивен</span>';
        }    
        return 
$active_str;
}

/**
 * Возвращает таблицу партнеров переданного человека. 
 */
function get_table_partners($form$form_state$user) {
    
$form['#method'] = 'post';
    
    
$rezult db_select('fstructure''fs')
            ->
fields('fs')
            ->
condition('ruid'$user->uid)
            ->
execute();
    
$fs $rezult->fetchAll();
    
    
$uids = array();
    foreach(
$fs as $fsitem$uids[] = $fsitem->uid;
    
    
$users user_load_multiple($uids);
    
    
// разрешать менять активность
    
$allow_change_active user_access('set active partners');
    
    
$rows = array();
    foreach(
$users as $uid => $su){

        

$link '<a href="/stalfond/partners/'.$uid.'/nojs" class="use-ajax">Показать структуру</a>';
        
//dsm($su);
        
$active in_array('ФК'$su->roles); 
        
        
        
$active_str get_useractive_status($uid$active$allow_change_active);
        
        
        
$rows[] = array(
            array(
'data'=>($form['check'] = array ('#type' => 'checkbox''#name' => 'usid[]''#return_value' => $uid,))),
            array(
'data'=>theme('username', array('account'=>$su)) ),
            array(
'data'=>format_date($su->created'short')), 
            array(
'data'=>$su->field_user_city['und'][0]['safe_value']),
            array(
'data'=>$active_str'id'=>'link-active-'.$uid),
            array(
'data'=>"<a class='row-message' href='messages/new/$uid'>Написать</a>"),
            array(
'data'=>$link'id'=>'link-load-'.$uid ),
        );
        
        
$rows[] = array(
            array(
'data'=>'''colspan'=>7'id'=>'row-structure-'.$uid'class'=>'row-structure-load', )
        );
    }
    
    
$headers = array(
        array(
'data'=>'id'),
        array(
'data'=>'Имя'),
        array(
'data'=>'Дата регистрации'),
        array(
'data'=>'Город'),
        array(
'data'=>'Активность'),
        array(
'data'=>'Написать'),
        array(
'data'=>'Структура'),
    );
    
    
$colgroup = array(
        array( array( 
'class' => array('tpartners-col1') ) ),
        array( array( 
'class' => array('tpartners-col2') ) ),
        array( array( 
'class' => array('tpartners-col3') ) ),
        array( array( 
'class' => array('tpartners-col4') ) ),
        array( array( 
'class' => array('tpartners-col5') ) ),
        array( array( 
'class' => array('tpartners-col6') ) ),
        array( array( 
'class' => array('tpartners-col7') ) ),
    );    
    
    
$form['submit'] = array(
        
'#type' => 'submit',
        
'#value' => 'Начать диалог с выделенными партнерами',
    );
  
    
$form['table'] = array(
        
'#theme' => 'table',
        
'#header' => $headers,
        
'#rows' => $rows,
        
'#colgroups' => $colgroup,
        
'#attributes'=> array('id'=>'table-structure'),
        
'#empty' => 'Нет зарегистрированных партнеров',
    );
    return 
$form;
        
}

function 

get_table_partners_submit($form, &$form_state) {
  
$form['#method'] = 'post';
  global 
$user;
  
  if(isset(
$_POST['usid'])){
    
$values $_POST['usid'];
    
    
$ids '';
    
    foreach (
$values as $v) {
        
$ids .= $v.',';
    }
    
    if (!empty(
$ids)) {
        
$ids substr($ids0strlen($ids) - 1); // удалить последнюю запятую
        
$form_state['redirect'] = 'messages/new/'.$ids//перенаправить юзера на нужную страницу
    
}
  }
  else{
        
drupal_set_message('Вы не отметили ни одного партнера');
  }
}

/**
 * page partners for user
 */
function user_partners() {
    global 
$user;
    global 
$hide_second_sidebar;
    
$hide_second_sidebar true;
    
    
$outputTable drupal_render(drupal_get_form('get_table_partners',$user));

    

drupal_add_js('misc/ajax.js');
    
    
$title '<h2>Структура ' theme('username', array('account'=>$user)) . '</h2>';
    
    
$msg '<p>Столбец "активность" позволяет Вам активировать аккаунт Вашего партнера. Активация аккаунта подразумевает то, что Вы знаете этого человека, и этот человек уже работает или готов работать в компании. После активации ему станут доступны скрытые материалы, и после этого он также сможет менять активность уже своих партнеров.</p>';

    
    return 

$title $msg $outputTable;
}
function 
get_table_partnerss($user) {
    
$rezult db_select('fstructure''fs')
            ->
fields('fs')
            ->
condition('ruid'$user->uid)
            ->
execute();
    
$fs $rezult->fetchAll();
    
    
$uids = array();
    foreach(
$fs as $fsitem$uids[] = $fsitem->uid;
    
    
$users user_load_multiple($uids);
    
    
// разрешать менять активность
    
$allow_change_active user_access('set active partners');
    
    
$rows = array();
    foreach(
$users as $uid => $su){

        

$link '<a href="/stalfond/partners/'.$uid.'/nojs" class="use-ajax">Показать структуру</a>';
        
//dsm($su);
        
$active in_array('ФК'$su->roles); 
        
        
$active_str get_useractive_status($uid$active$allow_change_active);
        
        
$rows[] = array(
            array(
'data'=>($form['check'] = array ('#type' => 'checkbox''#name' => 'usid[]''#return_value' => $uid,))),
            array(
'data'=>theme('username', array('account'=>$su)) ),
            array(
'data'=>format_date($su->created'short')), 
            array(
'data'=>$su->field_user_city['und'][0]['safe_value']),
            array(
'data'=>$active_str'id'=>'link-active-'.$uid),
            array(
'data'=>"<a class='row-message' href='messages/new/$uid'>Написать</a>"),
            array(
'data'=>$link'id'=>'link-load-'.$uid ),
        );
        
        
$rows[] = array(
            array(
'data'=>'''colspan'=>7'id'=>'row-structure-'.$uid'class'=>'row-structure-load', )
        );
    }
    
    
$headers = array(
        array(
'data'=>'id'),
        array(
'data'=>'Имя'),
        array(
'data'=>'Дата регистрации'),
        array(
'data'=>'Город'),
        array(
'data'=>'Активность'),
        array(
'data'=>'Написать'),
        array(
'data'=>'Структура'),
    );
    
    
$colgroup = array(
        array( array( 
'class' => array('tpartners-col1') ) ),
        array( array( 
'class' => array('tpartners-col2') ) ),
        array( array( 
'class' => array('tpartners-col3') ) ),
        array( array( 
'class' => array('tpartners-col4') ) ),
        array( array( 
'class' => array('tpartners-col5') ) ),
        array( array( 
'class' => array('tpartners-col6') ) ),
        array( array( 
'class' => array('tpartners-col7') ) ),
    );
  
  
    return 
theme('table', array(
        
'header' => $headers,
        
'rows' => $rows,
        
'colgroups' => $colgroup,
        
'attributes'=> array('id'=>'table-structure'),
        
'empty' => 'Нет зарегистрированных партнеров',
    ));
        
}

/**
 * ajax load partners 
 */
function user_partners_ajax($user$mode=null) {
    if(
$mode != 'ajax') {
        
drupal_goto('user/'.$user->uid.'/partners');
    }
    
    
$outputTable =     get_table_partnerss($user);
    
$outputTable "<div class=\"inner-table\">$outputTable</div>";//<span class=\"shlink\" >скрыть/показать</span>
    
    
$commands = array();
    
$commands[] = ajax_command_html('#row-structure-'.$user->uid$outputTable);
    
$commands[] = ajax_command_html('#link-load-'.$user->uid"<div><span class=\"shlink\" >Cкрыть/показать</span></div>");
    
$commands[] = ajax_command_data('#link-load-'.$user->uid'uid'$user->uid);
    
    return array(
        
'#type' => 'ajax',
        
'#commands' => $commands,
    );
    
}

/**
 * меняет статус активности пользователя - добавляет/убавляет роль ФК
 */
function set_user_active($user$status=0$mode=null) {
    
    if(
$mode != 'ajax') {
        
drupal_goto('user/'.$user->uid.'/partners');
    }
    
    
$roles user_roles();
    
$roles array_flip($roles);
    
$role_fk $roles['ФК'];
    
    if(
$status) {
        
$user->roles[$role_fk] = 'ФК';
    } else {
        unset(
$user->roles[$role_fk]);
    }
    
user_save($user);
    
    
$active in_array('ФК'$user->roles); 
    
    
$output get_useractive_status($user->uid$active1);
    
    
$commands = array();
    
$commands[] = ajax_command_html('#link-active-'.$user->uid$output);
    
    return array(
        
'#type' => 'ajax',
        
'#commands' => $commands,
    );
}

?>

Всем спасибо за помощь