Как изменить запись в форме

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

Аватар пользователя Adam Adam 4 ноября 2014 в 9:54

Здравствуйте. Подскажите пожалуйста как мне по id достать объект и "расфосовать" поля в соответсвующие textfield? Сейчас возникает ошибка которую мне не удается понять:
Имею список имен
При нажатии на кнопку "Изменить" имею ошибку:
Notice: Array to string conversion in DatabaseStatementBase->execute() (line 2171 of C:\xampp\htdocs\dru2.ru\includes\database\database.inc).
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' NULL, , '', '', '', '1', '', 'post', , , ))' at line 1: SELECT n.id AS id, n.name AS name, n.phonenumber AS phonenumber, n.tags AS tags, n.created_at AS created_at, n.updated_at AS updated_at FROM {phonebook} n WHERE (n.id IN (:db_condition_placeholder_0_0, :db_condition_placeholder_0_1, :db_condition_placeholder_1, , :db_condition_placeholder_3, , :db_condition_placeholder_5, :db_condition_placeholder_6, :db_condition_placeholder_7, :db_condition_placeholder_8, :db_condition_placeholder_9, :db_condition_placeholder_10, , , )) ; Array ( [:db_condition_placeholder_1] => [:db_condition_placeholder_3] => [:db_condition_placeholder_5] => [:db_condition_placeholder_6] => [:db_condition_placeholder_7] => [:db_condition_placeholder_8] => 1 [:db_condition_placeholder_9] => [:db_condition_placeholder_10] => post [:db_condition_placeholder_0_0] => Array ( [0] => 1 ) [:db_condition_placeholder_0_1] => phonebook_form ) in phonebook_form() (line 88 of C:\xampp\htdocs\dru2.ru\sites\all\modules\phonebook\phonebook.module).

