0

現在、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>
4

1 に答える 1

0

私が別の CakePHP 担当者に尋ねたところ、彼は JavaScript バッファーを使用し、CakeBook でリンクするように私に言いました: http://book.cakephp.org/2.0/en/core-libraries/helpers/js.html

したがって、私の質問に対する答えは次のとおりです。

要求された ajax アクションのビューの下部に次のコードを追加します。

echo $this->Js->writeBuffer(); // Write cached scripts
于 2013-01-16T22:06:43.310 に答える