私はJoomlaコンポーネント開発とMVC一般から始めています。私もPHPで信じられないほど強力ではありませんが、jsonを取得してjQueryアコーディオンリストとして表示するコンポーネントを構築しようとしています。
私はPHPを実行するスクリプトを作成することから始めましたが、それはうまく機能します。
ここで、コンポーネントパーツのImとmvcがトリップします。ここにあるドキュメントチュートリアルでhello worldコンポーネントを適合させました: http://docs.joomla.org/Developing_a_Model-View-Controller_Component/3.1/Introduction
しかし、コンポーネントをインストールしてコンポーネントに移動すると、次のようになります。
Fatal error: Call to undefined function getProject() in /[path to joomla]/components/com_insightly/views/insightly/view.html.php on line 23
したがって、私のビューでは、モデルで定義した関数を使用できません。コントローラが自動的にモデルをビューに割り当てたと思ったので、何かが足りないのかもしれません。
ここにいくつかのソースがあります(申し訳ありませんが、手動で各行の8つのスペースをインデントしていません)
site\models\insightly.php
// import Joomla modelitem library
jimport('joomla.application.component.modelitem');
class InsightlyModelInsightly extends JModelItem
{
public function getProject($user_id)
{
$project_url = 'https://api.insight.ly/v2/projects/'.$user_id;
$project = array();
$html_tag = null;
$html_class = null;
$html_id = null;
$curl = curl_init($project_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Basic NotGonnaShareThatNowAmI')
);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$curl_response = curl_exec($curl);
if ($curl_response){
$decoded = json_decode($curl_response, true);
$i = 0;
foreach ($decoded as $key=>$value){
// Eliminates Empty Fields and Saves to Multi-Dimensional Array
if ($value){
$value = id_mask($value);
}
switch($key)
{
case "PROJECT_NAME":
$key = null;
$html_tag = "h1";
break;
case "STATUS":
$key = "Status";
$html_tag = "li";
break;
case "PROJECT_DETAILS":
$key = "Description";
$html_tag = "li";
break;
case "RESPONSIBLE_USER_ID":
$key = "Project Manager";
$html_tag = "li";
break;
case "CATEGORY_ID":
$key = "Category";
$html_tag = "li";
break;
default:
$value = null;
}
if ($value){
$field = [$key, $value, $html_tag, $html_class, $html_id];
$project[$i] = $field;
$i++;
}
}
return $project;
}
else {
die('An error occurred retrieving Projects. Additional info: ' . curl_error($curl));
}
curl_close($curl);
}
public function getActiveTasks($user_id){
$project_tasks = getTasks($user_id);
$tasks = loopAndFind($project_tasks, 'STATUS', 'IN PROGRESS');
$i = 0;
foreach ($tasks as $key=>$value){
$active_tasks[$i] = taskStyler($key, $value);
$i++;
}
return $active_tasks;
}
public function getCompletedTasks($user_id){
$project_tasks = getTasks($user_id);
$tasks = loopAndFind($project_tasks, 'STATUS', 'COMPLETED');
$i = 0;
foreach ($tasks as $key=>$value){
$completed_tasks[$i] = taskStyler($key, $value);
$i++;
}
return $completed_tasks;
}
function getTasks($user_id){
$task_url = 'https://api.insight.ly/v2/tasks';
$curl = curl_init($task_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Basic NotGonnaShareThatNowAmI')
);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$curl_response = curl_exec($curl);
if ($curl_response){
$decoded = json_decode($curl_response, true);
$project_tasks = loopAndFind($decoded, 'PROJECT_ID', $user_id);
return $project_tasks;
}
else {
die('An Error occurred retrieving Tasks. Additional info: ' . curl_error($curl));
}
curl_close($curl);
}
//Search Tool for Multi-Dimensional Arrays
function loopAndFind($array, $index, $search){
$returnArray = array();
foreach($array as $k=>$v){
if($v[$index] == $search){
$returnArray[] = $v;
}
}
return $returnArray;
}
//Formats dates as d/m/Y and removes the time
function date_formatter($value){
date_default_timezone_set('America/New_York');
$date = date_create($value);
$value = date_format($date, "m/d/Y");
return $value;
}
//Returns array with ALLCAPS corrected and html tags
function taskStyler ($key, $value){
$html_tag = "li";
$html_class = null;
$html_id = null;
switch ($key)
{
case "Title":
$key = "Task";
$html_tag = "h3";
break;
case "DUE_DATE":
$key = "Due Date";
$value = date_formatter($value);
break;
case "COMPLETED_DATE_UTC":
$key = "Date Completed";
$value = date_formatter($value);
break;
case "DETAILS":
$key = "Details";
$value = strip_tags($value);
break;
case "STATUS":
$key = "Status";
break;
case "PERCENT_COMPLETE":
$key = "Percent Complete";
$value = $value . "%";
break;
case "START_DATE":
$key = "Start Date";
$value = date_formatter($value);
break;
case "RESPONSIBLE_USER_ID":
$key = "Assigned to";
$value = id_mask($value);
break;
default:
$value = null;
}
if ($value){
$task = [$key, $value, $html_tag, $html_class, $html_id];
}
else {
$task = null;
}
return $task;
}
}
site\views\insightly\view.html.php
// import Joomla view library
jimport('joomla.application.component.view');
/**
* HTML View class for the Insightly Component
*/
class InsightlyViewInsightly extends JViewLegacy
{
// Overwriting JView display method
function display($tpl = null)
{
$user =& JFactory::getUser();
$user_id = $user->get( 'id' );
$user_id= "765727"; //Set for Development
// Assign data to the view
$this->project = getProject($user_id);
$this->active_tasks = getActiveTasks($user_id);
$this->completed_tasks = getCompletedTasks($user_id);
parent::display($tpl);
}
}
controller.php(空です)
// import Joomla controller library
jimport('joomla.application.component.controller');
/**
* Insightly Component Controller
*/
class InsightlyController extends JControllerLegacy
{
}
site\insightly.php
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import joomla controller library
jimport('joomla.application.component.controller');
// Get an instance of the controller prefixed by Insightly
$controller = JControllerLegacy::getInstance('Insightly');
// Perform the Request task
$input = JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));
// Redirect if set by the controller
$controller->redirect();
site\views\insightly\tmpl\default.php
<article id='project'>
<?php
$iterations = count($this->project);
for ($i = 0; $i <= $iterations; $i++) {
echo('<' . $this->project[2]);
if (isset($this->project[3])) {
echo('class ="' . $this->project[3]);
}
if (isset($this->project[4])) {
echo('class ="' . $this->project[4]);
}
echo('>');
echo($this->project[0]);
echo(' : ');
echo($this->project[1]);
echo('</' . $this->project[2] . '>');
}
?>
<div id='tasks'>
<h2>Active Tasks</h2>
<section class='tasks'>
<?php
$number_of_tasks = count($this->active_tasks);
for ($i = 0; $i <= $number_of_tasks; $i++) {
$task_iterations = count($this->active_tasks[$i]);
for ($i = 0; $i <= $task_iterations; $i++) {
echo('<' . $this->active_tasks[$i][2]);
if (isset($this->active_tasks[$i][3])) {
echo('class ="' . $this->active_tasks[$i][3]);
}
if (isset($this->active_tasks[$i][4])) {
echo('class ="' . $this->active_tasks[$i][4]);
}
echo('>');
echo($this->active_tasks[$i][0]);
echo(' : ');
echo($this->active_tasks[$i][1]);
echo('</' . $this->active_tasks[$i][2] . '>');
}
}
?>
</section>
<h2>Completed Tasks</h2>
<section class='tasks'>
<?php
$number_of_tasks = count($this->completed_tasks);
for ($i = 0; $i <= $number_of_tasks; $i++) {
$task_iterations = count($this->completed_tasks[$i]);
for ($i = 0; $i <= $task_iterations; $i++) {
echo('<' . $this->completed_tasks[$i][2]);
if (isset($this->completed_tasks[$i][3])) {
echo('class ="' . $this->completed_tasks[$i][3]);
}
if (isset($this->completed_tasks[$i][4])) {
echo('class ="' . $this->completed_tasks[$i][4]);
}
echo('>');
echo($this->completed_tasks[$i][0]);
echo(' : ');
echo($this->completed_tasks[$i][1]);
echo('</' . $this->completed_tasks[$i][2] . '>');
}
}
?>
</section>
</div>
</article>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<script>
$(function () {
$(".tasks").accordion({ collapsible: true, active: false });
});
</script>
モデルの機能にアクセスできない理由に関する洞察はありますか?また、私は他のどのような過ちの誤りやセキュリティの欠陥の指摘も歓迎します。
編集:idMask関数は、機密コンテンツが原因で私の投稿から削除されました。それはおそらく問題ではありません。
編集:コンポーネントをロードしてコードを更新しましたが、配列に問題があります。 taskStyler
は、$completed_tasks[i]
に設定される配列を返す必要があります。
completed_tasks[0][0]
は正しいですが、completed_tasks[0][1]
には、本来あるべき配列で構成された配列が含まれていますcompleted_tasks[0][1-12]
。
これは、関連する関数の私の現在のバージョンです。
getTasks
を呼び出し、進行中のタスクの配列をコンパイルします
public function getActiveTasks($user_id){
$project_tasks = $this->getTasks($user_id);
$tasks = $this->loopAndFind($project_tasks, 'STATUS', 'IN PROGRESS');
$i = 0;
foreach ($tasks as $key=>$value){
$active_tasks[$i] = $this->taskStyler($key, $value);
$i++;
}
return $active_tasks;
}
getTasks
を呼び出し、完了したタスクの配列をコンパイルします
public function getCompletedTasks($user_id){
$project_tasks = $this->getTasks($user_id);
$tasks = $this->loopAndFind($project_tasks, 'STATUS', 'COMPLETED');
$i = 0;
foreach ($tasks as $key=>$value){
$completed_tasks[$i] = $this->taskStyler($key, $value);
$i++;
}
return $completed_tasks;
}
タスクの配列を返すAPIサーバーとのCurlセッション(完全に機能することがわかっている)
public function getTasks($user_id){
$task_url = 'https://api.insight.ly/v2/tasks';
$curl = curl_init($task_url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Basic Dontlookatmypassword')
);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$curl_response = curl_exec($curl);
if ($curl_response){
$decoded = json_decode($curl_response, true);
$project_tasks = $this->loopAndFind($decoded, 'PROJECT_ID', $user_id);
return $project_tasks;
}
else {
die('An Error occurred retrieving Tasks. Additional info: ' . curl_error($curl));
}
curl_close($curl);
}
キーといくつかの値が読みやすくなるように編集され、htmlタグ、クラス、IDが追加されたタスクのデータフィールドを表す配列を返します。
public function taskStyler ($key, $value){
$html_tag = "li";
$html_class = null;
$html_id = null;
switch ($key)
{
case "Title":
$key = "Task";
$html_tag = "h3";
break;
case "DUE_DATE":
$key = "Due Date";
$value = $this->dateFormatter($value);
break;
case "COMPLETED_DATE_UTC":
$key = "Date Completed";
$value = $this->dateFormatter($value);
break;
case "DETAILS":
$key = "Details";
$value = strip_tags($value);
break;
case "STATUS":
$key = "Status";
break;
case "PERCENT_COMPLETE":
$key = "Percent Complete";
$value = $value . "%";
break;
case "START_DATE":
$key = "Start Date";
$value = $this->dateFormatter($value);
break;
case "RESPONSIBLE_USER_ID":
$key = "Assigned to";
$value = $this->idMask($value);
break;
default:
$value = null;
}
if ($value) {
$task = [$key, $value, $html_tag, $html_class, $html_id];
}
else{ $task = null;
}
return $task;
}
問題はあなたの意見です。
モデルの$this->get('project')
メソッドを呼び出すgetProject()
を使用できます。ただし、引数を渡すことはできません。
したがって、あなたのケースでは、最初にモデルをフェッチし、その上でメソッドを呼び出す必要があります:
$model = $this->getModel();
$project = $model->getProject($user_id);
パラメータをモデル関数に渡すには、ビュー表示タスクに以下を追加します
$ model = $ this-> getModel();
次に、getProject()およびその他の接頭辞を
$ model->
次に、メソッドにパラメータを渡すことができます。
Happy Joomla!ng