如何在一个视图中引用多个控制器(CakePHP)

时间:2016-01-20 13:41:07

标签: php cakephp controller models

我正在CakePHP中构建一个应用程序(我在新工作中使用了几个月,并从前一个员工那里接管了这个项目,所以我的理解是有限的。)

此应用程序有几个数据库表,涉及此问题的是中心,软件和类别。

为了给你一个简短的帽子,我需要的是,当用户访问'中心'查看,以便能够获得下面所有软件的列表,并勾选中心可以访问的内容。

要查看软件列表,我的SoftwaresController使用以下函数:

public function view() {

$categories = $this->Software->Category->find ('list');
array_unshift ($categories, array('any' => 'Any'));
$this->set ('categories', $categories);
$this->Software->hasMany['Version']['limit'] = 1;
$this->Software->hasMany['Version']['fields'] = array('Version.id', 'Version.version_number', 'Version.created');
if ($this->request->is ('post') && $this->request->data) {
  $conditions = array();
  $filters = $this->request->data['Software'];
  if (!empty($filters['name'])) {
    $conditions['Software.name'] = $filters['name'];
  }
  if ($filters['category'] > 0) {
    $conditions['Category.id'] = $filters['category'];
  }
  $this->paginate = array(
      'conditions' => $conditions,
      'order' => array(
          'Software.latest_released' => 'desc',
          'Software.name' => 'asc'
      )
  );
  $this->set ('softwares', $this->paginate ());
  $this->set ('paging', false);
} else {
  $this->paginate = array(
      'order' => array(
          'Software.latest_released' => 'desc',
          'Software.name' => 'asc'
      )
  );
  $this->set ('paging', true);
  $this->set ('softwares', $this->paginate ());
}
// This allows the user software page to show.
}

在CentresController函数中,我希望能够查看数据(如上所述),如下所示:

public function admin_view($id = null)
{

    /* Centres */
    $this->Centre->recursive = 0;
    $this->Centre->id = $id;
    if (!$this->Centre->exists()) {
        throw new NotFoundException(__('This centre ID does not exist.'));
    }
    $centre = $this->Centre->read(null, $id);
    $this->request->data = $centre;
    $this->set('centre', $centre);
}

我试图通过将view()的内部添加到admin_view()来组合上述两个函数。 admin_view()的视图如下所示:

                          分配软件访问

                      <div class="row-fluid">
                        <div class="span12">
                          <div class="table-responsive">
                            <table class="table table-striped table-bordered table-hover">
                              <thead>
                              <tr>
                                <th>Version Number</th>
                                <th>Created</th>
                                <th>Modified</th>
                                <th>Released</th>
                                <th>Grant Permission</th>
                              </tr>
                              </thead>
                              <tbody>
                              <?php
                              $i = 0;
                              foreach ($software['Version'] as $version):
                                $class = null;
                                if ($i++ % 2 == 0) {
                                  $class = ' class="even"';
                                } else {
                                  $class = ' class="odd"';
                                }
                                ?>
                                <tr<?php echo $class;?>>
                                  <td><?php echo $version['version_number']; ?>&nbsp;</td>
                                  <td>
                                    <?php
                                    echo $this->Time->format (Configure::read ('Format.time'), $version['created']);
                                    ?>&nbsp;
                                  </td>
                                  <td>
                                    <?php
                                    echo $this->Time->format (Configure::read ('Format.time'), $version['modified']);
                                    ?>&nbsp;
                                  </td>
                                  <td>
                                    <?php
                                    echo $this->Time->format (Configure::read ('Format.time'), $version['released']);
                                    ?>&nbsp;
                                  </td>
                                  <td class="actions" style="text-align: center;">
                                    <?php
                                    echo $this->Html->link (
                                        '<i class="fa fa-cloud-download"></i>&nbsp;Download',
                                        array(
                                            'controller' => 'versions',
                                            'action' => 'view',
                                            $version['id']
                                        ),
                                        array('escape' => false)
                                    );
                                    ?>&nbsp;

                                    </a>
                                  </td>
                                </tr>
                              <?php endforeach; ?>
                              </tbody>
                            </table>
                          </div>
                          <!-- /.table-responsive -->







                    </div>
                </fieldset>
                <div class="col-sm-12 col-md-5 col-lg-4 padding-right-0">
                    <div class="panel panel-default">
                        <div class="panel-heading"><span class="fa fa-cog"></span>&nbsp;Actions</div>
                        <div class="panel-body">
                            <div class="row">
                                <div class="col-sm-4 padding-bottom-10">
                                    <?php
                                    echo $this->Form->button(
                                        '<i class="fa fa-pencil"></i>&nbsp;Update',
                                        array(
                                            'type' => 'submit',
                                            'class' => 'btn btn-success btn-sm btn-block',
                                            'escape' => false
                                        )
                                    );
                                    echo $this->Form->end();
                                    ?>
                                </div>
                                <!-- /.col-sm-4 padding-bottom-10 -->
                                <div class="col-sm-4 padding-bottom-10">
                                    <a class="btn btn-danger btn-sm btn-block" href="#modal-dialog"
                                       data-toggle="modal"
                                       data-target="#modal-dialog"><i class="fa fa-trash"></i>&nbsp;Delete</a>
                                </div>
                                <!-- /.col-sm-4 padding-bottom-10 -->
                                <div class="col-sm-4 padding-bottom-10">
                                    <?php
                                    echo $this->Html->link(
                                        "<span class='fa fa-times'></span>&nbsp;Cancel",
                                        array(
                                            'action' => 'index'
                                        ),
                                        array(
                                            'escape' => false,
                                            'class' => 'btn btn-default btn-sm btn-block'
                                        )
                                    );
                                    ?>
                                </div>
                                <!-- /.col-sm-4 padding-bottom-10 -->
                            </div>
                            <!-- /.row -->
                        </div>

