Где лучше хранить php\html для послед обработки.. в файле или БД?

Привет ребята, возникла необходимость сохранять смешанный php - html, который вводится в веб-редакторе кода ACE, который должен быть считан (в строку) и выполнен (при помощи eval() ) внутри основного скрипта (контроллера). Вопрос.. где лучше всего хранить такой код? Я скланяюсь к хранению в файлах (txt или php ) .. подскажите как поступит?

Спасибо!
 

Фанат

oncle terrible
Команда форума
Эту "необходимость" надо разникнуть.

Вопрос из серии "тут понадобилось динамит дома хранить, не знаю где лучше - в шкафчике над плитой, или в электрощиток положить. Я склоняюсь к хранению в электрощитке."
 
фанат, я могу вам показать воочию чем я сейчас занимаюсь и что мне конкретно нужно.. я дам вам пароль и доступ к платформе.. вы увидите упражнения о которых речь.. и если вам не тяжело подскажите как лучше поступить. Мне нужно динамически создавать упражнения, включать их в разные уроки и все это делать из админки.. я прекрасно понимаю, что из админки создавть пхп код и хранить его или в файле или в БД это плохое решение.. но это все будет делать только один человек.. или я или какой-то другой разработчик которого наймут после меня.. обычные пользователи(студенты будут видеть у себя в аккаунте только готовые упражнения.. и никаких манипуляций с кодом именть не будут.)

В любом случае спасибо вам за ваш ответ и проявленное внимание!
 

Adelf

Administrator
Команда форума
@Юрий Вакуленко, проблема у тебя в том,что этот код нельзя выполнять в своем контроллере. Он должен выполняться в песочнице, где этот код ничего не испортит.

@Фанат, выстрел мимо :)
 
@Adelf, ок. Понимаю. Но как создать эту песочницу в которой будет выполнятся такой код и безопасно защитится от злоумышленников? Вы можете подсказать.. может есть какая-то для этого библиотека-обертка, которую можно легко подключить к проэкту и через нее выполнять такой код?

я так понимаю мне необходимо выполнять такой код через Runkit?
http://php.net/manual/ru/runkit.sandbox.php

т.е. мне этот динамит нужно взорвать(выполнить безопасно) вне дома в песочнице, сформировать строку как результат выполнения и потом эту строку передать в контроллер и контроллер вставит эту строку в контент урока. Я правильно написал алгоритм?

Но мне в песчнице придется обращаться к БД.. получать\записывать некоторую информацию.. (результаты прохдения упражнения, оценку, дату прохождения, правильные и неправильные ответы, и т.д. но это не будет пхп код, а строки или числа.. максимум - строка в формате JSON) Из песочницы же можно достучатся до БД?
 
Последнее редактирование:

antson

Новичок
Партнер клуба
хмм, как вариант

контролер должен проверить пришедший код от посетителя.
его правильность это совпадение вывода.

сохраняем код во временное место.
например в табличку id,code

дальше делаем curl запрос на codecheck.php?id=xxxx

в кодечекере
всего несколько строк.
$code = получить из базы по ид от имени учетки муськи с правами только на чтение этой таблички
echo eval($code);

контролер результат курла сравнит с эталоном

скрипт можно вынести на субдомен и задавить там все что можно.
как минимум open_base.

про suhosin слышали ?
 
контролер должен проверить пришедший код от посетителя.
его правильность это совпадение вывода.
Совпадение вывода с чем? с чем его проверять? У меня для упражнений может быть самый разный пхп код, что будет формировать их разметку в тексте урока.. я совсем не понимаю, как я могу проверить допустимый ли код там написали!

контролер результат курла сравнит с эталоном
Что брать за эталон? как его определить этот эталон?

скрипт можно вынести на субдомен и задавить там все что можно.
Задавить там все что можно.. это как и что для этого подавления необходимо сделать?

про suhosin слышали
Ранее не слышал. только что прогуглил и оказалось что это модуль для ПХП что позволяет улучшить безопасность на сайте за счет контроля над некоторыми возможностями PHP.
 
