Транспонирование размещенных множественных массивов в стиль insert_batch для codeigniter - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь создать многоязычную форму с Codeigniter.

У меня есть массив POST:

Array
(
  [title] => Array
    (
        [en] => English Title
        [de] => German Title
    )

  [url] => Array
    (
        [en] => English URL
        [de] => German URL
    )
)

Я хочу преобразовать это в кодовый код insert_batch('tablename',$data) в формате:

Array
(
  [0] => Array
    (
        [lang] => en
        [title] => English Title
        [url] => English URL
    )

  [1] => Array
    (
       [lang] => de  // Assuming user didn't fill `_de` labeled input fields.
       [title] => 
       [url] =>
    )
) 

Данные для хранения в БД:

|id|lang|    title      |    url      |
|--|----|---------------|-------------|
|  | en | English Title | English URL |
---------------------------------------

Как мне этого добиться? Мне нужно переместить массив записей в стиль массива данных insert_batch. Выше array[1] содержит только предопределенные lang как de. Так что «1017» буквально для меня пусто. Поэтому мне также нужно удалить пустые массивы из окончательного $data.

Ниже вы найдете файл просмотра.

<div id="tabs">
  <?php echo form_open('controller/post_target',array('name'=>'add_page')); ?>
  <ul>
    <?php foreach($lang_data as $r):?>
    <li><a href="#tab_<?=$r->lang;?>"><?=$r->name;?></a></li>
    <?php endforeach; ?>        
  </ul>

  <?php foreach($query_lang as $r):?>
  <div id="tab_<?=$r->lang;?>">
    <?php echo form_label('Page Title','title'); ?>
    <?php 
      $attr1 = array('name' => 'title[' . $r->lang . ']');
      echo form_input($attr1); 

      $attr2 = array(name' => 'url[' . $r->lang . ']');
      echo form_input($attr2); 
    ?>
  </div>
  <?php endforeach; ?>
    <?php echo form_submit('submit','Save'); ?>
  <?php echo form_close(); ?>
</div>

Просто для информации, я поцарапал несколько строк в качестве контроллера, но я хочу иметь контроллер с чистой кодировкой по этому поводу. Также моя версия не может проверить это, если массив пуст. :( Любой совет для более профессионального способа приветствуется.

<code>if($this->input->post('submit'))
{
  $data = $this->input->post();
  unset($data['submit']); // SELF NOTE : IT should be easier way to do this   

  foreach ($data as $key => $value)
  {
    $counter = 0;
    foreach ($value as $key_inner => $value_inner)
    {
      if( ! isset($db_array[$counter])) $db_array[$counter] = array();
      //Above line enable us to use '+=' operand below in foreach loop

      $db_array[$counter] += array(
          'lang' => $key_inner,
          $key => $value_inner
      );          
      $counter ++;
    }
  }

  //echo '<pre>'; print_r($db_array); echo '
'. '
'; if ($ this-> db-> insert_batch ('test', $ db_array)) echo 'запись сохранена'; }

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Я думаю, вы можете сделать подобное:

$langs = array_keys($post["title"]);
$batch = array();
foreach ($langs as $lang) {
      $tmp = array();
      $tmp["title"] = $post["title"][$lang];
      $tmp["url"] = $post["url"][$lang];
      $batch[] = $tmp;
}

Не проверено и не проверяет никаких ошибок в постструктуре.

0 голосов
/ 15 февраля 2012

Вы можете создать некоторые функции для этого.Поскольку свойство lang имеет особое поведение (не то же самое, что заголовок или URL), я думаю, что было бы лучше определить языки в массиве.

Ниже я создаю две функции, первая из которых преобразуетвходные данные в формате, необходимом для пакетной вставки, а вторая удаляет пустые строки (lang следует игнорировать, так как она будет всегда установлена).

Я бы предложил установить $ data вручную с полями, которые выхочу перевести и не передавать все $_POST значений.В будущем вы можете добавить другие входные данные, которые не будут переведены, и я бы предложил механизм белого списка, в котором все входные данные переведены вместо черного списка (отключите кнопку отправки).

UPDATE добавил параметр $ fields в качестве списка полейкоторые переведены

$data = prepare_data_for_insert($data, array('title', 'url'), array('en', 'de'));
var_dump($data);
$data = remove_empty_rows($data, array('lang'));
var_dump($data);

function prepare_data_for_insert($data, $fields, $langs) {
    $result = array();

    $i = 0;
    // foreach language defined
    foreach ($langs as $lang) {
        // set the languge
        $result[$i]['lang'] = $lang;
        // foreach field that we want to translate
        foreach ($fields as $field) {
            // set the value for the current language
            $result[$i][$field] = $data[$field][$lang];
        }
        $i++;
    }

    return $result;
}

function remove_empty_rows($data, $ignore_fields = array()) {
    $result = array();

    // result
    foreach ($data as $item) {
        $has_values = false;
        foreach ($item as $key => $value) {
            // check if the key is ignored
            if (in_array($key, $ignore_fields)) {
                continue;
            }

            // if a value was set
            if ($value != '') {
                // the array has values
                $has_values = true;
                // don't search for other values
                break;
            }
        }

        // if the array has values
        if ($has_values) {
            // save the row in the result
            $result[] = $item;
        }
    }

    return $result;
}
...