Ошибки при изменении переменной

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

Аватар пользователя alexingloire alexingloire 29 сентября 2016 в 14:14

Всем доброго времени суток! В калькуляторе нужно поменять "Покрытие" - Неправильно написано слово "двуХсторонний". Нужно без буквы "Х".
Все эти поля-переменные, которые берутся из базы. Переменные я могу отредактировать как из редактора переменных, так и через саму базу. Вопрос в том, что когда я убираю букву "Х" из текста, сыпятся ошибки и сам пункт "покрытие" полностью пустой:

<?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).?>

Что я делаю не так и почему так происходит?

ВложениеРазмер
Иконка изображения redaktor_peremennyh.jpg209.16 КБ
Иконка изображения posle_udaleniya_bukvy.jpg220.94 КБ

Лучший ответ

Аватар пользователя fairrandir fairrandir 30 сентября 2016 в 18:13
1

В функции custom_calc_menu параметр 'access arguments' поменять на TRUE, очистить кэши, посмотреть, доступна ли страница.
Если да, то поменять на что-нибудь типа array('administer site configuration').

Поясняю - по умолчанию такого пермишна не существует. Нет пермишна - нет прав на доступ - правите ручками в базе.
Поэтому проверяем, работает ли страница, если доступ для всех. Если да - меняем на тот, который точно существует, и доступен только админситраторам.
Или же делаем в том же модуле имплементацию hook_permission. Но проще как выше.

Комментарии

Аватар пользователя alexingloire alexingloire 29 сентября 2016 в 17:06

Почитал форум - установил Variable Check. Перевел при этом сайт на англ, чтобы модуль сработал. Он нашел ошибку в одной переменной, удалил ее, но ничего не произошло. Так и не могу поменять слово.

Аватар пользователя gun_dose gun_dose 30 сентября 2016 в 6:43
1

Редактор переменных есть в devel. А если напрямую в базе, то надо не забывать в сериализованном значении при удалении буквы отредактировать и параметр длины переменной.

Аватар пользователя alexingloire alexingloire 30 сентября 2016 в 10:54

Спасибо за ответ! Если посмотреть на прикрепленный скрин redaktor_peremennyh.jpg, то в конце первой строчки, во втором блоке "новое значение" (доступным для редактирования) находится наше слово "двухстороннее". Если я убираю букву "х" и ставлю длину переменной s:100, вместо s:101, то выпадает ошибка. Если не менять- тоже выпадает ошибка, которая указана вверху.

Аватар пользователя gun_dose gun_dose 30 сентября 2016 в 12:16

Как видно, ошибка ансериалайза ушла, т.е. переменная стала правильная. Смотрите теперь в код своего калькулятора, откуда у него там нулевые индексы

Аватар пользователя alexingloire alexingloire 30 сентября 2016 в 18:39

Ошибка осталась, к сожалению. Чистка не валидных переменных ничего не дала. После того, как меняю букву опять та же ошибка, как в шапке. А что нужно смотреть в коде модуля? Вроде бы все хорошо здесь. Прилагаю сам код. модуля:

<?php

function custom_calc_menu() {
  
$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'));

  

$form = array(
    
'#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''));
    }

    

$form['calc'.$type] = array(
      
'#type' => 'fieldset',
      
'#title' => $type_name,
      
'#collapsible' => TRUE
      
'#collapsed' => TRUE,
    );
    
$form['calc'.$type]['width'] = array(
      
'#type' => 'textfield',
      
'#title' => 'Ширина',
      
'#default_value' => variable_get('custom_calc_width'.$type0),
    );
    
$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'],
          ),
        );
      }
    }

    

$form['calc'.$type]['products']['add_more'.$type] = array(
      
'#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',
      ),
    );
  }

  

$form['submit'] = array(
    
'#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($id4);
      
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'.$pidserialize($products));
    }
  }

  

drupal_set_message('Прайс сохранен');
}

