HTML DOM: удалить спецификацию c div на основе значения атрибута данных, используя php - PullRequest
1 голос
/ 01 апреля 2020

Я новичок в codeigniter. Я получаю базу данных html в виде строки, как показано ниже

<div class="rockfm-form-container uiform-wrap">
<div class="rockfm-alert-container"></div>
<form class="rockfm-form" action="" name="" method="post" data-zgfm-type="1" enctype="multipart/form-data" id="rockfm_form_7">
<input type="hidden" value="7" class="_rockfm_form_id" name="_rockfm_form_id"> 
<input type="hidden" value="0" class="_rockfm_wizard_st" > 
<input type="hidden" value="PGRpdiBjbGFzcz0icm9ja2ZtLWFsZXJ0IHJvY2tmbS1hbGVydC1zdWNjZXNzIj5TdWNjZXNzISBGb3JtIHdhcyBzZW50IHN1Y2Nlc3NmdWxseS48L2Rpdj4=" name="_rockfm_onsubm_smsg" class="_rockfm_onsubm_smsg" > <!--- ajax or post ---> 
<input type="hidden" value="1" class="_rockfm_type_submit" name="_rockfm_type_submit"> 
<input type="hidden" value="rocket_front_submitajaxmode" name="action"> 
<div class="uiform-main-form">
 <div class="uiform-step-content" >
    <div id="rockfm_uiibpy0eewu" data-idfield="uiibpy0eewu" data-typefield="33" class="rockfm-heading rockfm-field " ></div>
    <div id="rockfm_uiya0wevyae" data-idfield="uiya0wevyae" data-typefield="28" class="rockfm-preptext rockfm-field rockfm-required " data-val-type="4"></div>
    <div id="rockfm_ui04fxilqp6" data-idfield="ui04fxilqp6" data-typefield="7" class="rockfm-textarea rockfm-field " ></div>
    <div id="rockfm_uiwdtl19w05" data-idfield="uiwdtl19w05" data-typefield="10" class="rockfm-select rockfm-field " ></div>
    <div id="rockfm_uiksx46ggj9" data-idfield="uiksx46ggj9" data-typefield="12" class="rockfm-fileupload rockfm-field " ></div>
    <div id="rockfm_ui2jrdo8mcp" data-idfield="ui2jrdo8mcp" data-typefield="20" class="rockfm-submitbtn rockfm-field " ></div>
 </div>
</div>
</form>
</div>

У меня есть другая таблица полей типов, как показано на изображении

enter image description here

html строка преобразуется в DOM и добавляет условие проверки, если typefieldid = 10 равно flag_status = 0 , тогда удалите только этот div <div id="rockfm_uiwdtl19w05" data-idfield="uiwdtl19w05" data-typefield="10" class="rockfm-select rockfm-field " ></div>, но это дало мне код, подобный этому

<div id="rockfm_uiibpy0eewu" data-idfield="uiibpy0eewu" data-typefield="33" class="rockfm-heading rockfm-field "></div>
<div id="rockfm_uiya0wevyae" data-idfield="uiya0wevyae" data-typefield="28" class="rockfm-preptext rockfm-field rockfm-required "></div>
<div id="rockfm_ui04fxilqp6" data-idfield="ui04fxilqp6" data-typefield="7" class="rockfm-textarea rockfm-field "></div>
<div id="rockfm_uiksx46ggj9" data-idfield="uiksx46ggj9" data-typefield="12" class="rockfm-fileupload rockfm-field "></div>
<div id="rockfm_ui2jrdo8mcp" data-idfield="ui2jrdo8mcp" data-typefield="20" class="rockfm-submitbtn rockfm-field "></div>

Проблема в том, что когда typefield = 10 равно flag_status = 0 , его удалить <div id="rockfm_uiwdtl19w05" data-idfield="uiwdtl19w05" data-typefield="10" class="rockfm-select rockfm-field " ></div>, но другая информация в строке html также удаляется. Я показываю код функции контроллера, где I html строка преобразуется в документы DOM, получаю запись fby_id и flag_status форму таблицы полей типов и составляю массив этой записи. Затем создайте foreach l oop поля типа данных, используя запрос DOM для получения значения атрибута поля типа данных, затем добавьте условие проверки, если 0 = 1 , затем удалите указанную c div

