ホームページ >バックエンド開発 >PHPチュートリアル >Cakephp の知識ポイントのまとめ

Cakephp の知識ポイントのまとめ

高洛峰
高洛峰オリジナル
2017-02-25 16:20:511247ブラウズ

この記事の例は、cakephp に関する一般的な知識のポイントをまとめたものです。参考までに皆さんと共有してください。詳細は次のとおりです:

1. 他のコントローラーのテンプレートを呼び出してリダイレクトします

方法 1:

ここで /views/tasks/tasks の下にある hello.ctp テンプレートを呼び出します。

$this -> viewPath = 'tasks';
$this -> render('hello');

方法 2 (パラメータあり):

$this->redirect(array('controller'=>'users','action'=>'welcome',urlencode($this- > data['name'].'haha'));

2. sql:

$this->PostContent->query("select * from user");
find():
$clue = $this->clue->find('all',
  array(
    'fields' =>array(
      'id',
      'title',
      'content'
    ),
    'order' => 'id ASC',
    'conditions' => array('id' => '1'),
  )
);

を直接使用してパラメータをクエリするには、最初のパラメータを all、first、count にすることができます。 、最初のパラメーターは all、first、count にすることができます。2 つのパラメーターは配列であり、配列のキーは条件、フィールド、順序、制限、オフセット、結合です。

追加:

$this->clue->create();
$this->clue->save($this->data);

変更:

$this->clue->create();
$this->clue->save($this->data);

削除:

$this->clue->delete($id)

3. パブリックスタイルが必要ない場合

すごい

レンダリングする必要はありません任意のビュー

$this->layout = false;

4. パブリック メソッド/クラスを定義する

方法 1: /app/Controller/AppController.php でパブリック メソッドを定義できます

Call

$this->autoRender = false;

方法2 :

/app/controllers/components に UtillComponent.php を作成します

$this->test();

呼び出し:

<?php
  class UtillComponent extends Object
  {
   function juanstr ($str) {
     return $str.&#39;+juanstr&#39;;
   }
  }
?>

5. プロンプトメッセージ

var $components = array(&#39;Utill&#39;);
$digit1 = $this->Utill->juanstr($digit1);
を定義します。

りー

6. セッション設定

については、以下を参照してください: http://www.php.cn/check(string $name);

$name がすでに存在するかどうかを確認してくださいSession に存在します キー値を持つデータ項目です。

del(string $name);<code>check(string $name);

检查Session中是否已有$name为键值的数据项.

del(string $name);<br>delete(string $name);

删除$name 指定的 Session 变量。

valid当Session有效时返回true,最好在read()操作前用它来确定你要访问的会话是否确实有效.

read(string $name);

返回 $name 变量值。

renew

通过创建新的seesion ID,删除原有的ID,将原有Session中信息更新到新的Session中。

write(string $name, mixed $value);delete(string $name);

$name で指定された Session 変数を削除します。

valid は、セッションが有効な場合に true を返します。アクセスするセッションが実際に有効かどうかを判断するには、read() 操作の前に使用するのが最善です。 code>

$name 変数の値を返します。

更新新しいセッション ID を作成し、元の ID を削除することで、元のセッションの情報を新しいセッションに更新します。

write(string $name,mixed $value);

変数 $name、$value をセッションに書き込みます。

error Cake セッション コンポーネントによって生成された最新のエラーを返します。通常、デバッグを使用しました。

7。

$this->Session->setFlash(__(&#39;The user has been saved&#39;));

<p class="wrong"><?php echo $this->Session->flash();?></p>

ログの種類は大まかに次のとおりです。

$this->Session->write(&#39;Message.auth&#39;,array(&#39;message&#39;=>__(&#39;The user has been saved.&#39;,true),&#39;element&#39;=>&#39;&#39;,&#39;params&#39;=>array()));

<p class="wrong"><?php echo $this->Session->flash(&#39;auth&#39;);?></p>

ログ ファイルは /app/tmp/logs ディレクトリに保存されます。

/app/config/core.php ファイルにはログ設定オプションがあります:

<?php echo $this->Form->create(&#39;Subject&#39;,array(
  &#39;type&#39; => &#39;post&#39;,
  &#39;inputDefaults&#39;=>array(
    &#39;p&#39;=>false,
    &#39;label&#39;=>false
    ),
  &#39;url&#39;=>array(
      &#39;controller&#39;=>&#39;subjects&#39;,
      &#39;action&#39;=>&#39;edit&#39;
    ),
  &#39;onsubmit&#39;=>&#39;return validateCallback(this, dialogAjaxDone);&#39; //提交前验证
  )
);
echo $this->Form->input(&#39;id&#39;,array(&#39;type&#39;=>&#39;hidden&#39;));
echo $this->Form->input(&#39;uid&#39;,array(&#39;type&#39;=>&#39;hidden&#39;));
?>
<ul class="usr_info_basic">
<li>
  <p class="ti">下拉单选(编辑页面会自动判断选中)</p>
  <p class="ce">
<?php echo $this->Form->input(&#39;type&#39;,array(&#39;type&#39;=>&#39;select&#39; ,&#39;class&#39;=>&#39;ipt&#39;,&#39;options&#39; => array(0=>&#39;文章&#39;,1=>&#39;专题&#39;, 2=>&#39;图组&#39;)));?>
  </p>
</li>
<li>
  <p class="ti">多选</p>
  <p class="ce">
<?php
  echo $this->Form->input(&#39;pushtype&#39;, array(&#39;type&#39;=>&#39;select&#39;,
    &#39;options&#39; => $pushtype,//所有选项
    &#39;multiple&#39;=>&#39;checkbox&#39;,
    &#39;selected&#39; => $pushtypes,//选中的项
));
?>
  </p>
</li>
</ul>
<p class="btns_3">
  <button class="btn3" type="submit"><span>保存</span></button>
  <button class="btn3 btn3_1 close"><span>取消</span></button>
</p>
<?php echo $this->Form->end();?>

9. レンダリングパス

$this->log(&#39;Something brok2&#39;,LOG_DEBUG);

添付ファイル: CakePHP について知っておくべき 21 のヒント

この記事は、CakePHP チュートリアルの中で最も古典的であると言えます。完全なステップバイステップのシリーズではありませんが、著者が CakePHP を使用した自身の経験を 21 項目にまとめており、特に初心者にとって非常に役立ちます。

翻訳中に、コントローラー、モデルなど、CakePHP に特有のいくつかの単語は意図的に未翻訳のまま残されました。 CakePHPを学んだ人ならすぐに意味が理解できると思います。 さらに、CakePHP の wiki は期限切れになり、bakery という Web サイトに置き換えられました。元の記事で引用されている wiki へのリンクもベーカリーに更新されました。

静的ページをすばやく作成する

静的データのみを含み、デフォルトのレイアウトを使用し、モデルを必要としないいくつかのページを作成したいと考えています。最初に、コントローラーを作成し、静的ページごとにアクションを定義しようとしました。ただし、この方法は不器用で、静的ページを迅速に作成するのには適していません。

実際には、pages コントローラーを使用してこれを行うことができます。views/pages フォルダーの下にビューを作成し、/pages 経由でアクセスするだけです。たとえば、http://www.php.cn/ からアクセスできる /views/pages/matt.thtml を作成しました。

静的ページのタイトルを変更する

ページ コントローラーを使用するときにページ タイトルを変更したい場合は、次のコードをビューに追加するだけです:

データをレイアウトに送信します。静的ページ

場合 レイアウトにデータ (ナビゲーション バーのどの部分を強調表示するかを示す変数など) を渡す必要がある場合は、次のコードをビューに追加できます:

$levels = array(
  LOG_WARNING=> &#39;warning&#39;,
  LOG_NOTICE=> &#39;notice&#39;,
  LOG_INFO=> &#39;info&#39;,
  LOG_DEBUG=> &#39;debug&#39;,
  LOG_ERR=> &#39;error&#39;,
  LOG_ERROR=> &#39;error&#39;
);

この配列には、レイアウト内の $somedata を通じてアクセスできます。

バックグラウンド管理を素早く作成する

バックグラウンド管理プログラムを作成する必要があり、すべての管理アクションを特定のフォルダーに配置したい場合は、config/core.php を開いて次の行のコメントを解除します:

define(&#39;LOG_ERROR&#39;, 2);

这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在posts controller中创建了名为"admin_add"的action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为admin目录设置密码以避免他人随意访问。

查看后台执行的SQL语句

只需改变config/core.php中的DEBUG常量,即可看到后台执行的SQL语句。0为产品级,1为开发级,2为完整调试SQL,3为完整调试SQL并显示对象数据。我通常将DEBUG设置为2,这样每页的底部会显示出一个包含SQL调试信息的表格。

如果页面底部添加的表格会破坏页面布局(特别是使用Ajax获取页面并显示到页面中间而不是底部时),你可以在CSS中添加以下代码以隐藏调试信息:

#cakeSqlLog { display: none; }

这样既能保持页面布局,又可以通过查看源代码来看到调试信息。当然最后发布网站时别忘了将调试级别改回0。

获取丰富的开发文档

别总是盯着手册。wiki和API也是无价之宝。wiki中的开发指南十分有用,而API文档初看起来比较难,但你很快就会发现这里的信息对你创建CakePHP网站十分重要。

使用bake.php

Bake是个命令行PHP脚本,可以根据数据库自动生成model、controller和view。在开发的最初阶段,我强烈推荐使用scaffolding让你的原型程序跑起来。但如果你清楚地知道scaffolding不合适,我推荐你使用bake。bake会生成所有的文件并保存到磁盘上,以便你随意修改。这样能节省创建关联、view、基本的CRUD crollder操作的重复工作。

(译者注:CRUD - Create, Read, Update, Delete,数据库应用的四种基本操作,即"增删查改"。)

bake很方便。你只需在数据库中建立一个表,然后到 /cake/scripts/ 目录下执行php bake.php 即可。

如果你通过交互方式来运行bake,它会分几步提示你创建model、controller和view。创建结束之后,我通常会阅读所有生成的代码并做必要的修改。

发布程序时注意权限

有一次我在发布程序时,将整个cake目录打包然后用scp上传到了服务器上。只要一关闭调试信息,就会出现错误——数据库调用无法返回任何数据。我一筹莫展,因为我必须通过调试信息才能调试问题。后来有人告诉我,/app/tmp应当对apache可写。将权限改为777之后问题就解决了。

复杂model验证

我需要进行更复杂的验证,而不仅仅是验证输入框非空或者符合某个正则表达式这样的简单验证。例如,我要验证用户注册时使用的邮件地址是否已被使用。在wiki中我找到了这篇关于高级验证的文章,其中提到了一些十分有用的高级验证方法。

记录错误日志

$this->log(&#39;Something broke&#39;);

这样可以将错误记录到 /tmp/logs/ 中(我最初以为会记录到apache的错误日志中)。

让controller使用其他model

如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:

class yourController extends AppController {
 var $uses = array(&#39;Post&#39;,&#39;User&#39;);
}

这样controller就能访问Post和User model了。

创建不使用数据库表的model

我需要创建一个不使用任何表的model。例如,我想通过$validate数组方便底验证输入数据,保持model逻辑的正确性。但创建model时对应的表不存在,CakePHP就会报错。通过在model中加入以下代码可以解决这个问题:

var $useTable = false;

你也可以通过这种方法改变model对应的表名。

var $useTable = &#39;some_table&#39;;

重定向之后记得exit()

对于有经验的人来说这应当是理所当然的事儿,调用 $this->redirect() 之后,剩下的代码如果不想运行要exit()。我也这样做,但以前曾经认为 $this->redirect() 会为我调用exit(实际上不会)。

高级model函数

翻翻API就能发现很多你不知道的非常有用的函数。我强烈推荐至少阅读一遍 Model 类的参考手册。下面是以前我没注意到的几个重要函数:

generateList() - 主要用于生成选择框(ca43c4a4e4e9a57ee85d2406306544fb)所需的数据
query() - 自己写SQL语句来查询
findCount() - 返回满足指定条件的行数
hasAny() - 当有记录满足条件时返回真

再次强烈推荐阅读整个model类参考,你会为你学到的东西赞叹的。

如何正确插入多行

我需要遍历一个列表,并将其中的每个元素都插入到数据库中。我发现如果在一次插入完成后立即进行下一次插入,那么第二次插入的内容完全不会被插入,而是会被更新到第一次插入的行中。例如:

$items = array(&#39;Item 1&#39;,&#39;Item 2&#39;,&#39;Item 3&#39;);
foreach ($items as $item) {
 $this->Post->save(array(&#39;Post&#39; => array(&#39;title&#39; => $item)));
}

这段代码将在posts表中插入仅一行:“Item 3”。CakePHP首先插入“Item 1”,但马上将其更新为“Item 2”,再更新为“Item 3”,因为$this->Post->id保存的是上一次插入成功的行的id。通常这个特性很有用,但在这个例子中反而帮了倒忙。其实只要在每次插入之后设置 $this->Post->id = false 就可以解决这个问题。

更新:有人发邮件告诉我,正确的做法是调用create()初始化model,再set/save新数据。

在controller函数之前或之后插入逻辑

假设你需要在controller渲染的每个view中都设置一个颜色数组,但你不希望在每个action中都定义它。可以通过 beforeRender() 回调函数来实现:

function beforeRender() {
 $this->set(&#39;colors&#39;,array(&#39;red&#39;,&#39;blue&#39;,&#39;green&#39;);
}

这样该controller渲染的所有view都可以访问$colors变量。beforeRender()函数在controller逻辑结束后、view被渲染之前执行。同样,beforeFilter()和afterFilter()函数会在每个controller action执行的前后执行。更多信息请阅读手册的models一节。

为CakePHP添加所见即所得编辑器

这里有一篇非常好的教程教你如何在CakePHP中使用TinyMCE。基本上你只需在页面上链接tiny_mce.js文件,然后添加一些初始化代码以设置将哪个textarea变成TinyMCE编辑器即可。

自定义HABTM关系的SQL语句

我曾试图在自定义的SQL语句上定义一个HABTM关系(has-and-belongs-to-many),却遇到了问题。根据本文撰稿时的文档,应当先在自己的model中设置finderSql,但从CakePHP的源代码来看,应该设置finderQuery。这只是文档中的一个小问题,但指出问题却能为他人节约时间。Trac ticket在这里。

发送邮件

我在wiki中找到两篇教程:发送邮件和通过PHPMailer发送邮件。强烈推荐后者,通过PHPMailer发送邮件更安全,而且不需要自己处理邮件头,减少许多麻烦。

自定义Helper生成的HTML

我需要修改调用$html->selectTag()时生成的5a07473c87748fb1bf73f23d45547ab8,使其生成“请选择”选项来代替默认的空白选项。我也希望单选按钮能带有标签,这样用户就无需精确地点击单选按钮本身,而只需单击到关联的文字上即可。

建立 /app/config/tags.ini.php,然后添加以下的内容:

; Tag template for a input type=&#39;radio&#39; tag.
radio = "<input type="radio" name="data[%s][%s]" id="%s" %s /><label for="%3$s">%s</label>"
; Tag template for an empty select option tag.
selectempty = "<option value="" %s>-- Please Select --</option>"

你可以从/cake/config/tags.ini.php中获得完整的标签列表。但我不建议修改该文件,否则升级CakePHP时可能会让你的修改丢失。

自定义404页面

如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。

更多cakephp知识点汇总相关文章请关注PHP中文网!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。