/**
* 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>',
  );

  

$form['step1']['header'] = array(
    
'#markup' => '<h2>Калькулятор</h2>',
  );

  

$form['step1']['fake_input'] = array(
    
'#type' => 'textfield',
    
'#attributes' => array('class' => array('fake_input'), 'readonly' => 'readonly'),
    
'#default_value' => 0,
  );

  

$serial_opts = array(
    
'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');

  

$pid custom_calc_get_value($form$form_state'serial')+1;
  
$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']);
  }

  

$form['step1']['product'] = array(
    
'#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');

  

$types = array(
    
'1сторона',
    
'2стороны',
  );
  
$form['step1']['type'] = array(
    
'#type' => 'select',
    
'#title' => 'Вид:',
    
'#options' => $types,
    
'#default_value' => 0,
  );
  
$shtype custom_calc_get_value($form$form_state'type');

  

$form['step1']['upper'] = array(
    
'#type' => 'textfield',
    
'#title' => 'Высота, мм',
    
'#size' => 10,
    
'#default_value' => 1000,
  );
  
$upper = (float)custom_calc_get_value($form$form_state'upper');

  

$form['step1']['prwidth1'] = array(
    
'#type' => 'textfield',
    
'#title' => 'Ширина, мм',
    
'#size' => 30,
    
'#default_value' => 1432,
  );
  
$prwidth1 = (int)custom_calc_get_value($form$form_state'prwidth1');

  

$form['step1']['prcount1'] = array(
    
'#type' => 'textfield',
    
'#title' => 'Количество, шт',
    
'#size' => 23,
    
'#default_value' => 4,
  );
  
$prcount1 = (int)custom_calc_get_value($form$form_state'prcount1');

  

$form['step1']['between'] = array(
    
'#type' => 'textfield',
    
'#title' => 'Расстояние, мм',
    
'#size' => 23,
    
'#default_value' => 66,
  );
  
$between = (int)custom_calc_get_value($form$form_state'between');

  

$form['step1']['submit'] = array(
    
'#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',
    ),
  );

  
  

$prshcount1 ceil((($prwidth1-$width)/($width+$between) + 1)*$prcount1*($shtype+1)); //
  
$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>',
  );

  

$form['step2']['header'] = array(
    
'#markup' => '<h2>Итог:</h2>',
  );

  

$form['step2']['sum2'] = array(
    
'#type' => 'textfield',
    
'#value' => number_format($price_all2','' '),
    
'#attributes' => array('class' => array('result_input'), 'readonly' => 'readonly''title'=>"( ($prwidth1-$width) / ($width+$between) + 1) * $prcount1 * ($shtype+1) * $upper/1000 * $prices[$product_id]"),
  );

  

$form['step2']['inner'] = array(
    
'#type' => 'container',
    
'#prefix' => '<div id="calc-step2-inner" class="clearfix">',
    
'#suffix' => '</div>',
  );

  

$form['step2']['inner']['serial2'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Серия:</div><div class="result">'.$serial_opts[$serial].'</div></div>',
  );

  

$form['step2']['inner']['product2'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Покрытие:</div><div class="result">'.$names[$product_id].'</div></div>',
  );

  

$form['step2']['inner']['shtype2'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Вид:</div><div class="result">'.$types[$shtype].'</div></div>',
  );

  

$form['step2']['inner']['upper2'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Высота, мм</div><div class="result">'.$upper.'</div></div>',
  );

  

$form['step2']['inner']['prwidth12'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Ширина, мм</div><div class="result">'.$prwidth1.'</div></div>',
  );

  

$form['step2']['inner']['prcount12'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Количество, шт</div><div class="result">'.$prcount1.'</div></div>',
  );

  

$form['step2']['inner']['between2'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">999</div><div class="result">'.$between.'</div></div>',
  );

  

$form['step2']['inner']['prshcount12'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Количество 666, шт</div><div class="result">'.$prshcount1.'</div></div>',
  );

  

$form['step2']['inner']['prmpcount12'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Количество 999, п.м.</div><div class="result">'.$prmpcount1.'</div></div>',
  );

  

$form['step2']['inner']['price2'] = array(
    
'#markup' => '<div class="clearfix"><div class="labell">Цена, руб.</div><div class="result">'.$prices[$product_id].'</div></div>',
  );

  

$form['step2']['submit2'] = array(
    
'#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'];
  }
}
?>
Аватар пользователя gun_dose gun_dose 30 сентября 2016 в 14:20

<?php$product_id = custom_calc_get_value($form, $form_state, 'product');?>
И потом после этого везде, где есть $product_id, выдаёт нулевой индекс

Аватар пользователя alexingloire alexingloire 30 сентября 2016 в 15:55

Если убрать фунцкию unserialize, то такая ошибка Sad

<?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).?>

Аватар пользователя fairrandir fairrandir 30 сентября 2016 в 16:34
1

Кстати о птичках, длина в serialize указывается в байтах. Кодировка - UTF-8, на русские буквы идёт два байта.
Удалили букву х - вычли из 101 2. Удалили скобку, цифру или латинскую букву - вычли 1.
Почему после того, как убрали unserialize - ошибка - это потому что, у variable_set serialize тоже убрать надо в этом случае.
Вручную править сериализованные данные - тоже гнилое дело.

Аватар пользователя alexingloire alexingloire 30 сентября 2016 в 16:49

Спасибо большое! Теперь все редактируется Smile А как-то можно упростить этот процесс, чтобы вручную не считать байты сериализации?

Аватар пользователя alexingloire alexingloire 30 сентября 2016 в 17:57

По этому адресу то, что на скрине (при правах администратора) ибо в модуле не предусмотрено создание страницы в админке для управления значениями. Так что сижу и считаю байты Smile

Аватар пользователя fairrandir fairrandir 30 сентября 2016 в 18:13
1

В функции custom_calc_menu параметр 'access arguments' поменять на TRUE, очистить кэши, посмотреть, доступна ли страница.
Если да, то поменять на что-нибудь типа array('administer site configuration').

Поясняю - по умолчанию такого пермишна не существует. Нет пермишна - нет прав на доступ - правите ручками в базе.
Поэтому проверяем, работает ли страница, если доступ для всех. Если да - меняем на тот, который точно существует, и доступен только админситраторам.
Или же делаем в том же модуле имплементацию hook_permission. Но проще как выше.

Аватар пользователя alexingloire alexingloire 30 сентября 2016 в 18:40

Навели меня на мысль! Я дописал в форме функции calc_menu 'access callback' => TRUE, почистил кэши и по нужному нам адресу появилась форма редактирования переменных. Теперь все работает как часы! Спасибо!