HTML Helper - Многоразовый просмотр - PHP - PullRequest
0 голосов
/ 17 июля 2010

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

Итак, я создаю помощника HTML, который принимает 2 параметра. Первым будут данные формы (если есть {edit}), а вторым будет логическое значение, указывающее, является ли это вставкой или и редактируется (для изменения действия формы).

У меня вопрос ... как мне обработать первый параметр, если форма используется для добавления данных и, следовательно, не содержит данных? Необязательный параметр?

EDIT -

Я использую CodeIgnitor в качестве моей инфраструктуры MVC. Это то, что эти функции формы наследуются .. FYI

Спасибо ..

    <?php
if(!defined('BASEPATH') ) exit('No direct script access allowed');
if(!function_exists('WorkOrderForm'))
{
    function WorkOrderForm($array = array('$query'),$edit)
    {            
        $formHtml = "";

        $attributes = array('class'=>'order','id'=>'orderForm');

        if($edit)
        {
            $formHtml += form_open('order/update',$attributes);
        }
        else
        {
            $formHtml += form_open('order/add',$attributes);
        }


        $formHtml += form_input('name',$query[0]->name);
        $formHtml += form_textarea('name',$query[0]->description);

         $dropOptions = array('nstarted'=>'Not Started','complete'=>'Done','started'=>'In Progress');
         $formHtml += form_dropdown('status',$dropOptions,$query[0]->status);         
         $formHtml += form_input('name',$query[0]->startDate);
         $formHtml += form_input('name',$query[0]->endDate);
         $formHtml += form_close();




         return $formHtml;
    }
}
?>

Ответы [ 3 ]

3 голосов
/ 17 июля 2010

Что вы, ребята, делаете?Повторно используемый вид намного проще, чем этот.Просто создайте представление и сохраните его в папке представлений.Добавьте поля, которые будут появляться при добавлении и редактировании данных, и используйте оператор if в параметре значения, чтобы определить, есть ли у него данные.

Например,

Контроллер:

public function add()
{
    $data['method']    = 'add';
    $data['form_data'] = $this->some_model->get_something();
    $this->load->view('reusable_view', $data);
}

public function edit($id)
{
    $data['method']    = 'edit';
    $data['form_data'] = $this->some_model->get_something($id);
    $this->load->view('reusable_view', $data);
}

Просмотр:

<form method="post" action="my_controller/" . <?php echo $method; ?>>
<input type="text" value="<?php if ( isset($form_data['something']) ) {echo $form_data['something'];} " />
</form>

Не вижу смысла заполнять форму в контроллере, поскольку MVC работает не так.Использование помощника для заполнения формы также странно, я думаю, вы немного упустили из виду, как работает Codeigniter.

0 голосов
/ 17 июля 2010

Во-первых, если вы отправляете свой запрос вспомогательной функции в виде массива, нет причины превращать его в другой массив. то есть $array = array('$query') должно быть просто $query, чтобы вы могли получить доступ к таким свойствам, как это: $query->name вместо $query[0]->name. Во-вторых, если вы не редактируете запись формы, ваш $query будет пустым, так что вы можете использовать его как триггер для того, что возвращать (либо пустую форму, либо заполненную форму):

function WorkOrderForm($query)
{            
    if($query!='')
    {
        //$formHTML=populated form
    } else {
        //$formHTML=empty form
    }
    return $formHTML;
}

Хорошо? Но есть проблема ... Код, который вы имеете в своем помощнике, не будет работать. Вы используете арифметический оператор += для (при условии) объединения данных формы. Для этого попробуйте добавить 1 в строку, которая всегда будет равна 0. То, что вы ищете, это оператор .=; это объединит форму, как и следовало ожидать. Однако это дает вам небольшой контроль над тем, как будет выглядеть форма (то есть все элементы формы будут расположены рядом друг с другом - не слишком красиво). Что вы можете сделать, это вместо того, чтобы объединить их все вместе, push их в массив, а затем выводить элементы формы один за другим:

if($query!=''){

    $form_array=array();
    array_push($form_array,form_open('order/update',$attributes));
    array_push($form_array,form_input('name',$query->name));
    array_push($form_array,form_textarea('name',$query->description));

    $dropOptions = array('nstarted'=>'Not Started','complete'=>'Done','started'=>'In Progress');
    array_push($form_array,form_dropdown('status',$dropOptions,$query->status));         
    array_push($form_array,form_input('name',$query->startDate));
    array_push($form_array,form_input('name',$query->endDate));
    array_push($form_array,form_close());

}else{

    $form_array=array();
    array_push($form_array,form_open('order/add',$attributes));
    array_push($form_array,form_open('order/update'));
    array_push($form_array,form_input('name'));
    array_push($form_array,form_textarea('name'));

    $dropOptions = array('nstarted'=>'Not Started','complete'=>'Done','started'=>'In Progress');
    array_push($form_array,form_dropdown('status',$dropOptions));         
    array_push($form_array,form_input('name'));
    array_push($form_array,form_input('name'));
    array_push($form_array,form_close());

}

return $form_array;

Затем, чтобы представить элементы формы, выполните итерацию по массиву $ form_array, который был возвращен:

$form_data='';//blank for new item, or data to populate form with to edit an item
$form_el = WorkOrderForm($form_data);

foreach($form_el as $key=>$val){
    echo $val.'<br>';//I just added a <br> here so each form element will be on a new line; change to fit your needs
}

Надеюсь, это поможет ...

0 голосов
/ 17 июля 2010

Во-первых, аргумент по умолчанию должен быть справа. И я бы по умолчанию это «ложь» или NULL.

function WorkOrderForm($edit, $array = false)

Тогда, возможно, проверьте, не равен ли массив $ true, и установите для всех $ query [0] значение NULL? Так что-то вроде ...

      if(!$array) { 
         $query[0]->name = $query[0]->description = $query[0]->status = null; 
      }

Возможно, есть более прямой подход, но это один из способов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...