我得到的错误是:

  

错误:在null上调用成员函数find()   文件:/Applications/XAMPP/xamppfiles/htdocs/licensemanagementsite/app/Controller/CentresController.php   行:87

我还包括CentresController和Centers模型的顶部:     App ::使用(&#39; AppController&#39;,&#39; Controller&#39;,&#39; SoftwaresController&#39;);

你能给我的任何帮助都会非常感激。我办公室里没有人知道关于CakePHP的任何事情(包括我,我猜!)。

谢谢!

2 个答案:

答案 0 :(得分:0)

在CakePhp中,视图文件只能从其关联控制器获取输出。您无法在视图文件中调用控制器。另外两个控制器不能一起使用,即如果你想将A控制器的功能用于B控制器,则不可能直接或不是一个好的做法。

如果要在两个控制器之间使用某些常用功能,则应使用“COMPONENTS”。在此处阅读Components以创建组件。 将函数创建到组件后,只需在其中包含组件,即可在任何控制器中使用该函数。使用组件可以将组件的结果设置为变量,然后可以在关联视图文件中使用该变量。

答案 1 :(得分:0)

有几种方法可以达到你想要的效果。 请记住,一个模型与一个表链接,首先应该注意的是,一个控制器不需要仅与一个模型相关联。为此,您在Center控制器中使用公共变量“uses”,我们将使用以下内容:

<?php
class CentresController extends AppController
{
  public uses = array(Centre, Software);

  public function action1()
  {...}
  ...
}

然后,您应该将获取数据的逻辑移动到您的模型,并从控制器获取数据。假设您想要特定类别的软件。然后在软件模型中,您将创建一个函数,如:

public function fetchSoftwareType($type)
{
  return $this->find('all', array('conditions'=>array(category=>$type)));
}

(有关详情,请查看Models/Retrieving Your Data - 此链接适用于版本2.X,在您的搜索中 - ) 然后,从您的中心控制器,您只需拨打$this->Software->fetchSoftwareType($filters['category'])即可根据类别获取您的软件 类似地,您可以从同一个控制器检索类似的数据调用到中心模型中的相应方法,例如$this->Centre->fetchCentreData($whatever)

<?php
class CentresController extends AppController
{
  public uses = array(Centre, Software);

  public function view()
  {
    $softData = $this->Software->fetchSoftwareType($filters['category']);
    $centreData = $this->Centre->fetchCentreData($whatever);
    //.... process the data
    //$resultForView = $this->processData($softData, $centreData);
    //....
    $this->set('centre', $resultForView);
  }
  ...
}

关键是,您可以从uses变量中设置的模型中获取所需的数据,过程并将其设置为视图以显示它。