2016-05-18 9 views
0

joomlaコンポーネントを作成しました。管理者の公開ボタンと非公開ボタンをクリックすると、そのようなエラーが表示されます。メンバー関数を呼び出すpublish()

Fatal error: Call to a member function publish() on boolean in ...\libraries\legacy\controller\admin.php on line 209

UPDATE

私View.html.phpを助けてください

require_once JPATH_COMPONENT . '/helpers/lab.php'; 

    class labViewStructurelist extends JViewLegacy 
    { 
     protected $structurelist; 
     protected $pagination; 
     public $filterForm; 
     public $activeFilters;public $state; 
     public function display($tpl = null) 
     { 


      $this->structurelist = $this->get('Items'); 
      $this->pagination = $this->get('Pagination'); 
      $this->state = $this->get('State'); 
      //print_r($this->pagination->pagesTotal);die(); 
      $this->filterForm = $this->get('FilterForm'); 
      $this->activeFilters = $this->get('ActiveFilters'); 

      $this->addToolBar(); 
      $this->sidebar = JHtmlSidebar::render(); 
      if (count($errors = $this->get('Errors'))) 
      { 
       JError::raiseError(500, implode('<br />', $errors)); 

       return false; 
      } 

      return parent::display($tpl); 
     } 

     protected function addToolBar() { 
      JToolBarHelper::title(JText::_('COM_LAB_LAB_DDDD'), 'generic.png'); 

      JToolBarHelper::publish('Structurelist.publish'); 
      JToolBarHelper::unpublish('Structurelist.unpublish'); 
      JToolBarHelper::deleteList('', 'patients.delete', 'JTOOLBAR_DELETE'); 
      JToolBarHelper::preferences('com_lab'); 
     } 

} 

コントローラ/ stricturelist.php

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

// import Joomla controller library 
jimport('joomla.application.component.controlleradmin'); 


class LabControllerStructurelist extends JControllerAdmin 
{ 


     public function getModel($name='Structurelist',$prefix='ssModel',$config=array('ignore_request'=>true)) 
     { 
      $model=parent::getModel($name,$prefix,$config); 

      return $model; 
     } 

} 

モデル\ structurelist.php

defined('_JEXEC') or die; 
jimport('joomla.application.component.modellist'); 
JFormHelper::loadFieldClass('list'); 
class LabModelStructurelist extends JModelList{ 

    public function __construct($config = array()) 
    { 
     if (empty($config['filter_fields'])) 
     { 
      $config['filter_fields'] = array(
       'id', 'a.id', 
       'fullname', 'a.fullname', 
      ); 

      $assoc = JLanguageAssociations::isEnabled(); 

      if ($assoc) 
      { 
       $config['filter_fields'][] = 'association'; 
      } 
     } 

     parent::__construct($config); 
    } 



    public function getListQuery() 
    { 

     $db = JFactory::getDbo(); 
     $query = $db->getQuery(true); 


     $query->select('*'); 
     $query->from('#__ss_structure_tmp'); 
     $search = $this->getState('filter.search'); 
     $limit = $this->getState('filter.limit'); 
     if (!empty($search)) { 

      $query->where('fullname LIKE "%' . $search .'%" '); 
     } 
     if (!empty($limit)) { 

      $query->setLimit($limit); 
     } 

     return $query; 
    } 

    protected function populateState($ordering = 'a.fullname', $direction = 'asc') 
    { 
     $app = JFactory::getApplication(); 
     if ($layout = $app->input->get('layout')) 
     { 
      $this->context .= '.' . $layout; 
     } 

     $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); 
     $this->setState('filter.search', $search); 


     parent::populateState(); 
    } 



} 

答えて

1

あなたはgetModel()メソッドを使用して、コントローラにモデルを提供する必要があります。例えば、com_contentarticles controllerを見てください。

+0

ありがとう、私はモデルがあります、私のポストを更新させてください – dude

0

あなたは内パブリッシュ機能付きテーブルファイルを追加する必要があります。私は、これはただで働くだろうことを保証することはできません、これはテーブルファイルのほんの一例であることに、注意してください