Еще одна проблема заключается в том, как передать и показать окончательные данные в файле представления после удаления указанного c div в зависимости от условия. Вот код функции контроллера

public function getform() {

$form_id = ($this->input->post('id')) ? Uiform_Form_Helper::sanitizeInput($this->input->post('id')) : 0;

$data = array();

if (intval($form_id) === 0) {
    return;
} else {


    $rdata = $this->model_forms->getFormById($form_id);
}


$response = array();
if (!empty($rdata)) {
    $response['html_content'] = Uiform_Form_Helper::encodeHex($rdata->fmb_html);
}

$html = $rdata->fmb_html;
$doc = new DOMDocument();
$doc->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);

$fields = $this->model_fields->getAllFieldsType();

$field_array =array();
 foreach ($fields as $value) {

    $field_array[$value->fby_id] = $value->flag_status;

}

foreach ($xpath->query("//div[@data-typefield]") as $item) 
{

    $typefield = $item->getAttribute('data-typefield');

    if($field_array[$typefield] == 1)
    {
        $item->outertext = '';

        $doc->saveHTML($item);
    }


}

$data = array();

$json = $response;
$data['json'] = $response;

$this->load->view('html_view', $data);
}

и, пожалуйста, подскажите, есть ли возможность удалить только указанный c div из HTML DOM. Я хочу, чтобы мой код выводился следующим образом

<div class="rockfm-form-container uiform-wrap">
<div class="rockfm-alert-container"></div>
<form class="rockfm-form" action="" name="" method="post" data-zgfm-type="1" enctype="multipart/form-data" id="rockfm_form_7">
<input type="hidden" value="7" class="_rockfm_form_id" name="_rockfm_form_id"> 
<input type="hidden" value="0" class="_rockfm_wizard_st" > 
<input type="hidden" value="PGRpdiBjbGFzcz0icm9ja2ZtLWFsZXJ0IHJvY2tmbS1hbGVydC1zdWNjZXNzIj5TdWNjZXNzISBGb3JtIHdhcyBzZW50IHN1Y2Nlc3NmdWxseS48L2Rpdj4=" name="_rockfm_onsubm_smsg" class="_rockfm_onsubm_smsg" > <!--- ajax or post ---> 
<input type="hidden" value="1" class="_rockfm_type_submit" name="_rockfm_type_submit"> 
<input type="hidden" value="rocket_front_submitajaxmode" name="action"> 
<div class="uiform-main-form">
  <div class="uiform-step-content" >
     <div id="rockfm_uiibpy0eewu" data-idfield="uiibpy0eewu" data-typefield="33" class="rockfm-heading rockfm-field " ></div>
     <div id="rockfm_uiya0wevyae" data-idfield="uiya0wevyae" data-typefield="28" class="rockfm-preptext rockfm-field rockfm-required " data-val-type="4"></div>
     <div id="rockfm_ui04fxilqp6" data-idfield="ui04fxilqp6" data-typefield="7" class="rockfm-textarea rockfm-field " ></div>
     <div id="rockfm_uiksx46ggj9" data-idfield="uiksx46ggj9" data-typefield="12" class="rockfm-fileupload rockfm-field " ></div>
     <div id="rockfm_ui2jrdo8mcp" data-idfield="ui2jrdo8mcp" data-typefield="20" class="rockfm-submitbtn rockfm-field " ></div>
   </div>
 </div>
 </form>
</div>

1 Ответ

1 голос
/ 01 апреля 2020

Ваш код в основном там, но основная часть - это удаление узла, я изменил тест, чтобы сказать, если статус = 0, тогда используйте removeChild(), чтобы избавиться от элемента. Тогда документ должен содержать только те элементы <div>, которые вы хотите в конце ...

foreach ($xpath->query("//div[@data-typefield]") as $item)
{
    $typefield = $item->getAttribute('data-typefield');
    if($field_array[$typefield] == 0)
    {
        $item->parentNode->removeChild($item);
    }
}

echo $doc->saveHTML();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...