Скриншот 19-11-2018 015441.jpg Хочу привести вам пример php-html кодя для упражнения что должен динамически вставлятся в текст урока. чтобы вы хоть немного понимали о чем речь. И такой код нужно вводить в админке, сохранять его (в файле или БД) а потом передавать на выполнение (в песочницу, которая потом окончательную строку с HTML кодом упр. передаст в контроллер и контроллер передаст это все в материал урока.. )
Это код упражнения (сейчас он хранится в отдельных ПХП файлах.)
PHP:
<?php
$user_unwers = $data['sub_courses']['user_unswers'];
$is_exercise_submited = $user_unwers['exercise_submited'];
$all_valid_unswers = $user_unwers['all_valid_unswers'];
$right_unswers = $user_unwers['right_unswers'];
$right_unswers_values = $user_unwers['right_unswers_values'];
$wrong_unswers = $user_unwers['wrong_unswers'];
$count_right_unswers = $user_unwers['count_right_unswers'];
$path_lesson_imgs = URI_MEDIA.'/img/course_starter/less3/';
$path_lesson_audio = URI_MEDIA.'/audio/course_starter/less3/';
$path_lesson_download = URI_MEDIA.'/download/course_starter/less3/';
$path_course_download = URI_MEDIA.'/download/course_starter/';
$path_lesson_grammatic_tables = URI_MEDIA.'/img/good_gramm_tables/';
$lesson_id = $data['sub_courses']['lesson_id'];
$course_id = $data['sub_courses']['course_id'];
<?php
      // Ex1
        $ex_id = 1;
        ?>
      <form action="<?php echo url().'#ex'.$ex_id ?>" name="exercise_form" method="post">
          <a name="<?php echo 'ex'.$ex_id ?>"></a>
          <div class="flex_block exercise_heading">
              <div>
                  <p class="exercise_title">Übung <?php echo $ex_id ?>.</p>
                  <p class="excercise_descr1">Informationen über Menschen.</p>
                  <p class="excercise_descr2">Was gehört zusammen? Bitte hören Sie.</p>                                 
              </div> 
              <?php echo build_audio_list(array(11),$path_lesson_audio); ?>                                                                   
          </div>
          <?php if ($is_exercise_submited) {
              echo build_exercises_msgs($ex_id, $count_right_unswers, $all_valid_unswers);
          } ?> 
 
          <div class="exercise_content <?php echo 'ex'.$ex_id ?>">
              <?php $ex1_data = array(
                  array(                   
                      'data'=>array(
                          array(                           
                              array(
                                  '<b>1.</b> Frau Hanneman ',
                                  array('key'=>1, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][1],required,size=2,maxlength=2,value=b,readonly') 
                              ),
                              array(
                                  '<b>2.</b> Herr Schmidt ',
                                  array('key'=>2, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][2],required,size=2,maxlength=2') 
                              ),
                              array(
                                  '<b>3.</b> Thomas ',
                                  array('key'=>3, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][3],required,size=2,maxlength=2') 
                              ),
                              array(
                                  '<b>4.</b> Frau Meier ',
                                  array('key'=>4, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][4],required,size=2,maxlength=2') 
                              ),
                              array(
                                  '<b>5.</b> Paul ',
                                  array('key'=>5, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][5],required,size=2,maxlength=2') 
                              ),
                              array(
                                  '<b>6.</b> Familie Steinhäuser ',
                                  array('key'=>6, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][6],required,size=2,maxlength=2') 
                              ),
                              array(
                                  '<b>7.</b> Katja ',
                                  array('key'=>7, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][7],required,size=2,maxlength=2') 
                              ),
                              array(
                                  '<b>8.</b> Lisa ',
                                  array('key'=>8, 'options'=>array(), 'input'=>'[input]:name=answers[ex'.$ex_id.'][8],required,size=2,maxlength=2') 
                              )                      
                          ),
                          array(                           
                              array('<b>a)</b>. kommt aus Zürich.'    ),
                              array('<b>b)</b>. arbeitet in Hamburg.'    ),
                              array('<b>c)</b>. ist Deutsche.'),
                              array('<b>d)</b>. ist arbeitslos.'    ),
                              array('<b>e)</b>. wohnt in München.'    ),
                              array('<b>f)</b>. geht noch zur Schule.'    ),
                              array('<b>g)</b>. ist verheiratet.'    ),                           
                              array('<b>h)</b>. ist zehn Jahre alt.'    ),                           
                          ),
                      )
                  )
                  ); ?>
                  <ul class="w100 ptable">
                      <?php foreach ($ex1_data as $ex1_row) {?>
                          <li>                           
                              <div class="w100">                           
                                  <?php $md_class = (count($ex1_row['data']) > 1) ? ' w100 ptable flex_block flex_align_items_fl_start flex_align_items_stretch' : '';
                                  $md_w_class = (count($ex1_row['data']) > 1) ? ' w48' : '';
                                  ?>
                                  <div class="main_data <?php echo $md_class; ?>">
                                      <?php foreach ($ex1_row['data'] as $ex1_row_col) {?>
                                          <div class="<?php echo $md_w_class ?>">
                                              <?php foreach ($ex1_row_col as $ex1_row_col_subrow) {?>
                                              <p class="input_p">
                                                  <?php if (is_string($ex1_row_col_subrow)) { echo $ex1_row_col_subrow; }
                                                  else if (is_array($ex1_row_col_subrow)) {
                                                      foreach ($ex1_row_col_subrow as $input) {
                                                          if (is_string($input)) { echo $input;}
                                                          else if(is_array($input)) {
                                                              $ex_key = $input['key'];
                                                              $right_unswers_class = get_right_unswer_class($right_unswers, $all_valid_unswers,$ex_id,$ex_key);
                                                              // раставляем Input Value при проверке упражнений                                       
                                                              $input_options = (isset($right_unswers_values[$ex_id][$ex_key])) ? array_merge($input['options'], array('value'=>$right_unswers_values[$ex_id][$ex_key]) ) : $input['options']; 
                                                              echo '<span class="'.$right_unswers_class.'">';
                                                              echo build_input($input['input'],',',$input_options);
                                                              echo '</span>';
                                                          }                                                       
                                                      }
                                                  } ?>
                                              </p>                                               
                                              <?php } ?>                                           
                                          </div>
                                      <?php } ?> 
                                  </div>
                              </div>
                          </li>
                      <?php } ?>
                  </ul>
           
              <?php echo get_submit_btn_exercises('Выполнить'); ?>
          </div>
          <?php echo get_hidden_inputs_exercises($ex_id,$lesson_id,$course_id,csrf_token()); ?>
      </form>