defined('_JEXEC') or die; 

use Joomla\Utilities\ArrayHelper; 

class labTableStructurelist extends JTable 
{ 
    /** 
    * Constructor 
    * 
    * @param JDatabase &$db A database connector object 
    */ 
    public function __construct(&$db) 
    { 
     parent::__construct('#__ss_structure_tmp', 'id', $db); 
    } 

/** 
* Overloaded bind function to pre-process the params. 
* 
* @param array $array Named array 
* @param mixed $ignore Optional array or list of parameters to ignore 
* 
* @return null|string null is operation was satisfactory, otherwise returns an error 
* 
* @see  JTable:bind 
* @since 1.5 
*/ 
public function bind($array, $ignore = '') 
{ 
    $input = JFactory::getApplication()->input; 
    $task = $input->getString('task', ''); 

    if (($task == 'save' || $task == 'apply') && (!JFactory::getUser()->authorise('core.edit.state', 'com_lab.structurelist.'.$array['id']) && $array['state'] == 1)) 
    { 
     $array['state'] = 0; 
    } 

    if ($array['id'] == 0) 
    { 
     $array['created_by'] = JFactory::getUser()->id; 
    } 

    if (isset($array['params']) && is_array($array['params'])) 
    { 
     $registry = new JRegistry; 
     $registry->loadArray($array['params']); 
     $array['params'] = (string) $registry; 
    } 

    if (isset($array['metadata']) && is_array($array['metadata'])) 
    { 
     $registry = new JRegistry; 
     $registry->loadArray($array['metadata']); 
     $array['metadata'] = (string) $registry; 
    } 

    if (!JFactory::getUser()->authorise('core.admin', 'com_lab.structurelist.' . $array['id'])) 
    { 
     $actions   = JAccess::getActionsFromFile(
      JPATH_ADMINISTRATOR . '/components/com_lab/access.xml', 
      "/access/section[@name='user']/" 
     ); 
     $default_actions = JAccess::getAssetRules('com_lab.structurelist.' . $array['id'])->getData(); 
     $array_jaccess = array(); 

     foreach ($actions as $action) 
     { 
      $array_jaccess[$action->name] = $default_actions[$action->name]; 
     } 

     $array['rules'] = $this->JAccessRulestoArray($array_jaccess); 
    } 

    // Bind the rules for ACL where supported. 
    if (isset($array['rules']) && is_array($array['rules'])) 
    { 
     $this->setRules($array['rules']); 
    } 

    return parent::bind($array, $ignore); 
} 

/** 
* This function convert an array of JAccessRule objects into an rules array. 
* 
* @param array $jaccessrules An array of JAccessRule objects. 
* 
* @return array 
*/ 
private function JAccessRulestoArray($jaccessrules) 
{ 
    $rules = array(); 

    foreach ($jaccessrules as $action => $jaccess) 
    { 
     $actions = array(); 

     foreach ($jaccess->getData() as $group => $allow) 
     { 
      $actions[$group] = ((bool) $allow); 
     } 

     $rules[$action] = $actions; 
    } 

    return $rules; 
} 

/** 
* Overloaded check function 
* 
* @return bool 
*/ 
public function check() 
{ 
    // If there is an ordering column and this is a new row then get the next ordering value 
    if (property_exists($this, 'ordering') && $this->id == 0) 
    { 
     $this->ordering = self::getNextOrder(); 
    } 


    return parent::check(); 
} 

/** 
* Method to set the publishing state for a row or list of rows in the database 
* table. The method respects checked out rows by other users and will attempt 
* to checkin rows that it can after adjustments are made. 
* 
* @param mixed $pks  An optional array of primary key values to update. If not 
*       set the instance property value is used. 
* @param integer $state The publishing state. eg. [0 = unpublished, 1 = published] 
* @param integer $userId The user id of the user performing the operation. 
* 
* @return boolean True on success. 
* 
* @since 1.0.4 
* 
* @throws Exception 
*/ 
public function publish($pks = null, $state = 1, $userId = 0) 
{ 
    // Initialise variables. 
    $k = $this->_tbl_key; 
    // Sanitize input. 
    ArrayHelper::toInteger($pks); 
    $userId = (int) $userId; 
    $state = (int) $state; 
    // If there are no primary keys set check to see if the instance key is set. 
    if (empty($pks)) 
    { 
     if ($this->$k) 
     { 
      $pks = array($this->$k); 
     } 
     // Nothing to set publishing state on, return false. 
     else 
     { 
      throw new Exception(500, JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED')); 
     } 
    } 
    // Build the WHERE clause for the primary keys. 
    $where = $k . '=' . implode(' OR ' . $k . '=', $pks); 
    // Determine if there is checkin support for the table. 
    if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time')) 
    { 
     $checkin = ''; 
    } 
    else 
    { 
     $checkin = ' AND (checked_out = 0 OR checked_out = ' . (int) $userId . ')'; 
    } 
    // Update the publishing state for rows with the given primary keys. 
    $this->_db->setQuery(
     'UPDATE `' . $this->_tbl . '`' . 
     ' SET `state` = ' . (int) $state . 
     ' WHERE (' . $where . ')' . 
     $checkin 
    ); 
    $this->_db->execute(); 
    // If checkin is supported and all rows were adjusted, check them in. 
    if ($checkin && (count($pks) == $this->_db->getAffectedRows())) 
    { 
     // Checkin each row. 
     foreach ($pks as $pk) 
     { 
      $this->checkin($pk); 
     } 
    } 
    // If the JTable instance value is in the list of primary keys that were set, set the instance. 
    if (in_array($this->$k, $pks)) 
    { 
     $this->state = $state; 
    } 
    return true; 
} 

/** 
* Define a namespaced asset name for inclusion in the #__assets table 
* 
* @return string The asset name 
* 
* @see JTable::_getAssetName 
*/ 
protected function _getAssetName() 
{ 
    $k = $this->_tbl_key; 

    return 'com_lab.structurelist.' . (int) $this->$k; 
} 

/** 
* Returns the parent asset's id. If you have a tree structure, retrieve the parent's id using the external key field 
* 
* @param JTable $table Table name 
* @param integer $id  Id 
* 
* @see JTable::_getAssetParentId 
* 
* @return mixed The id on success, false on failure. 
*/ 
protected function _getAssetParentId(JTable $table = null, $id = null) 
{ 
    // We will retrieve the parent-asset from the Asset-table 
    $assetParent = JTable::getInstance('Asset'); 

    // Default: if no asset-parent can be found we take the global asset 
    $assetParentId = $assetParent->getRootId(); 

    // The item has the component as asset-parent 
    $assetParent->loadByName('com_lab'); 

    // Return the found asset-parent-id 
    if ($assetParent->id) 
    { 
     $assetParentId = $assetParent->id; 
    } 

    return $assetParentId; 
} 

/** 
* Delete a record by id 
* 
* @param mixed $pk Primary key value to delete. Optional 
* 
* @return bool 
*/ 
public function delete($pk = null) 
{ 
    $this->load($pk); 
    $result = parent::delete($pk); 

    return $result; 
} 
} 

コピー&ペースト。別の例については、com_content/tableを確認してください。

また、あなたのリストに単品モデルgetTable()を追加します。

public function getTable($type = 'view_name', $prefix = 'labTable', $config = array()) 
{ 
    return JTable::getInstance($type, $prefix, $config); 
} 

をファイル構造が正しいかどうか確認してください:

リスト表示

structurelist**s** -> list view with multiple items 
|-> controller/structurelists.php 
|-> models/structurelists.php 
|-> view/structurelists/ 

シングルビュー/リストビュー(publish()など)

structurelist -> single item view (edit view) 
|-> models/structurelist.php (this is important for the publish() in the list view) 
|-> models/forms/structurelist.xml 
|-> tables/structurelist.php (this is important for the publish() in the list view) 
|-> view/structurelist/ 

さらに助けが必要な場合はお気軽にコメントしてください。

関連する問題