Всем доброго времени суток! В калькуляторе нужно поменять "Покрытие" - Неправильно написано слово "двуХсторонний". Нужно без буквы "Х".
Все эти поля-переменные, которые берутся из базы. Переменные я могу отредактировать как из редактора переменных, так и через саму базу. Вопрос в том, что когда я убираю букву "Х" из текста, сыпятся ошибки и сам пункт "покрытие" полностью пустой:
<?phpNotice: unserialize() [function.unserialize]: Error at offset 288 of 1395 bytes в функции custom_calc_form() (строка 203 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Warning: Invalid argument supplied for foreach() в функции custom_calc_form() (строка 207 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 283 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 303 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 317 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 349 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).?>
Что я делаю не так и почему так происходит?
Вложение | Размер |
---|---|
![]() | 209.16 КБ |
![]() | 220.94 КБ |
Комментарии
Почитал форум - установил Variable Check. Перевел при этом сайт на англ, чтобы модуль сработал. Он нашел ошибку в одной переменной, удалил ее, но ничего не произошло. Так и не могу поменять слово.
Редактор переменных есть в devel. А если напрямую в базе, то надо не забывать в сериализованном значении при удалении буквы отредактировать и параметр длины переменной.
Спасибо за ответ! Если посмотреть на прикрепленный скрин redaktor_peremennyh.jpg, то в конце первой строчки, во втором блоке "новое значение" (доступным для редактирования) находится наше слово "двухстороннее". Если я убираю букву "х" и ставлю длину переменной s:100, вместо s:101, то выпадает ошибка. Если не менять- тоже выпадает ошибка, которая указана вверху.
Как видно, ошибка ансериалайза ушла, т.е. переменная стала правильная. Смотрите теперь в код своего калькулятора, откуда у него там нулевые индексы
Ошибка осталась, к сожалению. Чистка не валидных переменных ничего не дала. После того, как меняю букву опять та же ошибка, как в шапке. А что нужно смотреть в коде модуля? Вроде бы все хорошо здесь. Прилагаю сам код. модуля:
<?php function custom_calc_menu() {
$form = array(
$form['calc'.$type] = array(
$form['calc'.$type]['products']['add_more'.$type] = array(
$form['submit'] = array(
drupal_set_message('Прайс сохранен');
$form['step1']['header'] = array(
$form['step1']['fake_input'] = array(
$serial_opts = array(
$pid = custom_calc_get_value($form, $form_state, 'serial')+1;
$form['step1']['product'] = array(
$types = array(
$form['step1']['upper'] = array(
$form['step1']['prwidth1'] = array(
$form['step1']['prcount1'] = array(
$form['step1']['between'] = array(
$form['step1']['submit'] = array(
$prshcount1 = ceil((($prwidth1-$width)/($width+$between) + 1)*$prcount1*($shtype+1)); //
$form['step2']['header'] = array(
$form['step2']['sum2'] = array(
$form['step2']['inner'] = array(
$form['step2']['inner']['serial2'] = array(
$form['step2']['inner']['product2'] = array(
$form['step2']['inner']['shtype2'] = array(
$form['step2']['inner']['upper2'] = array(
$form['step2']['inner']['prwidth12'] = array(
$form['step2']['inner']['prcount12'] = array(
$form['step2']['inner']['between2'] = array(
$form['step2']['inner']['prshcount12'] = array(
$form['step2']['inner']['prmpcount12'] = array(
$form['step2']['inner']['price2'] = array(
$form['step2']['submit2'] = array(
$items['admin/config/content/custom_calc'] = array(
'title' => 'Калькулятор',
'page callback' => 'drupal_get_form',
'page arguments' => array('custom_calc_settings_form'),
'access arguments' => array('administer site'),
);
return
$items;}
function
custom_calc_settings_form($form, &$form_state) {drupal_add_css('.container-inline .form-item { float: left; margin-right: 20px; }', array('type' => 'inline'));
'#tree' => TRUE,
);
foreach (
$types as $type => $type_name) {if (!isset($form_state['calc'.$type])) {
$form_state['calc'.$type] = unserialize(variable_get('custom_calc_production'.$type, ''));
}
'#type' => 'fieldset',
'#title' => $type_name,
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['calc'.$type]['width'] = array(
'#type' => 'textfield',
'#title' => 'Ширина',
'#default_value' => variable_get('custom_calc_width'.$type, 0),
);
$form['calc'.$type]['products'] = array(
'#type' => 'fieldset',
'#title' => 'Виды п****',
'#collapsible' => FALSE,
'#prefix' => '<div id="calc-settings-product'.$type.'-wrapper">',
'#suffix' => '</div>',
);
foreach (
$form_state['calc'.$type] as $id => $pos) {if ($pos) {
$form['calc'.$type]['products'][] = array(
'#type' => 'container',
'#attributes' => array('class' => array('container-inline', 'clearfix')),
'name' => array(
'#type' => 'textfield',
'#title' => 'Название',
'#default_value' => $pos['name'],
),
'price' => array(
'#type' => 'textfield',
'#title' => 'Цена',
'#size' => 10,
'#default_value' => $pos['price'],
),
);
}
}
'#type' => 'submit',
'#value' => 'Добавить еще',
'#name' => 'add_more'.$type,
'#weight' => 50,
'#submit' => array('custom_calc_settings_form_add_product'),
'#ajax' => array(
'wrapper' => 'calc-settings-product'.$type.'-wrapper',
'callback' => 'custom_calc_settings_form_add_product_update',
'method' => 'replace',
),
);
}
'#type' => 'submit',
'#value' => 'Сохранить',
);
return
$form;}
function
custom_calc_settings_form_add_product($form, &$form_state) {$form_state[$form_state['triggering_element']['#array_parents'][0]][] = array(
'name' => '',
'price' => '',
);
$form_state['rebuild'] = TRUE;
}
function
custom_calc_settings_form_add_product_update($form, $form_state) {return $form[$form_state['triggering_element']['#array_parents'][0]]['products'];
}
function
custom_calc_settings_form_submit($form, $form_state) {$values = $form_state['values'];
foreach ($values as $id => $val) {
if (is_array($val)) {
$pid = substr($id, 4);
variable_set('custom_calc_width'.$pid, $val['width']);
$products = array();
foreach ($val['products'] as $product) {
if (is_array($product)) {
$products[] = $product;
}
}
variable_set('custom_calc_production'.$pid, serialize($products));
}
}
} /**
* Implements hook_block_info().
*/
function custom_calc_block_info() {
$blocks = array();
$blocks['custom_calc_form'] = array(
'info' => 'Калькулятор',
);
$blocks['custom_calc_form2'] = array(
'info' => 'Калькулятор',
);
return $blocks;
} /**
* Implements hook_block_view().
*/
function custom_calc_block_view($delta = '') {
$block = array();
switch ($delta) {
case 'custom_calc_form':
case 'custom_calc_form2':
$block['subject'] = '';
$block['content'] = drupal_get_form('custom_calc_form');
break;
}
return $block;
}
function
custom_calc_form($form, &$form_state) {$form = array(
'#prefix' => '<div id="calc-form-wrapper">',
'#suffix' => '</div>',
);
if (isset(
$form_state['form_submitted']) && ($form_state['form_submitted'] == 'submit1')) {$addClass = 'hide-step';
} else {
$addClass = 'show-step';
}
$form['step1'] = array(
'#type' => 'container',
'#prefix' => '<div id="calc-step1" class="'.$addClass.'">',
'#suffix' => '</div>',
);
'#markup' => '<h2>Калькулятор</h2>',
);
'#type' => 'textfield',
'#attributes' => array('class' => array('fake_input'), 'readonly' => 'readonly'),
'#default_value' => 0,
);
'1',
'2',
'3',
'4',
'5',
);
$form['step1']['serial'] = array(
'#type' => 'select',
'#title' => 'Серия:',
'#options' => $serial_opts,
'#default_value' => 0,
'#ajax' => array(
'wrapper' => 'calc-form-product-wrapper',
'callback' => 'custom_calc_form_product_update',
'method' => 'replace',
),
);
$serial = custom_calc_get_value($form, $form_state, 'serial');
$products = unserialize(variable_get('custom_calc_production'.$pid));
$width = variable_get('custom_calc_width'.$pid);
$names = array();
$prices = array();
foreach ($products as $id => $product) {
$names[] = $product['name'];
$prices[] = (float)($product['price']);
}
'#type' => 'select',
'#title' => 'Покрытие:',
'#options' => $names,
'#default_value' => 0,
'#prefix' => '<div id="calc-form-product-wrapper">',
'#suffix' => '</div>',
);
$product_id = custom_calc_get_value($form, $form_state, 'product');
'1сторона',
'2стороны',
);
$form['step1']['type'] = array(
'#type' => 'select',
'#title' => 'Вид:',
'#options' => $types,
'#default_value' => 0,
);
$shtype = custom_calc_get_value($form, $form_state, 'type');
'#type' => 'textfield',
'#title' => 'Высота, мм',
'#size' => 10,
'#default_value' => 1000,
);
$upper = (float)custom_calc_get_value($form, $form_state, 'upper');
'#type' => 'textfield',
'#title' => 'Ширина, мм',
'#size' => 30,
'#default_value' => 1432,
);
$prwidth1 = (int)custom_calc_get_value($form, $form_state, 'prwidth1');
'#type' => 'textfield',
'#title' => 'Количество, шт',
'#size' => 23,
'#default_value' => 4,
);
$prcount1 = (int)custom_calc_get_value($form, $form_state, 'prcount1');
'#type' => 'textfield',
'#title' => 'Расстояние, мм',
'#size' => 23,
'#default_value' => 66,
);
$between = (int)custom_calc_get_value($form, $form_state, 'between');
'#type' => 'submit',
'#value' => 'done',
'#name' => 'submit1',
'#submit' => array('custom_calc_form1_submit'),
'#prefix' => '<div class="submit-button">',
'#suffix' => '</div>',
'#ajax' => array(
'wrapper' => 'calc-form-wrapper',
'callback' => 'custom_calc_form_update',
'method' => 'replace',
),
);
$prmpcount1 = $prshcount1*$upper/1000;
$price_all = $prmpcount1*$prices[$product_id];
if (isset(
$form_state['form_submitted']) && ($form_state['form_submitted'] == 'submit1')) {$addClass = 'show-step';
} else {
$addClass = 'hide-step';
}
$form['step2'] = array(
'#type' => 'container',
'#prefix' => '<div id="calc-step2" class="'.$addClass.'">',
'#suffix' => '</div>',
);
'#markup' => '<h2>Итог:</h2>',
);
'#type' => 'textfield',
'#value' => number_format($price_all, 2, ',', ' '),
'#attributes' => array('class' => array('result_input'), 'readonly' => 'readonly', 'title'=>"( ($prwidth1-$width) / ($width+$between) + 1) * $prcount1 * ($shtype+1) * $upper/1000 * $prices[$product_id]"),
);
'#type' => 'container',
'#prefix' => '<div id="calc-step2-inner" class="clearfix">',
'#suffix' => '</div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Серия:</div><div class="result">'.$serial_opts[$serial].'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Покрытие:</div><div class="result">'.$names[$product_id].'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Вид:</div><div class="result">'.$types[$shtype].'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Высота, мм</div><div class="result">'.$upper.'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Ширина, мм</div><div class="result">'.$prwidth1.'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Количество, шт</div><div class="result">'.$prcount1.'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">999</div><div class="result">'.$between.'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Количество 666, шт</div><div class="result">'.$prshcount1.'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Количество 999, п.м.</div><div class="result">'.$prmpcount1.'</div></div>',
);
'#markup' => '<div class="clearfix"><div class="labell">Цена, руб.</div><div class="result">'.$prices[$product_id].'</div></div>',
);
'#type' => 'submit',
'#value' => 'done2',
'#name' => 'submit2',
'#submit' => array('custom_calc_form2_submit'),
'#prefix' => '<div class="submit-button">',
'#suffix' => '</div>',
'#ajax' => array(
'wrapper' => 'calc-form-wrapper',
'callback' => 'custom_calc_form_update',
'method' => 'replace',
),
);
return
$form;}
function
custom_calc_form1_submit($form, &$form_state) {$form_state['form_submitted'] = 'submit1';
$form_state['rebuild'] = TRUE;
}
function
custom_calc_form2_submit($form, &$form_state) {$form_state['form_submitted'] = 'submit2';
$form_state['rebuild'] = TRUE;
}
function
custom_calc_form_product_update($form, $form_state) {return $form['product'];
}
function
custom_calc_form_update($form, &$form_state) {return $form;
}
function
custom_calc_get_value($form, $form_state, $name) {if (isset($form_state['values'][$name])) {
return $form_state['values'][$name];
} else {
return $form['step1'][$name]['#default_value'];
}
}?>
<?php$product_id = custom_calc_get_value($form, $form_state, 'product');?>
И потом после этого везде, где есть $product_id, выдаёт нулевой индекс
userialize(variable_get(... не нужен. variable_* сам рассериализовывает и сериализует переменные
Если убрать фунцкию unserialize, то такая ошибка![Sad](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/sad.gif)
<?phpWarning: Invalid argument supplied for foreach() в функции custom_calc_form() (строка 207 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 283 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 303 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 317 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).
Notice: Undefined offset: 0 в функции custom_calc_form() (строка 349 в файле /home/user2013846/www/unistrade.biz/sites/all/modules/custom_calc/custom_calc.module).?>
Кстати о птичках, длина в serialize указывается в байтах. Кодировка - UTF-8, на русские буквы идёт два байта.
Удалили букву х - вычли из 101 2. Удалили скобку, цифру или латинскую букву - вычли 1.
Почему после того, как убрали unserialize - ошибка - это потому что, у variable_set serialize тоже убрать надо в этом случае.
Вручную править сериализованные данные - тоже гнилое дело.
Спасибо большое! Теперь все редактируется
А как-то можно упростить этот процесс, чтобы вручную не считать байты сериализации?
Вопрос возможно глупый, но разве не по пути admin/config/content/custom_calc ?
По этому адресу то, что на скрине (при правах администратора) ибо в модуле не предусмотрено создание страницы в админке для управления значениями. Так что сижу и считаю байты![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
В функции custom_calc_menu параметр 'access arguments' поменять на TRUE, очистить кэши, посмотреть, доступна ли страница.
Если да, то поменять на что-нибудь типа array('administer site configuration').
Поясняю - по умолчанию такого пермишна не существует. Нет пермишна - нет прав на доступ - правите ручками в базе.
Поэтому проверяем, работает ли страница, если доступ для всех. Если да - меняем на тот, который точно существует, и доступен только админситраторам.
Или же делаем в том же модуле имплементацию hook_permission. Но проще как выше.
Навели меня на мысль! Я дописал в форме функции calc_menu 'access callback' => TRUE, почистил кэши и по нужному нам адресу появилась форма редактирования переменных. Теперь все работает как часы! Спасибо!
Обязательно смените TRUE на что-нибудь адекватное. TRUE - и эта страница доступна всем.
а не проще в файле модуля поменятЬ?
я чуть выше скинул код модуля - не понимаю что нужно менять
Админка модуля. admin/config/content/custom_calc