Все функции что в этом коде - это внешние пользовательские функции, что тоже должны быть корректно выполнены в песочнице. Как я говорил в песочнице должны так же записыватся некоторые данные в БД. Так же в песочницу нужно будет передавать $_POST контроллера с ответами, что дают студенты при выполнении упражнения.

Простите что загрузил вас.. но я хочу разобратся и безопасно выполнять код упражнения, что будет вводится через админку при редактировании упражнения.
 

ksnk

прохожий
Не! Похоже Фанат не промахнулся :)
 
Последнее редактирование:

ksnk

прохожий
@Юрий Вакуленко, вопрос. ВСЕ ли упражнения представляют из себя подобные формы ? Есть ли в этих формах php код, который обязан отредактировать испытуемый, или весь код так или иначе пишется программистом ?
 
@Юрий Вакуленко, вопрос. ВСЕ ли упражнения представляют из себя подобные формы ? Есть ли в этих формах php код, который обязан отредактировать испытуемый, или весь код так или иначе пишется программистом ?
Да, все упражнения - это подобные формы. (я вам привел одну из самых простых форм упржнения. но все они написаны по одному шаблону. Разные в них массивы с данными и пхп код циклов, который правильно строит разметку на основе массива с данными) В этих формах НЕТУ И НЕ ДОЛЖНО БЫТЬ НИКАКОГО КОДА ЧТО МОЖЕТ РЕДАКТИРОВАТЬ КЛИЕНТ! Код упражнений пишет программист. Один! И он должен его писать через веб-интерфейс в админке и сохранять в файлах или в БД. чтобы этот код был динамически обработан и вставлен в метриал урока.

