タイトルを十分に正確に表現したいと思いますが、私は通常Javaを使用しており、Web開発/ PHP/CodeIgniterの経験があまりありません。私が開発しているWebサイトに特定の機能を実装しようとしていることに気付いたので(方法を学ぶ手段として)、スクリプトのライフサイクルを理解するのに苦労しています。最初に実装しようとした機能について説明し、次に遭遇した問題により、通常のOOPに慣れているため、スクリプトがどのように機能するかについての基本的な理解に疑問を投げかけました。
さて、ここに行きます...
ユーザーが実行できる2つの基本的なタスク、エントリの作成と削除を含むWebページがあります。私が実装しようとしたのは、ユーザーが特定のタスクを完了するのにかかる時間を計測する方法でした。私がこれを行った方法は、ユーザーが選択できるタスクのリスト(この場合は2、作成と削除)があるホームページを作成することでした。ユーザーは、「真の」ホームページにリンクするタスクをクリックし、そこでユーザーはタスクを完了することが期待されます。私のスクリプトは次のようになります。
<?php
class Site extends CI_Controller {
var $task1;
var $tasks = array(
"task1" => NULL,
"date1" => 0,
"date2" => 0,
"diff" => 0);
function __construct()
{
parent::__construct();
include 'timetask.php';
$this->task1 = new TimeTask("create");
}
function index()
{
$this->tasks['task1'] = $this->task1->getTask();
$this->tasks['diff'] = $this->task1->getTimeDiff();
if($this->tasks['diff'] == NULL)
{
$this->tasks['diff'] = 0;
}
$this->load->view('usability_test', $this->tasks);
}
function origIndex()
{
$this->task1->setDate1(new DateTime());
$this->tasks['date1'] = $this->task1->getDate1()->getTimestamp();
$data = array();
if($q = $this->site_model->get_records())
{
$data['records'] = $q;
}
$this->load->view('options_view', $data);
}
function create()
{
$this->task1->setDate2(new DateTime());
$this->tasks['date2'] = $this->task1->getDate2()->getTimestamp();
$data = array(
'author' => $this->input->post('author'),
'title' => $this->input->post('title'),
'contents' => $this->input->post('contents')
);
$this->site_model->add_record($data);
$this->index();
}
短くするためにcreateのみを含めました。次に、TimeTaskクラスもあります。これは、実際には別のStackOverflowがとても親切に助けてくれました。
<?php
class TimeTask
{
private $task;
/**
* @var DateTime
*/
private $date1, $date2;
function __construct($currTask)
{
$this->task = $currTask;
}
public function getTimeDiff()
{
$hasDiff = $this->date1 && $this->date2;
if ($hasDiff) {
return $this->date2->getTimestamp() - $this->date1->getTimestamp();
} else {
return NULL;
}
}
public function __toString()
{
return (string) $this->getTimeDiff();
}
/**
* @return \DateTime
*/
public function getDate1()
{
return $this->date1;
}
/**
* @param \DateTime $date1
*/
public function setDate1(DateTime $date1)
{
$this->date1 = $date1;
}
/**
* @return \DateTime
*/
public function getDate2()
{
return $this->date2;
}
/**
* @param \DateTime $date2
*/
public function setDate2(DateTime $date2)
{
$this->date2 = $date2;
}
/**
* @return get current task
*/
public function getTask()
{
return $this->task;
}
}
?>
質問に意見を投稿する必要はないと思いますが、少なくともリンクの作成方法は次のとおりです。
<?php echo form_open('site/create');?>
...and...
<?php echo anchor("site/delete/$row->id", $row->title); ?>
これでコードにエラーはありませんが、期待どおりに動作しません。その理由は、スクリプトの関数が新しいページを介して呼び出されるたびに、呼び出されたスクリプトの同じインスタンスではないためです。以前は、以前に作成されたオブジェクトは存在しなくなりました。これは私を混乱させ、これを優雅に実装する方法がまったくわからないままになります。これを行う方法を推測するいくつかの方法は、必要なデータをURLに渡すか、データをデータベースに保存して後で取得し、時間を比較することです。これだけでなく、以前に作成したデータが必要な場合に推奨される方法は何でしょうか。また、スクリプトは一度に1つのWebページに対してのみ「有効」であると考えるのは正しいですか?ありがとう!