2

重複の可能性:
非オブジェクトのプロパティを取得しようとしています

joomla 2.5 用のカスタム コンポーネントを開発しているときに問題が発生しました。

MVC 構造を介してデータベースからデータを引き出しています。クエリが結果を返さない場合を除いて、すべてが正常に機能しています。

ビューにTrying to get property of non-objectエラーが表示されます。

これを防ぎ、ユーザーに結果がないという素敵なメッセージを表示する方法はありますか?

モデル部分:

$this->_gallery = array();
            // Load the data
        if (empty( $this->_gallery )) {
            $query = ' SELECT #__gallery.id, user_id, merk, type, name, bouwjaar, vermogen, #__gallery_kleur.kleur, transmissie, #__gallery_benzine.soort AS brandstof, cilinders, motorinhoud, gewicht, link FROM #__gallery LEFT JOIN #__gallery_merk ON #__gallery.merk_id = #__gallery_merk.merk_id LEFT JOIN #__gallery_type ON #__gallery.type_id = #__gallery_type.type_id LEFT JOIN #__gallery_autoinfo ON #__gallery.id = #__gallery_autoinfo.galleryid LEFT JOIN #__gallery_kleur ON #__gallery_autoinfo.kleur = #__gallery_kleur.kleurid LEFT JOIN #__gallery_benzine ON #__gallery_autoinfo.brandstof = #__gallery_benzine.benzineid LEFT JOIN #__users ON #__gallery.user_id = #__users.id LEFT JOIN (SELECT * FROM #__gallery_foto ORDER BY #__gallery_foto.hoofdfoto ASC) as #__gallery_foto ON #__gallery.id = #__gallery_foto.galleryid GROUP BY #__gallery.id ';
            $this->_db->setQuery( $query );
            $this->_db->query();
            $num_rows = $this->_db->getNumRows();

            $this->_gallery = $this->_db->loadObjectList();
        }
        if (!$this->_gallery) {
            $this->_gallery = new stdClass();
            $this->_gallery->id = 0;
        }
    $this->_total = count($this->_gallery); 

    if ($num_rows == 0) {
    if ($this->getState('limit') > 0) {
 $this->_gallery    = array_splice($this->_gallery, $this->getState('limitstart'), $this->getState('limit') );
    }
    }
     return $this->_gallery;

意見:

    // No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla view library
jimport('joomla.application.component.view');
jimport( 'joomla.html.pagination' );

/**
 * HTML View class for the HelloWorld Component
 */
class GalleryViewGallery extends JView
{
    // Overwriting JView display method
    function display($tpl = null) 
    {
        $gallery = $this->get( 'Gallery' );
        $this->assignRef( 'gallery',    $gallery );

        $this->items = $this->get('Gallery');
        $this->pagination = $this->get('Pagination'); 

        // Check for errors.
        if (count($errors = $this->get('Errors'))) 
        {
            JError::raiseError(500, implode('<br />', $errors));
            return false;
        }
        // Display the view
        parent::display($tpl);
    }
}

default.php:

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
//$document = &JFactory::getDocument(); $document->addStyleSheet('components'.DS.'com_gallery'.DS.'css'.DS.'gallery.css');
$document = &JFactory::getDocument(); $document->addStyleSheet('components/com_gallery/css/gallery.css');
?>
<p>
In onderstaande overzicht wordt overzicht van galleries getoond, ben op je zoek naar iets specifieks ?. Gebruik dan het zoekscherm aan de linkerkant van deze pagina om een aangepast overzicht te tonen.
</p>
<?php
$count = '1';

foreach($this->gallery as $gallery){
if($count == '0'){
    echo 'Geen resultaat';
}else{
?>
<div class="gallery_wrapper">
<?php
if($gallery->merk OR $gallery->type > Null){
echo "<div class=\"gallery_merktype\">";
echo "<a href='gallerie?view=gallerydetail&amp;gallery=" . $gallery->id . "' target='_self'>";
echo "<H1>";
echo $gallery->merk;
echo " ";
echo $gallery->type;
echo "</H1>";
echo "</a>";
echo "</div>";
}
//Weergeven afbeelding, bepaling maximale hoogte en breedte gebeurt in CSS.
if($gallery->link > Null){
echo "<div class=\"gallery_foto\">";
echo "<div class=\"gallery_foto_clip\">";
echo "<a href='gallerie?view=gallerydetail&amp;gallery=" . $gallery->id . "' target='_self'><img src='../galleryimage/thumb/" . $gallery->link . "' width='200px' alt='Afbeelding'/></a>";
echo "</div></div>";
}               
?>
<div class="gallery_wrapper_info">
<?php
//Weergeven gallery gegevens.
if($gallery->bouwjaar > Null){
echo "<div class=\"gallery_info_title\">Bouwjaar:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->bouwjaar;
echo "</div>";
}
if($gallery->vermogen > Null){
echo "<div class=\"gallery_info_title\">Vermogen:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->vermogen;
echo "</div>";
}
if($gallery->kleur > Null){
echo "<div class=\"gallery_info_title\">Kleur:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->kleur;
echo "</div>";
}
if($gallery->transmissie > Null){
echo "<div class=\"gallery_info_title\">Transmissie:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->transmissie;
echo "</div>";
}
if($gallery->brandstof > Null){
echo "<div class=\"gallery_info_title\">Brandstof:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->brandstof;
echo "</div>";
}               
if($gallery->cilinders > Null){
echo "<div class=\"gallery_info_title\">Cilinders:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->cilinders;
echo "</div>";
}
if($gallery->motorinhoud > Null){
echo "<div class=\"gallery_info_title\">Motorinhoud:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->motorinhoud;
echo "</div>";
}
if($gallery->gewicht > Null){
echo "<div class=\"gallery_info_title\">Gewicht:</div>";
echo "<div class=\"gallery_info_values\">";
echo $gallery->gewicht;
echo "</div>";
}
?>
<div class="gallery_bekijken">
<H2><a href="index.php/gallerie?view=gallerydetail&amp;gallery=<?php echo $gallery->id; ?>" target="_self">Bekijk Gallery</a></H2>
</div>
</div>

</div>


<?php   
}
}
?>