вот вам пример более сложного кода для упражнения
PHP:
<?php
      // Ex1
        $ex_num = 1; // Порядковый Номер упр в уроке
        $db_ex_id = $add_exform_hinputs['db_exercise_id'] = 1; // ID упражнения в БД       
        // ---------------
        $ex_params = array(
            'user_id'=>$data['sub_courses']['user_id'],
            'course_id'=>$course_id,
            'lesson_id'=>$lesson_id,
            'exercise_id'=>$db_ex_id // ID упражнения в БД
        );
        //---------------
        // получаем данны об упр из БД. ((не)завершено\оценку\(не)правильные ответы\кол-во оставшихся попыток прохождения и т.д. т.е статистику по упр.)
        $db_less_ex_data = get_db_lesson_exercise_data($ex_params);
        // На основе этой статистики будет (не)разрешено отправдять упражнение и считать упр. (не)выполненным и показывать оценку за упражнение.
        // --------------
        $ex_heading = array(
              'ex_num'=>$ex_num,
              'descr1'=>'Was hören Sie? Kreuzen Sie an.',
              'descr2'=>array(),
              'audio'=>array(
                  'files'=>array(2),
                  'path'=>$path_lesson_audio
              ),
              'is_finished'=>$db_less_ex_data['is_finished'],
              'score'=> ($db_less_ex_data['is_finished']) ? $db_less_ex_data['score'] : null,
              'count_mistakes' => ($db_less_ex_data['is_finished']) ? $db_less_ex_data['count_mistakes']  : null
          );
        
        $add_exform_hinputs['remaining_attempts'] = (empty($db_less_ex_data)) ? $exercise_max_attempts : $db_less_ex_data['remaining_attempts'];        
        ?>
      <form action="<?php echo url().'#ex'.$ex_num ?>" name="exercise_form" method="post">
          <a name="<?php echo 'ex'.$ex_num ?>"></a>     

          <?php echo build_exercise_heading($ex_heading) ?>

          <?php
          $d_scripts = array(
              'script_ex'.$ex_num.'_01.jpg' => 'Скрипт к диалогу'
          );
          $d_s_groop = $lesson_id.'_ex'.$ex_num;
          echo build_dialod_scripts_link($d_scripts,$path_lesson_imgs,$d_s_groop);  ?>

          <?php if ($is_exercise_submited) {
              // Когда форма отправлена
              // формирует сообщения Сколько человек сделал ошибок или он дал все правильные ответы
              echo build_exercises_msgs($ex_num, $count_right_unswers, $all_valid_unswers);
           } ?>           
    

          <div class="exercise_content <?php echo 'ex'.$ex_num ?>">
              <?php
              // Массив с данными упражнения 
              $ex1_data = array(
                  array('','Norddeutschland','Süddeutschland','Österreich','Schweiz'),
                  array(
                      'Salü!',
                      array('options'=>array(), 'key'=>1,'value'=>'1','input'=>'[input]:name=answers[ex'.$ex_num.'][1][],type=checkbox,value=1'),
                      array('options'=>array(), 'key'=>1,'value'=>'2','input'=>'[input]:name=answers[ex'.$ex_num.'][1][],type=checkbox,value=2'),
                      array('options'=>array(), 'key'=>1,'value'=>'3','input'=>'[input]:name=answers[ex'.$ex_num.'][1][],type=checkbox,value=3'),
                      array('options'=>array(), 'key'=>1,'value'=>'4','input'=>'[input]:name=answers[ex'.$ex_num.'][1][],type=checkbox,value=4')
                  ),
                  array(
                      'Moin!',
                      array('options'=>array(), 'key'=>2,'value'=>'1','input'=>'[input]:name=answers[ex'.$ex_num.'][2][],type=checkbox,value=1'),
                      array('options'=>array(), 'key'=>2,'value'=>'2','input'=>'[input]:name=answers[ex'.$ex_num.'][2][],type=checkbox,value=2'),
                      array('options'=>array(), 'key'=>2,'value'=>'3','input'=>'[input]:name=answers[ex'.$ex_num.'][2][],type=checkbox,value=3'),
                      array('options'=>array(), 'key'=>2,'value'=>'4','input'=>'[input]:name=answers[ex'.$ex_num.'][2][],type=checkbox,value=4')
                  ),
                  array(
                      'Grüß Gott!',
                      array('options'=>array(), 'key'=>3,'value'=>'1','input'=>'[input]:name=answers[ex'.$ex_num.'][3][],type=checkbox,value=1'),
                      array('options'=>array(), 'key'=>3,'value'=>'2','input'=>'[input]:name=answers[ex'.$ex_num.'][3][],type=checkbox,value=2'),
                      array('options'=>array(), 'key'=>3,'value'=>'3','input'=>'[input]:name=answers[ex'.$ex_num.'][3][],type=checkbox,value=3'),
                      array('options'=>array(), 'key'=>3,'value'=>'4','input'=>'[input]:name=answers[ex'.$ex_num.'][3][],type=checkbox,value=4')
                  ),
                  array(
                      'Servus!',
                      array('options'=>array(), 'key'=>4,'value'=>'1','input'=>'[input]:name=answers[ex'.$ex_num.'][4][],type=checkbox,value=1'),
                      array('options'=>array(), 'key'=>4,'value'=>'2','input'=>'[input]:name=answers[ex'.$ex_num.'][4][],type=checkbox,value=2'),
                      array('options'=>array(), 'key'=>4,'value'=>'3','input'=>'[input]:name=answers[ex'.$ex_num.'][4][],type=checkbox,value=3'),
                      array('options'=>array(), 'key'=>4,'value'=>'4','input'=>'[input]:name=answers[ex'.$ex_num.'][4][],type=checkbox,value=4')
                  )                 
              ); ?>

              <ul class="w100 ptable">
                    <?php // Формируем разметку упр. на основе массива с данными для упр. ?>
                  <?php foreach ($ex1_data as $ex1_i1 => $ex1_row) {
                      $ex_key = $ex1_i1;
                        $li_right_unswer_class = get_right_unswer_class($right_unswers,$all_valid_unswers,$ex_num, $ex_key);
                      ?>                     
                      <li class="flex_blockflex_align_items_fl_start flex_align_items_stretch <?php echo $li_right_unswer_class ?>">
                          <?php foreach ($ex1_row as $ex1_i2 => $ex1_subrow) {
                              $b_width = ($ex1_i2 > 0) ? ' w20' : ' w15';
                              $ta_class = ($ex1_i2 > 0) ? ' text_align_center' : ''; ?>
                              <div class="<?php echo $b_width ?>">
                                  <p class="item_p <?php echo $ta_class ?>">
                                      <?php
                                      if (is_string($ex1_subrow)) {echo $ex1_subrow; }
                                      else if (is_array($ex1_subrow)) {
                                          $input_options = array();
                                          // раставляем атрибут Checked при проверке упражнений
                                          if (isset($right_unswers_values[$ex_num][$ex_key])) {

                                              if (is_array($right_unswers_values[$ex_num][$ex_key])) {                                                 
                                                      foreach ($right_unswers_values[$ex_num][$ex_key] as $r_unsw) {
                                                          if ($r_unsw == $ex1_subrow['value']) {
                                                              $input_options = array('checked'=>1);       
                                                          }
                                                      }
                                              } else {
                                                  $input_options = ($right_unswers_values[$ex_num][$ex_key] == $ex1_subrow['value']) ? array('checked'=>1) : array();       
                                              }   
                                          }

                                            echo build_input($ex1_subrow['input'],',',$input_options,0);
                                          
                                      }
                                      ?>
                                  </p>                                 
                              </div>
                          <?php } ?>
                      </li>
                  <?php } ?>
              </ul>
              
              <?php echo get_submit_btn_exercises('Выполнить'); ?>
          </div>

          <?php echo get_hidden_inputs_exercises($ex_num, $lesson_id, $course_id, csrf_token(),$add_exform_hinputs); ?>
      </form>
 