Код моего phonebook_menu и phonebook_form:
function phonebook_menu()
{
$items = array();

$items['admin/config/content/phonebook'] = array(
'title' => 'Phone Book',
'description' => 'Конфигурирование списка телефонный номеров',
'page callback' => 'phonebook_list',
'access arguments' => array('administer site configuration'),
);
$items['admin/config/content/phonebook/list'] = array(
'title' => 'Список телефонных номеров',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 1,
);

// phone add form
$items['admin/config/content/phonebook/add'] = array(
'title' => 'Добавить номер',
'page callback' => 'drupal_get_form',
'page arguments' => array('phonebook_form'),
'access arguments' => array('administer site configuration'),
'type' => MENU_LOCAL_TASK,
'weight' => 2,
);

// phone edit form
$items['admin/config/content/phonebook/%/edit'] = array(
'title' => 'Редактировать номер',
'page callback' => 'drupal_get_form',
'page arguments' => array('phonebook_form', 4),
'access arguments' => array('administer site configuration'),
'type' => MENU_CALLBACK,

);

// phone delete
$items['admin/config/content/phonebook/%phone/delete'] = array(
'title' => 'Удалить номер',
'page callback' => 'phonebook_delete',
'page arguments' => array(4),
'access arguments' => array('administer site configuration'),
'type' => MENU_SUGGESTED_ITEM,
);

$items['phonebook'] = array(
'title' => 'Телефонные номера',
'page callback' => '_phonebook_page',
'access arguments' => array('access content'),
);

$items['phonebook/%phone/items'] = array(
'title' => 'Содержимое телефонной книги',
'page callback' => 'phone_content',
'page arguments' => array(1),
'access callback' => TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);

return $items;
}
function phonebook_form($form, $phone = null)
{
var_dump($phone);
if ($phone != null) {
$phone = db_select('phonebook', 'n')
->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
->condition('n.id', $phone)
->execute()->fetchAll();
}
$form['name'] = array(
'#title' => t('Имя контакта'),
'#description' => t('Вставьте имя контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone[0]->name : '',
'#required' => true,
);

$form['phonenumber'] = array(
'#title' => t('Номер контакта'),
'#description' => t('Вставьте телефонный номер контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone : '',
'#required' => true,
);
$form['tags'] = array(
'#title' => t('Теги контакта'),
'#description' => t('Вставьте теги контакта'),
'#type' => 'textfield',
'#default_value' => $phone ? $phone : '',
'#required' => true,
);

$form['submit'] = array(
'#type' => 'submit',
'#value' => $phone ? t('Сохранить') : t('Добавить'),
);

if ($phone) {
$form['id'] = array(
'#type' => 'value',
'#value' => $phone,
);
}

return $form;
}
Я понимаю что ошибка при запросе в бд из функции phonebook_form, а что не правильно я делаю?

Комментарии

Аватар пользователя Orion76 Orion76 4 ноября 2014 в 10:23

Где-то в запросе вместо "строки" "массив" передали..

Без подсветки, код читать сложно..
На панели поля редактирования комментария есть кнопочка "Вставка кода"(6-я с конца)..
Поправте, пожалуйста, пост..

Аватар пользователя Adam Adam 4 ноября 2014 в 13:58

Adam wrote:
Здравствуйте. Подскажите пожалуйста как мне по id достать объект и "расфосовать" поля в соответсвующие textfield? Сейчас возникает ошибка которую мне не удается понять:
Имею список имен
При нажатии на кнопку "Изменить" имею ошибку:
Notice: Array to string conversion in DatabaseStatementBase->execute() (line 2171 of C:\xampp\htdocs\dru2.ru\includes\database\database.inc).
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' NULL, , '', '', '', '1', '', 'post', , , ))' at line 1: SELECT n.id AS id, n.name AS name, n.phonenumber AS phonenumber, n.tags AS tags, n.created_at AS created_at, n.updated_at AS updated_at FROM {phonebook} n WHERE (n.id IN (:db_condition_placeholder_0_0, :db_condition_placeholder_0_1, :db_condition_placeholder_1, , :db_condition_placeholder_3, , :db_condition_placeholder_5, :db_condition_placeholder_6, :db_condition_placeholder_7, :db_condition_placeholder_8, :db_condition_placeholder_9, :db_condition_placeholder_10, , , )) ; Array ( [:db_condition_placeholder_1] => [:db_condition_placeholder_3] => [:db_condition_placeholder_5] => [:db_condition_placeholder_6] => [:db_condition_placeholder_7] => [:db_condition_placeholder_8] => 1 [:db_condition_placeholder_9] => [:db_condition_placeholder_10] => post [:db_condition_placeholder_0_0] => Array ( [0] => 1 ) [:db_condition_placeholder_0_1] => phonebook_form ) in phonebook_form() (line 88 of C:\xampp\htdocs\dru2.ru\sites\all\modules\phonebook\phonebook.module).

Код моего phonebook_menu и phonebook_form:

<?phpfunction phonebook_menu()
{
    $items = array();

    $items['admin/config/content/phonebook'] = array(
        'title'            => 'Phone Book',
        'description'      => 'Конфигурирование списка телефонный номеров',
        'page callback'    => 'phonebook_list',
        'access arguments' => array('administer site configuration'),
    );
    $items['admin/config/content/phonebook/list'] = array(
        'title'  => 'Список телефонных номеров',
        'type'   => MENU_DEFAULT_LOCAL_TASK,
        'weight' => 1,
    );

    // phone add form
    $items['admin/config/content/phonebook/add'] = array(
        'title'            => 'Добавить номер',
        'page callback'    => 'drupal_get_form',
        'page arguments'   => array('phonebook_form'),
        'access arguments' => array('administer site configuration'),
        'type'             => MENU_LOCAL_TASK,
        'weight'           => 2,
    );

    // phone edit form
    $items['admin/config/content/phonebook/%/edit'] = array(
        'title'            => 'Редактировать номер',
                'page callback'    => 'drupal_get_form',
        'page arguments'   => array('phonebook_form', 4),
        'access arguments' => array('administer site configuration'),
        'type'             => MENU_CALLBACK,
        
    );

    // phone delete
    $items['admin/config/content/phonebook/%phone/delete'] = array(
        'title'            => 'Удалить номер',
        'page callback'    => 'phonebook_delete',
        'page arguments'   => array(4),
        'access arguments' => array('administer site configuration'),
        'type'             => MENU_SUGGESTED_ITEM,
    );

    $items['phonebook'] = array(
        'title'            => 'Телефонные номера',
        'page callback'    => '_phonebook_page',
        'access arguments' => array('access content'),
    );

    $items['phonebook/%phone/items'] = array(
        'title'            => 'Содержимое телефонной книги',
        'page callback'    => 'phone_content',
        'page arguments'   => array(1),
        'access callback'  => TRUE,
        'access arguments' => array('access content'),
        'type'             => MENU_CALLBACK,
    );

    return $items;
}
function phonebook_form($form, $phone = null)
{
    var_dump($phone);
    if ($phone != null) {
        $phone = db_select('phonebook', 'n')
        ->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
        ->condition('n.id', $phone)
        ->execute()->fetchAll();
    }
    $form['name'] = array(
        '#title'         => t('Имя контакта'),
        '#description'   => t('Вставьте имя контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone[0]->name : '',
        '#required'      => true,
    );

    $form['phonenumber'] = array(
        '#title'         => t('Номер контакта'),
        '#description'   => t('Вставьте телефонный номер контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone : '',
        '#required'      => true,
    );
        $form['tags'] = array(
        '#title'         => t('Теги контакта'),
        '#description'   => t('Вставьте теги контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone : '',
        '#required'      => true,
    );

    $form['submit'] = array(
        '#type'  => 'submit',
        '#value' => $phone ? t('Сохранить') : t('Добавить'),
    );

    if ($phone) {
        $form['id'] = array(
            '#type'  => 'value',
            '#value' => $phone,
        );
    }

    return $form;
}?>

Я понимаю что ошибка при запросе в бд из функции phonebook_form, а что не правильно я делаю?

Аватар пользователя drupby drupby 4 ноября 2014 в 15:20

"Adam" wrote:
->condition('n.id', $phone)

$phone - integer или string ?
нужно дебажить строки с запросом
и зачем кстати в текстовые поля в значения по умолчанию вставлять массив?

Аватар пользователя Adam Adam 10 ноября 2015 в 11:49

Переменная $phone была строковой, сделал преобразование в integer. Теперь появляется такая ошибка (вложение pic3)
P.S. Пробовал вставлять массив, потому что после запроса в бд, вернется объект и переменная $phone - станет ассоц.массивом с ключами 'id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'. Пока запрос не проходит.

Аватар пользователя Orion76 Orion76 4 ноября 2014 в 17:16

"drupby" wrote:
$phone - integer или string ?

Это массив-)

ОБратите внимание на параметры функции-конструктора формы..
Ничего не настроживает?-)

Аватар пользователя Adam Adam 4 ноября 2014 в 17:30

"orion76" wrote:
"drupby" написал(а):
$phone - integer или string ?
Это массив-)
ОБратите внимание на параметры функции-конструктора формы..
Ничего не настроживает?-)

Да, был массив потому что в функции phonebook_menu, ключ у массива $items был ['admin/config/content/phonebook/%/edit']
Затем, после знака процента, я добавил слово phone, получилось: ['admin/config/content/phonebook/%phone/edit']
и аргументом <?php'page arguments'   => array('phonebook_form', 4)?> - стало добавляться значение типа string.
В функции phonebook_form, я сделал преобразование $phone = (int)$phone.
Теперь появляется ошибка, представленная на изображении, которое я прикрепил в своём предыдущем сообщении.
На данный момент, у меня код такой (часть)
Функция phonebook_menu:

<?php
...
// phone edit form
    
$items['admin/config/content/phonebook/%phone/edit'] = array(
        
'title'            => 'Редактировать номер',
                
'page callback'    => 'drupal_get_form',
        
'page arguments'   => array('phonebook_form'4),
        
'access arguments' => array('administer site configuration'),
        
'type'             => MENU_CALLBACK,
        
    );
...
?>

Функция phonebook_form:

<?phpfunction phonebook_form($form, &$form_state, $phone = null)
{
    $phone = (int)$phone;
    var_dump($phone);
    if ($phone != null) {
        
        $phone = db_select('phonebook', 'n')
        ->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
        ->condition('n.id', $phone)
        ->execute()->fetchAll();
    }
    $form['name'] = array(
        '#title'         => t('Имя контакта'),
        '#description'   => t('Вставьте имя контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone[0]->name : '',
        '#required'      => true,
    );

    $form['phonenumber'] = array(
        '#title'         => t('Номер контакта'),
        '#description'   => t('Вставьте телефонный номер контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone : '',
        '#required'      => true,
    );
        $form['tags'] = array(
        '#title'         => t('Теги контакта'),
        '#description'   => t('Вставьте теги контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone : '',
        '#required'      => true,
    );

    $form['submit'] = array(
        '#type'  => 'submit',
        '#value' => $phone ? t('Сохранить') : t('Добавить'),
    );

    if ($phone) {
        $form['id'] = array(
            '#type'  => 'value',
            '#value' => $phone,
        );
    }

    return $form;
}?>

Кто знает почему у меня появляется ошибка, отпишитесь пожалуйста.

Аватар пользователя drupby drupby 4 ноября 2014 в 18:47

"orion76" wrote:
Это массив-)

изначально туда записывается либо NULL, либо значение из аргумента урла, а потом уже только там будет массив, меня интересовало, что передается в метод condition()
"ХулиGUN" wrote:
Для пхп вроде как пох должно быть

я имел ввиду, что должно быть либо то, либо другое
"Adam" wrote:
Затем, после знака процента, я добавил слово phone, получилось: ['admin/config/content/phonebook/%phone/edit']

а вот это не нужно было делать, нужно оставить ['admin/config/content/phonebook/%/edit'] и в урл 4-м аргументом записывать id
"Adam" wrote:
'#default_value' => $phone ? $phone : '',

"Adam" wrote:
'#value' => $phone,

зачем записывать массивы в значения полей?

Аватар пользователя drupby drupby 4 ноября 2014 в 18:55
$items['admin/config/content/phonebook/%/edit'] = array(
        'title'            => 'Редактировать номер',
                'page callback'    => 'drupal_get_form',
        'page arguments'   => array('phonebook_form', 4),
        'access arguments' => array('administer site configuration'),
        'type'             => MENU_CALLBACK,
       
    );
function phonebook_form($form, &$form_state, $phone = null)
{
    var_dump($phone);
    if ($phone != null) {
       
        $phone = db_select('phonebook', 'n')
        ->fields('n', array('id', 'name', 'phonenumber', 'tags', 'created_at', 'updated_at'))
        ->condition('n.id', $phone)
        ->execute()->fetchObject();
    }
    $form['name'] = array(
        '#title'         => t('Имя контакта'),
        '#description'   => t('Вставьте имя контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone->name : '',
        '#required'      => true,
    );

    $form['phonenumber'] = array(
        '#title'         => t('Номер контакта'),
        '#description'   => t('Вставьте телефонный номер контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone->phonenumber : '',
        '#required'      => true,
    );
        $form['tags'] = array(
        '#title'         => t('Теги контакта'),
        '#description'   => t('Вставьте теги контакта'),
        '#type'          => 'textfield',
        '#default_value' => $phone ? $phone->tags : '',
        '#required'      => true,
    );

    $form['submit'] = array(
        '#type'  => 'submit',
        '#value' => $phone ? t('Сохранить') : t('Добавить'),
    );

    if ($phone) {
        $form['id'] = array(
            '#type'  => 'value',
            '#value' => $phone->id,
        );
    }

    return $form;
}

Аватар пользователя Adam Adam 4 ноября 2014 в 19:26

"drupby" wrote:
fetchObject

Как ты узнал что такой вид выборки необходимо применять? Он работает спасибо большое!

Аватар пользователя Adam Adam 4 ноября 2014 в 19:51

А в каких случаях, в функции menu, в ключе массива $items, после знака процента дописывают имя переменной?
(прим.: <?php $items['admin/config/content/phonebook/%param1/edit'] = array( ......)?>)

Аватар пользователя drupby drupby 4 ноября 2014 в 20:12

"Adam" wrote:
А в каких случаях, в функции menu, в ключе массива $items, после знака процента дописывают имя переменной?

в данном случае в каллбек функцию передается возвращаемое значение функции param1_load, если такая имеется (к примеру %node(node_load), %user(user_load))