0

在我安装了 XAMPP 服务器之后,我想在我的服务器上安装 cakephp。到目前为止一切正常。我已经生成了在 cakephp 教程中的初学者教程中解释的脚手架代码

但是,现在是我检索带有特定标签的书签的时候了,我正在一步一步地遵循代码,但是当我尝试通过其 URL 调用它时它没有显示标签。它一直告诉我模板丢失。它说标签 .ctp 文件尚未创建。

这让我很恼火,因为我一遍又一遍地检查代码,看看我是否遗漏了什么,但什么也没有。谢谢你。

这是 BookmarkController 的代码

use App\Controller\AppController;

/**
 * Bookmarks Controller
 *
 * @property \App\Model\Table\BookmarksTable $Bookmarks
 */
class BookmarksController extends AppController
{
    public function tags()
    {
        // The 'pass' key is provided by CakePHP and contains all
        // the passed URL path segments in the request.
        $tags = $this->request->params['pass'];

        // Use the BookmarksTable to find tagged bookmarks.
        $bookmarks = $this->Bookmarks->find('tagged', [
            'tags' => $tags
        ]);

        // Pass variables into the view template context.
        $this->set([
            'bookmarks' => $bookmarks,
            'tags' => $tags
        ]);
    }

    /**
     * Index method
     *
     * @return void
     */
    public function index()
    {
        $this->paginate = [
            'contain' => ['Users']
        ];
        $this->set('bookmarks', $this->paginate($this->Bookmarks));
        $this->set('_serialize', ['bookmarks']);
    }

    /**
     * View method
     *
     * @param string|null $id Bookmark id.
     * @return void
     * @throws \Cake\Network\Exception\NotFoundException When record not found.
     */
    public function view($id = null)
    {
        $bookmark = $this->Bookmarks->get($id, [
            'contain' => ['Users', 'Tags']
        ]);
        $this->set('bookmark', $bookmark);
        $this->set('_serialize', ['bookmark']);
    }

    /**
     * Add method
     *
     * @return void Redirects on successful add, renders view otherwise.
     */
    public function add()
    {
        $bookmark = $this->Bookmarks->newEntity();
        if ($this->request->is('post')) {
            $bookmark = $this->Bookmarks->patchEntity($bookmark, $this->request->data);
            if ($this->Bookmarks->save($bookmark)) {
                $this->Flash->success(__('The bookmark has been saved.'));
                return $this->redirect(['action' => 'index']);
            } else {
                $this->Flash->error(__('The bookmark could not be saved. Please, try again.'));
            }
        }
        $users = $this->Bookmarks->Users->find('list', ['limit' => 200]);
        $tags = $this->Bookmarks->Tags->find('list', ['limit' => 200]);
        $this->set(compact('bookmark', 'users', 'tags'));
        $this->set('_serialize', ['bookmark']);
    }

    /**
     * Edit method
     *
     * @param string|null $id Bookmark id.
     * @return void Redirects on successful edit, renders view otherwise.
     * @throws \Cake\Network\Exception\NotFoundException When record not found.
     */
    public function edit($id = null)
    {
        $bookmark = $this->Bookmarks->get($id, [
            'contain' => ['Tags']
        ]);
        if ($this->request->is(['patch', 'post', 'put'])) {
            $bookmark = $this->Bookmarks->patchEntity($bookmark, $this->request->data);
            if ($this->Bookmarks->save($bookmark)) {
                $this->Flash->success(__('The bookmark has been saved.'));
                return $this->redirect(['action' => 'index']);
            } else {
                $this->Flash->error(__('The bookmark could not be saved. Please, try again.'));
            }
        }
        $users = $this->Bookmarks->Users->find('list', ['limit' => 200]);
        $tags = $this->Bookmarks->Tags->find('list', ['limit' => 200]);
        $this->set(compact('bookmark', 'users', 'tags'));
        $this->set('_serialize', ['bookmark']);
    }

    /**
     * Delete method
     *
     * @param string|null $id Bookmark id.
     * @return \Cake\Network\Response|null Redirects to index.
     * @throws \Cake\Network\Exception\NotFoundException When record not found.
     */
    public function delete($id = null)
    {
        $this->request->allowMethod(['post', 'delete']);
        $bookmark = $this->Bookmarks->get($id);
        if ($this->Bookmarks->delete($bookmark)) {
            $this->Flash->success(__('The bookmark has been deleted.'));
        } else {
            $this->Flash->error(__('The bookmark could not be deleted. Please, try again.'));
        }
        return $this->redirect(['action' => 'index']);
    }
}

这是 BookMarkerTable 代码

use App\Model\Entity\Bookmark;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

/**
 * Bookmarks Model
 *
 * @property \Cake\ORM\Association\BelongsTo $Users
 * @property \Cake\ORM\Association\BelongsToMany $Tags
 */



class BookmarksTable extends Table
{

// The $query argument is a query builder instance.
// The $options array will contain the 'tags' option we passed
// to find('tagged') in our controller action.
public function findTagged(Query $query, array $options)
{
    return $this->find()
        ->distinct(['Bookmarks.id'])
        ->matching('Tags', function ($q) use ($options) {
            if (empty($options['tags'])) {
                return $q->where(['Tags.title IS' => null]);
            }
            return $q->where(['Tags.title IN' => $options['tags']]);
        });
}
    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */

// The $query argument is a query builder instance.
// The $options array will contain the 'tags' option we passed
// to find('tagged') in our controller action.

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('bookmarks');
        $this->displayField('title');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');