ksnk

прохожий
Надо сделать так, чтобы составитель тестов работал с шаблонами какого-то шаблонизатора. К примеру - смарти. Там, в случае острой необходимсти поговнокодить - можно вставлять php код и как-то более менее его зашорить, чтобы совсем уж не грохнуть сервер сдуру. Все поля ввода и возможные значения можно определять с помощью переопределения фильтров и шаблонов смарти. В комплекте получится сигнализация о точке ошибки в случае опечаток...
Как - нибудь так может выглядеть.
Код:
1. Ваш любимый цвет - {input data=$prefere_color variant=['white','black']}<br>
2. Ваш любимый размер -
При парсинге шаблона input, в отдельное место сохраняем возможные ответы и в результатах формы их отлавливаем. Так можно на каждый тест получить единственный шаблон, не размазываясь мыслию по файлам системы...

p.s. с массивами с смарти что-то невесело... но можно и так
{include file="Foo.tpl" arg=","|explode:"one,two,three"}
 
ребята... вот платформа которую я сейчас делаю. Это Онлайн платформа изучения немецкого языка. langguard.com . Это не сайт-песочница (@antson, которые вы привели в примерах), где каждый может написать свой пхп код проверить его работу! Клиент там не пишет никакого пхп кода! Это просто сайт изучения немецкого языка, где клиенты - только смотрят (не имея возм. ничего редактировать и проходят) тот материал который им дает препод.. а препод пишет мне .. что и как и куда добавить.. редактирует код только один программер.. в данном случае я или тот который будет после меня.

зайдите плиз на langguard.com с учеткой
Логин [email protected]
пароль lg_elena777

Зайдите в раздел КУРСЫ - Курс Перезагрузка и выберите урок "Еда. Урок 5" (можно выбрать любой урок..) вы увидите там кучу упражнений.. вот код которых и должен динамически формироваться из файла или БД при помощи шорткодов о которых написал ниже.

