รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Locked
flourz
Joomla! Apprentice
Joomla! Apprentice
Posts: 14
Joined: Mon Jun 20, 2011 4:37 pm

รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Post by flourz » Wed Feb 08, 2012 1:35 pm

Code: Select all

$.getJSON("index.php?option=com_geoLocation&view=testJson&tmpl=json",
             {lat: lat, lng:lng}, 
             function(data) {
                 if(data){ 
                     alert("test");    
                }else alert("test1");
          }
   );
อยากทราบว่าถ้าอยากจะได้ข้อมูลที่อยู่ในรูปแบบ json ออกมา เพื่อนำไปทำงานต่อค่ะ
ต้องทำยังไงเหรอค่ะ ลองทำแล้วแต่มันก้อไม่ทำงานค่ะ ต้องมี file อะไรเพิ่มเติมบ้างค่ะ และวิธีเรียกจะเรียกยังไงด้วยค่ะ ลองหาอ่านจากกระทู้เก่าๆ แล้วแต่ก้อไม่เข้าใจ ขอคำชี้แนะด้วยน่ะค่ะ หนูเพิ่งหัดทำ component ค่ะ
ขอบคุณค่ะ

User avatar
aodto
Joomla! Explorer
Joomla! Explorer
Posts: 397
Joined: Mon May 03, 2010 5:18 am
Location: Thailand
Contact:

Re: รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Post by aodto » Thu Feb 09, 2012 3:03 am

เปลี่ยนจาก tmpl=json เป็น format=json ครับ

เพราะ tmpl เป็นการเลือก template
แต่การ render เอกสารใ้ห้เป็น json ต้องผ่านตัวแปร format เพื่อเลือก Document Type
MongoDB-as-a-Service in Thailand: http://www.thaimongo.com
โฮสติ้งรองรับ 4 ภาษา PHP Python Ruby Node.js ใช้งานฟรี: http://www.phalconhost.com

flourz
Joomla! Apprentice
Joomla! Apprentice
Posts: 14
Joined: Mon Jun 20, 2011 4:37 pm

Re: รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Post by flourz » Thu Feb 09, 2012 6:06 am

aodto wrote:เปลี่ยนจาก tmpl=json เป็น format=json ครับ

เพราะ tmpl เป็นการเลือก template
แต่การ render เอกสารใ้ห้เป็น json ต้องผ่านตัวแปร format เพื่อเลือก Document Type
ขอบคุณค่ะ
แต่ลองเปลี่ยนแล้วมันก้อยังไม่ alert("test"); หรือว่า alert("test1"); ค่ะ

code view.json.php

Code: Select all

class GeoLocationViewGeoLocation extends JView
{
   public function display($tpl = null)
   {
    $document = JFactory::getDocument();
     
    $document->setMimeEncoding('application/json');
 
    JResponse::setHeader('Content-Disposition','attachment;filename="'.$view->getName().'.json"');
    JRequest::setVar('tmpl','component');
    
    $time = date('H:i:s');
    $data = array('clock' => array('time' => $time));
   
    
    echo json_encode($data);
   }
}
code ที่เรียกค่ะ

Code: Select all

$.getJSON("index.php?option=com_geoLocation&view=geoLocation&format=json",
             {lat: lat, lng:lng}, 
             function(data) {
                 if(data){ 
                     alert("test");    
                }else alert("test1");
          }
   );
ช่วยชี้แนะด้วยน่ะค่ะ T^T

flourz
Joomla! Apprentice
Joomla! Apprentice
Posts: 14
Joined: Mon Jun 20, 2011 4:37 pm

Re: รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Post by flourz » Thu Feb 09, 2012 9:09 am

รบกวนถามอีกอย่างนึงน่ะ ถ้าเกิดว่า อย่าให้มันคืนค่าเป็น ข้อมูล ก้อนนึงที่ถูกดึงออกมาจาก database
อย่างเช่น ผู้ใช้กดปุ่ม เพื่อดึงข้อมูล A แล้วหนูต้องการให้มันไปเรียกใช้ model เพื่อดึงค่าออกมาจาก database แต่ต้องการให้ยังคงอยู่ในหน้า page เดิมโดยที่ ไม่โหลดใหม่ทั้งหมดอ่ะค่ะ
ถ้าใช้

Code: Select all

$.get(url, 
             function(data) {
            }
   );
url จะเรียกยังไงเหรอค่ะ
ขอบคุณค่ะ

User avatar
gamaza
Joomla! Apprentice
Joomla! Apprentice
Posts: 31
Joined: Mon Mar 07, 2011 5:25 am

Re: รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Post by gamaza » Thu Feb 09, 2012 2:09 pm

อธิบายเป็น step ให้
ตัวอย่างที่จะเขียนผมเอา component contact มาดัดแปลงไปตัวอย่างให้ดู เขียนบน Joomla 2.5 แต่ใช้ได้กับ Joomla 1.6, 17 ด้วย

ไปที่ administrator\components\com_contact\views

สร้าง File และ Folder ให้มีโครงสร้างแบบนี้

ajaxRespons
view.raw.php

เป็นการสร้างส่วนของ Respons

เขียน code ใน view.raw.php ตามนี้

Code: Select all

<?php

defined('_JEXEC') or die;
jimport('joomla.application.component.view');