<form method="post" name="limiet">
<?php echo $this->pagination->getPagesLinks(); ?>
<center>
<?php echo $this->pagination->getLimitbox(); ?>
</center>
</form>

素晴らしい!、私は以下の方法で試してみましたが、うまくいきました:

if(is_object($this->gallery)){
echo "No result";
}else{

//DATA

}

記録のために:

塗りつぶされた配列の print_r:

Array ( [0] => stdClass Object ( [id] => 146 [user_id] => 861 [merk] => Seat [type] => Leon [name] => Danny [bouwjaar] => 2004 [vermogen] => 190 [kleur] => Geel [transmissie] => Handgeschakeld [brandstof] => Diesel [cilinders] => 4 [motorinhoud] => 1900 [gewicht] => 1210 [link] => p1793sjnq51u373r12qdobs1d2b2.jpg ) ) 

そして空のもの:

stdClass Object ( [id] => 0 ) 

以前に見逃したことがありましたが、モデルでは、テスト用に制限変数をデフォルトの '5' ではなく '0' に調整しました。

「5」に戻すと、クエリが結果を返さないときに array_splice エラーが発生します。データがある場合は完全に機能します。

多分私はここでも何か間違ったことをしていますか?

私のモデルのコード:

$this->_gallery = array();
            // Load the data
        if (empty( $this->_gallery )) {
            $query = ' SELECT #__gallery.id, user_id, merk, type, name, bouwjaar, vermogen, #__gallery_kleur.kleur, transmissie, #__gallery_benzine.soort AS brandstof, cilinders, motorinhoud, gewicht, link FROM #__gallery LEFT JOIN #__gallery_merk ON #__gallery.merk_id = #__gallery_merk.merk_id LEFT JOIN #__gallery_type ON #__gallery.type_id = #__gallery_type.type_id LEFT JOIN #__gallery_autoinfo ON #__gallery.id = #__gallery_autoinfo.galleryid LEFT JOIN #__gallery_kleur ON #__gallery_autoinfo.kleur = #__gallery_kleur.kleurid LEFT JOIN #__gallery_benzine ON #__gallery_autoinfo.brandstof = #__gallery_benzine.benzineid LEFT JOIN #__users ON #__gallery.user_id = #__users.id LEFT JOIN (SELECT * FROM #__gallery_foto ORDER BY #__gallery_foto.hoofdfoto ASC) as #__gallery_foto ON #__gallery.id = #__gallery_foto.galleryid GROUP BY #__gallery.id ';
            $this->_db->setQuery( $query );
            $this->_gallery = $this->_db->loadObjectList();
        }
        if (!$this->_gallery) {
            $this->_gallery = new stdClass();
            $this->_gallery->id = 0;
        }
    $this->_total = count($this->_gallery); 

    if ($this->getState('limit') > 0) {
     $this->_gallery    = array_splice($this->_gallery, $this->getState('limitstart'), $this->getState('limit') );
    }
     return $this->_gallery;
}

結果がなく、制限が5に設定されている場合の私のビューのエラー:

Warning: array_splice() expects parameter 1 to be array, object given in 

Print_R は結果を返しませんが、これは明らかです。

4

1 に答える 1

1

オブジェクトにデータがあることを確認してください。次の組み合わせを使用できます

isset- Determine if a variable is set and is not NULL

is_null - Finds whether a variable is NULL

empty — Determine whether a variable is empty

is_array — Finds whether a variable is an array 

is_object — Finds whether a variable is an object

次のようなものを使用できます(行数が0の場合、オブジェクトをnullに設定します)。

If(!is_null($this->gallery))
{
//show data
}
else
{
//show a msg
} 

$this->galleryがオブジェクトかどうかを確認できます。

If(is_object($this->gallery))
{
//show data
}
else
{
//show a msg
}

結果セットに応じて、上記を賢く選択してください。投稿できれば、print_r何を使用する必要があるかを正確に伝えることができます。

質問に関する更新

警告: array_splice() は、パラメーター 1 が配列であると想定しています。

機能しない理由は$this->_gallery、配列ではない可能性があるためです。

stdClass Object ( [id] => 0 ) <-- これは配列ではなくオブジェクトです。array_slice() 関数を呼び出す場合、最初のパラメーターは配列でなければなりません。

何かが配列かどうかを確認するには、次のようにします。

is_array($this->_gallery); // returns true or false

配列の場合は、 を呼び出すことができますarray_slice()

お役に立てれば。何か問題があれば、ここで質問してください。

于 2012-11-01T16:02:38.827 に答える