Выполните к примеру Übung 4 из "Еда. Урок 5" Вот вам правильные ответы. Вставляйте в поля для ввода по порядку. И вы выполните правильно упр. Допустите ошибки в ответах и выполните и вы увидите как подсветятся поля с прав ответами. Вот таким образом все должно работать.. Но код, пхп код , что формирует эти упражнения должен браться динамически из файлов или БД. Сейчас он тупо берется из локального php скрипта урока.. что не дает возможности из админки менять порядок упражнений, снимать их с публикации, вставлять в разные уроки динамически и т.д.

Правильные ответы
PHP:
'ex4'=> array(
            1=>'keine',
            2=>'welche',
            3=>'einen',
            4=>'eins',
            5=>'keins',
            6=>'eine'           
        )


Вы зайдете в кабинет студента. Но там есть и кабинет Админа.. куда имеет доступ один человек. Вот в кабинете админа - админ (разработчик) будет писать подобный пхп код (что привел 3мя постами выше) для упражнения (через веб-форму используя ACE code editor) и этот код и должен сохранятся в файлах или в БД и потом динамически вставлятся в материалы урока при помощи шорткодов

Код:
[build_exercise:id=23;num=2]
который будет обработан контроллером урока и контроллер будет искать в файлах или в БД пхп код для упражнения с id=23 и запускать его на выполнение чтобы получить строку с HTML кодом упражнения которая передается в Представление и таким образом в контенте урока появляется онлайн упражнение. num=2 - это порядковый номер упражнения внутри урока. Если же ПХП код для упр с id=23 не будет найден, то в Представление уйдет строка с Ошибкой - Упражнение не найдено! Как я и писал выше в пхп коде должны быть корректно исполнены все внешние функции. Потому как когда клиент выполнит упр. результаты сохранятся в БД и упражнение будет считаться выполненным, назначена оценка и пропишутся правильные и не правильные ответы.

Надеюсь теперь - все понятно написал.. ну пытался все вам по полочкам расставить. Чтобы четко понимали что мне нужно и для чего.
 
Так можно на каждый тест получить единственный шаблон, не размазываясь мыслию по файлам системы...
Не выйдет получить один шаблон! Так как все упражнения разные а не однотипные! пройдитесь по представленым упр в платформе и вы поймете, почему для них нужен разный код.. я думал использовать шаблонизатор .. смарти в том числе.. но УПРАЖНЕНИЯ ИМЕЮТ РАЗНУЮ РАЗМЕТКУ КОНТЕНТА и массив с данными разный. Поэтому нельзя составить один шаблон!
 

ksnk

прохожий
Не один шаблон, по одному шаблону для каждого теста. В тексте шаблона и сам текст и варианты ответов. Когда текст выводится - варианты ответов игнорируются, когда анализируется - варианты ответов достаются из загашника и проверяются.
 

Adelf

Administrator
Команда форума
Эх. Таки это я промахнулся :)
но УПРАЖНЕНИЯ ИМЕЮТ РАЗНУЮ РАЗМЕТКУ КОНТЕНТА и массив с данными разный. Поэтому нельзя составить один шаблон!
Можно. Разные типы вопросов. У каждого вопроса - свой шаблон. Их просто надо красиво комбинировать. Поверь опытным людям: твой подход с eval php - чудовищно неправильный.
 
  • Like
Реакции: pr1
@ksnk, мне нужно сделать около 5000 онлайн упражнений в платформе. т.е. вы предлагаете создавать отдельный шаблон для каждого упражнения.. это будет более 5000 шаблонов. И в этот шаблон и пихать разметку упражнения .. но мне то еще нужно и БД записывать ответы студентов и из БД их получать и в зависимости от этого тоже нужно изм разметку упражнения

Я понимаю, что эти 5000 упр нужно разбить на типы.. это будет более 200 типов упр.
и тогда для каждого типа упр. назначать свой шаблон..

Насчет шаблонизатора. У меня используется standalone шаблонизатор Blade из Laravel. (https://github.com/jenssegers/blade) выбрал его потому как он поддерживает чистый ПХП в своих шаблонах! У меня нет желания изучать еще и синтаксисы шаблонизаторов..
 
Последнее редактирование:

ksnk

прохожий
Сейчас у тебя 5000 файлов php, с тестами а будет 5000 шаблонов. Что тебя смущает ? Шаблон не как "шаблон" в абстрактном смысле этого слова ;) , а как просто хранилище самого текста теста и его данных
 
@ksnk, понятно.. так и поступлю.. я ведь могу использовать мой текущий шаблонизатор Blade ?.. лучше на чистом пхп писать код в шаблоне чем использовать синтаксис шаблонизатора.
 
Сверху