class ContactViewAjaxRespons extends JView {
    public function display($tpl = null) {
        $id = JRequest::getCmd('id',null);
        $model = JModel::getInstance('contact', 'ContactModel');
        if(preg_match('/^\d+$/',$id)){
            $contact = $model->getItem($id);
        }
        if ($contact) {
            $data = array('Contact Detail  |Name| ' . $contact->name .
                ' |Address| ' . str_replace(array("\r\n","\n","\r"), '', utf8_decode($contact->address)));
        } else {
            $data = array('There is noting');
        }
        $document = & JFactory::getDocument();
        $document->setMimeEncoding('application/json');
        JResponse::setHeader('Content-Disposition', 'attachment;filename="' . $this->getName() . '.json"');
        echo json_encode($data);
    }

}


อธิบายคือ JRequest รับค่า id มาถ้าไม่มีให้คืนค่าเป็น null
สร้าง model จาก contact แล้วใช้ getItem ดึงข้อมูลมา โดยส่งค่า $id เป็นค่าของ PK ที่ต้องการดึง โดยดึงข้อมูลจาก
ตาราง xxx_contact_details จากนั้น ส่งออกเป็น json โดยจะแสดงข้อมูลเป็น ชื่อ และที่อยู่ แต่ถ้าไม่มีข้อมูลหรือส่งไปมั่ว ๆ จะแสดง There is noting

ทดลองเปิด administrator/index.php?option=com_contact&view=ajaxRespons&format=raw
จะมีหน้าต่าง ขึ้นมาบอกให้บันทึกข้อมูล ที่มีนามสกุล json
และเมื่อเปิดออกดูจะมีข้อมูลว่า ["There is noting"] แสดงว่าเป็นอันใช้ได้

สาเหตุที่เปลี่นจาก format เป็น raw แทน json เพราะว่าผมใช้ google chrome จะขึ้นมาว่า

ข้อผิดพลาด 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):
ได้รับส่วนหัวตำแหน่งเนื้อหาผิดพลาดหลายรายการ การทำงานนี้ไม่ได้รับอนุญาตเพื่อป้องกันการโจมตีจากการแยกการตอบสนองของ HTTP

แต่ firefox กลับไม่มีปัญหา เลยเปลี่ยนมาเป็น raw แทน เพื่อจะที่ใช้ได้ทั้ง firefox และ google chrome
ใน joomla 1.6,17 สามารถใช้ format เป็น json ได้ โดยที่ไม่เป็นปัญหากับ google chrome ทั้งที่ใช้ code ชุดเดียวกัน



ต่อไปสร้างส่วนของ Request

ใน View เช่นเดิม

สร้าง File และ Folder ให้มีโครงสร้างแบบนี้
ajaxRequest
view.html.php
tmpl
default.php

เขียน code ใน view.html.php ตามนี้

Code: Select all


<?php
defined('_JEXEC') or die;
jimport('joomla.application.component.view');

class ContactViewAjaxRequest extends JView {

    public function display($tpl = null) {

$ajax = <<<EOD
window.addEvent('domready',function() {
 $('drop-down').addEvent( 'change', function() {
                var selectValue=$('drop-down').value;

         	$('ajax-container').empty().addClass( 'ajax-loading' );
		var myRequest = new Request({
                    url: 'index.php?option=com_contact&view=ajaxRespons&format=raw&id='+ selectValue,
                    method: 'get',

                    onSuccess: function(responseText){
                        $('ajax-container').removeClass('ajax-loading').set('html',responseText);
                    },

                });
 

                myRequest.send();

	});
});
EOD;

        $doc = & JFactory::getDocument();
        $doc->addScriptDeclaration($ajax);

        $model = JModel::getInstance('contacts', 'ContactModel');

        foreach ($model->getItems() as $contact) {
            $data[$contact->id] = $contact->name;
        }
       
        $options = array();
        foreach ($data as $key => $value) {
            $options[] = JHTML::_('select.option', $key, $value);
        }
        $options[] = JHTML::_('select.option', 342343, 'Rock Man');
        $options[] = JHTML::_('select.option', 'abcd', 'Zero');
        $options[] = JHTML::_('select.option', 'Mario', 'Mario');
        $this->assign('options', $options);
        parent::display($tpl);
    }

}
และเปิด default.php เพิ่ม code เข้าไปดังนี้

Code: Select all

<?php
defined('_JEXEC') or die;
JHTML::_( 'behavior.mootools' );
?>
<div>
<?php echo JHTML::_('select.genericlist', $this->options, 'drop-down');?>&nbsp
<span id="ajax-container">Show Contact Detail </span>
</div>

อธิบายคือ สร้าง combo box จะตาราง xxx_contact_details โดย value จะเป็นค่า PK
และเพิ่มข้อมูลมั่ว ๆ เข้าไปเพื่อทดสอบ

เมื่อมีการเลือกข้อมูล จะส่งข้อมูลจากค่า value ที่เลือกไปให้กับ ajaxRespons แล้วส่งค่ากลับมา
เพื่อ update ข้อมูลใน <span id="ajax-container"></span>

ส่วนตรง JHTML::_( 'behavior.mootools' ); คือคำสั่งเรียกใช้ งาน mootoos framework

flourz
Joomla! Apprentice
Joomla! Apprentice
Posts: 14
Joined: Mon Jun 20, 2011 4:37 pm

Re: รบกวนถามเกี่ยวกับการทำงานกับ JSON ของ Joomla ค่ะ

Post by flourz » Fri Feb 10, 2012 7:54 am

ขอบคุณ คุณ gamaza มากค่ะที่ช่วยอธิบายยาวเลย ^^
เด๋วจะไปศึกษาดู ค่ะ


Locked

Return to “Thai Forum”