Я пытаюсь вызвать внешнюю функцию в свойстве метода класса. На самом деле он вызывается, но в конце страницы и все, что находится внутри свойства метода, остается отдельным.
Поскольку я студент-самоучка, недавно я начал изучать классы PHP, поэтому я не совсем уверен, можно ли это сделать или нет.
Подскажите, пожалуйста, как это можно сделать правильно, а если нет, то какой может быть обходной путь?
Класс, который я написал, выглядит следующим образом: Он будет принимать ввод от пользователя при создании экземпляра и отображать модальное поле на основе ввода и выбранных параметров.
class modalBox{
private $modal_id, $modal_anim, $header_title, $modal_content,$footer;
private $headerOpt,$titleOpt,$footerOpt,$closeBtn;
public function setID($id){
$this->modal_id = $id;
}
public function getID(){
$modal_id = $this->modal_id;
return $modal_id;
}
public function setTitle($title){
$this->header_title = $title;
}
public function getTitle(){
$title = $this->header_title;
return $title;
}
public function setBodyContent($content){
$this->modal_content = $content;
}
public function getBodyContent(){
$modalContent = $this->modal_content;
return $modalContent;
}
public function setFooterContent($footer){
$this->footer = $footer;
}
public function getFooterContent(){
$footerContent = $this->footer;
return $footerContent;
}
public function initiateModal($modal_anim, $headerOpt, $titleOpt, $closeX, $footerOpt, $footerCloseBtn){ ?>
<div class = "modal <?php if ($modal_anim != 'false'){echo $modal_anim;} ?>" id = "<?php echo $this->getID(); ?>" style = "z-index: 2;">
<div class='modal-dialog'>
<div class='modal-content'>
<?php
// display if header option is set to true
if ($headerOpt){
?>
<div class = "modal-header">
<h4><?php echo $this->getTitle(); ?></h4>
<?php
// display if close button (X) is set to true
if ($closeX){
?> <button type = "button" class = "close" data-dismiss = "modal">×</button> <?php } ?>
</div>
<?php } ?>
<div class = "modal-body"><?php echo $this->getBodyContent(); ?></div>
<?php if ($footerOpt){ ?>
<div class = "modal-footer"><?php echo $this->getFooterContent(); ?>
<?php if ($footerCloseBtn){ ?>
<button type = "button" class = "btn btn-danger" data-dismiss = "modal">Cancel</button>
<?php } ?>
</div>
<?php } ?>
</div>
</div>
</div>
<?php
}
}
?>
Функция, которую я пытаюсь вызвать в свойстве, выглядит следующим образом: Эта функция не находится внутри класса. Это присутствует независимо в functions.php, который я включил в индексный файл.
function getDocNameList() {
global $db;
$getDoc = $db->prepare("SELECT id,doc_name from doctor");
$getDoc->execute();
while($docName = $getDoc->fetch(PDO::FETCH_ASSOC)){
// print the returned rows in options list of <select>
echo "<option value='".$docName['id']."'>".$docName['doc_name']."</option>";
}
}
Инициация экземпляра класса выглядит следующим образом. Обратите внимание, где я вызываю функцию.
// create class instance
$rangeModal = new modalBox;
//set the modal id
$rangeModal->setID ("rangeFields");
//set the modal title in header
$rangeModal->setTitle("Select Date Range");
// set the body content
$rangeModal->setBodyContent("
<form method='post' action='expenditure.php'>
<div role='wrapper' class='input-group mb-3'>
<input id='datepicker1' name='exp_date_from' value='From Date' required/>
</div>
<div role='wrapper' class='input-group mb-3'>
<input id='datepicker2' name='exp_date_to' value='To Date' required/>
</div>
<div role='wrapper' class='input-group mb-3'>
<select>" . getDocNameList() . "</select>
</div>
");
//set the footer content
$rangeModal->setFooterContent("
<input type='submit' class='btn btn-success' name='submitRange' />
</form>
");
/*
* @args ---
* modal animation
* modal header (boolean)
* modal title (boolean)
* modal close X (boolean)
* modal footer (boolean)
* modal footer close button (boolean)
*/
// initiate modal
$rangeModal->initiateModal('fade',true,true,true,true,true);
Я ожидаю, что вывод функции будет отображаться как .... внутри блока, но вместо этого он отображается внизу страницы непосредственно перед тегом.
Вы echo
это здесь, поэтому оно будет отображаться сразу:
echo "<option value='".$docName['id']."'>".$docName['doc_name']."</option>";
Таким образом, здесь нет конкатенации, функция ничего не делает:
<select>" . getDocNameList() . "</select>
Создайте его и return
вместо этого:
$output = '';
while($docName = $getDoc->fetch(PDO::FETCH_ASSOC)){
$output .= "<option value='".$docName['id']."'>".$docName['doc_name']."</option>";
}
return $output;
Или создайте массив и соедините элементы:
while($docName = $getDoc->fetch(PDO::FETCH_ASSOC)){
$output[] = "<option value='".$docName['id']."'>".$docName['doc_name']."</option>";
}
return implode($output);
@AbraCadaver Вау. Это сработало как шарм. Только что узнал новую вещь :) Большое спасибо :)
Хороший выбор, но ему нужно поместить значения все в строку и вернуть это... (эхо находится в цикле
while
)