Добавление полей на лету

#1 5 апреля 2021 в 09:46
Привет. Собственно сабж. Компонент.
frontend.php
  1.  
  2. public function getTestForma() {
  3. $form = $this->getForm('comunal');
  4. return $form;
  5. }
  6. public function AddFields(){
  7. $id = $this->request->get('id');
  8. $dacha_fields = array('water'=>0.00,'rent'=>0.00,'target'=>0.00);
  9. foreach ($dacha_fields as $key=>$name) {
  10. if($key){
  11. $big_word = strtoupper($key);
  12. $fields[] = new fieldNumber($key, array(
  13. 'title' => LANG_TEST_FIELD_.$big_word,
  14. ));
  15. }
  16. }
  17. return $fields?$fields:'';
  18. }
Файл формы компонента

  1.  
  2. public function init() {
  3. $fields = $this->controller->AddFields();
  4. if(is_array($fields)){
  5. return array(
  6. 'basic' => array(
  7. 'title' => LANG_TEST_OPTIONS_COMUNAL,
  8. 'type' => 'fieldset',
  9. 'childs' => $fields,
  10. )
  11. );
  12. }else{return array();}
Поля выводятся.Но.Первая проблема.
Не читается текстовая переменая LANG_TEST_FIELD_.$big_word
Notice: Use of undefined constant LANG_TEST_FIELD_
var_dump ($big_word) — то, что и должно быть. Строка с названием поля в верхнем регистре.
Если подставляю вместо переменой $big_word слово, то читает как надо.
print_r($fields)

  1.  
  2. (
  3. [0] => fieldNumber Object
  4. (
  5. [title] => LANG_TEST_FIELD_WATER
  6. [sql] => DECIMAL({decimal_m},{decimal_d}) {unsigned} NULL DEFAULT NULL
  7. [filter_type] => int
  8. [name] => water
  9. [element_name] => water
  10. [filter_hint] =>
  11. [element_title] => LANG_TEST_FIELD_WATER
  12. [is_public] => 1
  13. [cache_sql] =>
  14. [allow_index] => 1
  15. [is_denormalization] =>
  16. [item] =>
  17. [request] =>
  18. [field_id] => 0
  19. [is_virtual] =>
  20. [is_hidden] =>
  21. ...
  22.  
  23. )
  24.  
Вопрос почему не читает?
#2 5 апреля 2021 в 09:55
А где вы объявили эту переменную? В лэнгах компонента? Файл с ленгами полей надо ложить в корень папки system/languages/ru или другого языка. Либо в методе __construct грузить лэнги нужного контроллера.
#3 5 апреля 2021 в 10:00

А где вы объявили эту переменную?

Loadырь
В лэнгах компонента. Я же написал, что она читается, если слово явно прописать, а не через переменую.
#4 5 апреля 2021 в 10:16
Ааа, вы соединили две строковые переменные и хотите чтобы система думала, что это одна переменная?
#5 5 апреля 2021 в 10:19
Попробуйте тогда так, хотя не уверен
  1. LANG_TEST_FIELD_{$big_word}
#6 5 апреля 2021 в 10:30
Ааа, понятно. Это решаемо?..
#7 5 апреля 2021 в 10:32

Попробуйте тогда так, хотя не уверен

Loadырь
Так пробовал.Не работает.
#8 5 апреля 2021 в 10:43

Это решаемо?.

Lora
Смотря что вы хотите в итоге? Есть функция eval() в php. Есть sprintf() — позволяет передавать в переменную другие переменные и выводить в нужном формате.
#9 5 апреля 2021 в 10:52
Lora, покажите ваш define для LANG_TEST_FIELD_
Что у вас в $big_word ?
Напишите строку которую вы хотите получить после LANG_TEST_FIELD_.$big_word
#10 5 апреля 2021 в 11:01
Понятно. Спасибо, что нибудь придумаю. Важней другое.
При отправке формы на сервер всё слетает. Целая куча Warning-ов. Думаю дело в последнем, остальные следствия
  1. Warning: array_slice() expects parameter 1 to be array, boolean given in ....// Тут исходный массив во фронтеде
  2.  
  3. Warning: Invalid argument supplied for foreach() in ..
  4.  
  5. Notice: Undefined variable: fields in ..
  6.  
  7. Warning: mysqli::real_escape_string() expects parameter 1 to be string, array given in...// тут тоже самое с сылкой на файлы ядра
  8.  
  9. Warning: Invalid argument supplied for foreach() in...//
  10.  
  11. Warning: Cannot modify header information - headers already sent by .. // тут ругается на всё))).
Попробовал обернуть в методе AddFields всё в ob_start(); Ошибки пропали, но и обработка формы перестала работать.
#11 5 апреля 2021 в 11:03
@IamB, Суть проблемы Loadырь, объяснил.
#12 5 апреля 2021 в 11:12
Lora, ну если вам понятен смысл проблемы, то в чем дело-то?
Вы навалили кучу не относящегося к вашему вопросу кода, зачем?
#13 5 апреля 2021 в 11:15
Тут скорее проблема в первом

Warning: array_slice() expects parameter 1 to be array, boolean given in ....// Тут исходный массив во фронтеде

Lora
Остальное следствия.

Исходный массив у вас пустой и вы пытаетесь его обработать функцией array_slice. Остальные тоже — использование данных которых нет в пустом массиве.
#14 5 апреля 2021 в 11:21
Loadырь
, смысл ошибок понятен. Но почему он превращается в пустой?
Даже не так. Почему этот метод вообще вызывается при сабмите?
#15 5 апреля 2021 в 11:26

Lora, ну если вам понятен смысл проблемы, то в чем дело-то?

@IamB
Ни в чём. Решаю вопросы дальше. А у вас, что за проблемы, что вы дерзить начинаете?
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.