        $this->belongsTo('Users', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsToMany('Tags', [
            'foreignKey' => 'bookmark_id',
            'targetForeignKey' => 'tag_id',
            'joinTable' => 'bookmarks_tags'
        ]);
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
    public function validationDefault(Validator $validator)
    {
        $validator
            ->add('id', 'valid', ['rule' => 'numeric'])
            ->allowEmpty('id', 'create');

        $validator
            ->allowEmpty('title');

        $validator
            ->allowEmpty('description');

        $validator
            ->allowEmpty('url');

        return $validator;
    }

    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->existsIn(['user_id'], 'Users'));
        return $rules;
    }
}

下面是包含 src 文件夹的 file.txt 的内容

 C:\Users\Pamela\bookmarkers\src\Console
    C:\Users\Pamela\bookmarkers\src\Controller
    C:\Users\Pamela\bookmarkers\src\files.txt
    C:\Users\Pamela\bookmarkers\src\Model
    C:\Users\Pamela\bookmarkers\src\Shell
    C:\Users\Pamela\bookmarkers\src\Template
    C:\Users\Pamela\bookmarkers\src\View
    C:\Users\Pamela\bookmarkers\src\Console\Installer.php
    C:\Users\Pamela\bookmarkers\src\Controller\AppController.php
    C:\Users\Pamela\bookmarkers\src\Controller\BookmarksController.php
    C:\Users\Pamela\bookmarkers\src\Controller\Component
    C:\Users\Pamela\bookmarkers\src\Controller\PagesController.php
    C:\Users\Pamela\bookmarkers\src\Controller\TagsController.php
    C:\Users\Pamela\bookmarkers\src\Controller\UsersController.php
    C:\Users\Pamela\bookmarkers\src\Controller\Component\empty
    C:\Users\Pamela\bookmarkers\src\Model\Behavior
    C:\Users\Pamela\bookmarkers\src\Model\Entity
    C:\Users\Pamela\bookmarkers\src\Model\Table
    C:\Users\Pamela\bookmarkers\src\Model\Behavior\empty
    C:\Users\Pamela\bookmarkers\src\Model\Entity\Bookmark.php
    C:\Users\Pamela\bookmarkers\src\Model\Entity\Tag.php
    C:\Users\Pamela\bookmarkers\src\Model\Entity\User.php
    C:\Users\Pamela\bookmarkers\src\Model\Table\BookmarksTable.php
    C:\Users\Pamela\bookmarkers\src\Model\Table\TagsTable.php
    C:\Users\Pamela\bookmarkers\src\Model\Table\UsersTable.php
    C:\Users\Pamela\bookmarkers\src\Shell\ConsoleShell.php
    C:\Users\Pamela\bookmarkers\src\Template\Bookmarks
    C:\Users\Pamela\bookmarkers\src\Template\Element
    C:\Users\Pamela\bookmarkers\src\Template\Email
    C:\Users\Pamela\bookmarkers\src\Template\Error
    C:\Users\Pamela\bookmarkers\src\Template\Layout
    C:\Users\Pamela\bookmarkers\src\Template\Pages
    C:\Users\Pamela\bookmarkers\src\Template\Tags
    C:\Users\Pamela\bookmarkers\src\Template\Users
    C:\Users\Pamela\bookmarkers\src\Template\Bookmarks\add.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Bookmarks\edit.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Bookmarks\index.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Bookmarks\tags.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Bookmarks\view.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Element\Flash
    C:\Users\Pamela\bookmarkers\src\Template\Element\Flash\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Element\Flash\error.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Element\Flash\success.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Email\html
    C:\Users\Pamela\bookmarkers\src\Template\Email\text
    C:\Users\Pamela\bookmarkers\src\Template\Email\html\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Email\text\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Error\error400.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Error\error500.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Layout\ajax.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Layout\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Layout\Email
    C:\Users\Pamela\bookmarkers\src\Template\Layout\error.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Layout\rss
    C:\Users\Pamela\bookmarkers\src\Template\Layout\Email\html
    C:\Users\Pamela\bookmarkers\src\Template\Layout\Email\text
    C:\Users\Pamela\bookmarkers\src\Template\Layout\Email\html\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Layout\Email\text\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Layout\rss\default.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Pages\home.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Tags\add.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Tags\edit.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Tags\index.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Tags\view.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Users\add.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Users\edit.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Users\index.ctp
    C:\Users\Pamela\bookmarkers\src\Template\Users\view.ctp
    C:\Users\Pamela\bookmarkers\src\View\AjaxView.php
    C:\Users\Pamela\bookmarkers\src\View\AppView.php
    C:\Users\Pamela\bookmarkers\src\View\Helper
    C:\Users\Pamela\bookmarkers\src\View\Helper\empty
4

2 回答 2

1

我相信您还没有完成教程指导您创建文件的部分src/Template/Bookmarks/tags.ctp

现在,如果您访问该/bookmarks/taggedURL,CakePHP 将显示一个错误,让您知道您还没有创建视图文件。接下来,让我们为我们的tags()操作构建视图文件。放入src/Template/Bookmarks/tags.ctp以下内容:

<h1>
    Bookmarks tagged with
    <?= $this->Text->toList($tags) ?>
</h1>

<section>
    <?php foreach ($bookmarks as $bookmark): ?>
        <article>
            <!-- Use the HtmlHelper to create a link -->
            <h4><?= $this->Html->link($bookmark->title, $bookmark->url) ?></h4>
            <small><?= h($bookmark->url) ?></small>

            <!-- Use the TextHelper to format text -->
            <?= $this->Text->autoParagraph($bookmark->description) ?>
        </article>
    <?php endforeach; ?>
</section>

请参阅Cookbook 3.x:书签教程:创建视图

于 2016-01-14T17:24:31.103 回答
0

我不确定我做了什么,但我只是重新做了练习,重新复制了代码,它成功了!看来我第一次犯了错误。

多谢你们。

于 2016-01-22T09:00:20.347 回答