現在、cakePHP アプリケーションを 1.3 から 2.2.4 に移行しました。ツリー動作でタスクを管理します。ajaxにはjQueryを使用しています。
タスクをクリックすると、ajax リクエストが発生し、レスポンス (サブタスク) によってタスク div の内容が更新されます。それは最初のレベルではうまくいきます。しかし、第 2 レベルには JavaScript コードが生成されていないため、クリックすると空白のページが表示され、単純な ajax 応答 (第 2 レベルのサブタスクのみ) のみが表示されます。
div を更新するためにさらに Javascript コードを生成するように cakePHP に指示するにはどうすればよいですか? HTML ID は正しく生成されています。
どんな助けでも素晴らしいでしょう!
TasksController.php の関数展開:
function expand($id = NULL, $check = 1) {
/*
get details of given task ID
*/
// if not expanded yet
if ((!$this->Session->check('Task.expand.'.$id))||($check==0)) {
// set session variable to "expanded"
$this->Session->write('Task.expand.'.$id, 1);
// get task details
$zahlen = array(1 => 'eins', 2 => 'zwei', 3 => 'drei', 4 => 'vier', 5 => 'fünf');
$this->set('commentlimit', $zahlen[$this->Session->read('Profile.commentcount')]);
$this->Task->Behaviors->attach('Containable');
$this->Task->recursive = -1;
$this->Task->contain(array('Assignee' => array('fields' => array('id', 'name', 'firstname')), 'Tasktype', 'Comment' => array('fields' => 'text', 'limit' => $this->Session->read('Profile.commentcount'), 'order' => 'lft DESC', 'user_id', 'User' => array('fields' => array('name', 'firstname')))));
$this->set('task', $this->Task->find('first', array('conditions' => array('Task.id' => $id, 'Task.user_id' => $this->Session->read('UserId')))));
}
// if yet expanded, collapse / unload
else {
$this->Session->delete('Task.expand.'.$id);
$this->redirect(array('controller' => 'tasks', 'action' => 'collapse'));
}
// pr ($this->Session->read('Task'));
$this->render('expand', 'ajax');
}
そして、これは私のタスク要素であり、各タスクに対して要求され、満たされています:
<div class="task <?php echo $thisclass; ?>">
<?php
echo $this->Js->link($task['Task']['name'], array( 'controller' => 'tasks', 'action' => 'expand', $task['Task']['id'] ), array( 'update' => '#details'.$task['Task']['id'] ));
echo " <span>(".$this->requestAction('/tasks/countAllChildren/'.$task['Task']['id'])." Unterpunkte, davon ";
echo $this->requestAction('/tasks/countDirectChildren/'.$task['Task']['id'])." direkt)</span>";
echo " <span>(".$this->requestAction('/tasks/countAllDoneChildren/'.$task['Task']['id'].'/'.$task['Task']['lft'].'/'.$task['Task']['rght'])." erledigt)</span>";
?>
<div id="details<?php echo $task['Task']['id']; ?>">
<?php
echo $this->requestAction('/tasks/is_expanded/'.$task['Task']['id']);
?>
</div>
</div>
expand.ctp の関連部分は次のようになります。
<?php
$children = $this->requestAction('/tasks/getChildren/'.$task['Task']['id']);
if ($children) {
?>
<p><h4>Unteraufgaben:</h4>
<?php
echo $this->Html->link('Neu',"/tasks/add/".$task['Task']['id'], array('class'=>'button'));
foreach ($children as $child) {
$this->set('task', $child);
// todo: das hier eleganter machen, ohne zusätzliche Abfragen
$this->set('level', $this->requestAction('/tasks/getDepth/'.$task['Task']['id']));
echo "<tr>".$this->element('taskmesh')."</tr>";
}
}
else {
?>
<p><h4>Keine Unteraufgaben</h4>
<?php
echo $this->Html->link('Neu',"/tasks/add/".$task['Task']['id'], array('class'=>'button'));
}
?>
</p>