CakePHP - Manual/Developing/Models/Callbacks /wiki/Manual/Developing/Models/Callbacks History/revisions of CakePHP/Manual/Developing/Models/Callbacks en-us 2009-03-01 19:09:48 /wiki/Manual/Developing/Models/Callbacks/show?time=2009-03-01+19%3A09%3A48 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a name=".manual.developing.models.callbacks" href="/wiki/Manual/Developing/Models/Callbacks" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Callbacks</a> за <a href="/wiki/Manual/Developing/Models/Callbacks?time=2009-03-01+19%3A09%3A48">2009-03-01 19:09:48</a> и <a href="/wiki/Manual/Developing/Models/Callbacks">2009-03-01 19:10:16</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Если используете рекурсивный поиск и&nbsp;при этом $primary = true, то&nbsp;вы получите ошибку от&nbsp;PHP <br /> &#147;Cannot use&nbsp;string offset as&nbsp;an array&#148;</div><br /> <b>Удалено:</b><br /> <div class="deletions">Если используете рекурсивный поиск и&nbsp;при этом $primary = true, то&nbsp;вы получите ошибку от&nbsp;PHP &#147;Cannot use&nbsp;string offset as&nbsp;an array&#148;</div></div> 2009-03-01 18:32:02 /wiki/Manual/Developing/Models/Callbacks/show?time=2009-03-01+18%3A32%3A02 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual/Developing/Models/Callbacks" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Callbacks</a> за <a href="/wiki/Manual/Developing/Models/Callbacks?time=2009-03-01+18%3A32%3A02">2009-03-01 18:32:02</a> и <a href="/wiki/Manual/Developing/Models/Callbacks?time=2009-03-01+19%3A09%3A48">2009-03-01 19:09:48</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><div class="indent"> <strong>afterFind(array $results, bool $primary)</strong></div> Если используете рекурсивный поиск и&nbsp;при этом $primary = true, то&nbsp;вы получите ошибку от&nbsp;PHP &#147;Cannot use&nbsp;string offset as&nbsp;an array&#148;<br /> Ниже показано, как&nbsp;afterFind может быть использован для&nbsp;форматирования даты.<br /> function afterFind($results) {<br /> <div class="indent">foreach ($results as $key =&gt; $val) {<br /> <div class="indent">if (isset($val['Event']['begindate'])) {<br /> <div class="indent">$results[$key]['Event']['begindate'] = $this-&gt;dateFormatAfterFind($val['Event']['begindate']);<br /> </div>}<br /> </div>}<br /> return $results;</div> }<br /> function dateFormatAfterFind($dateString) {<br /> <div class="indent">return date('d-m-Y', strtotime($dateString));</div> }<a name="h817-1"></a><h3>beforeValidate</h3> <div class="indent"> <strong>beforeValidate()</strong></div> Используйте этот колбэк для&nbsp;изменения данных перед их&nbsp;валидацией, или&nbsp;для модификации правил валидации, если это&nbsp;необходимо. Эта&nbsp;функция также должна вернуть true, или&nbsp;выполнение текущего save() будет прервано.<a name="h817-2"></a><h3>beforeSave</h3> <div class="indent"> <strong>beforeSave()</strong></div> В&nbsp;этой функции вы&nbsp;можете поместить любой код, который необходимо выполнить перед сохранением данных. Эта&nbsp;функция выполняется сразу же&nbsp;после того, как&nbsp;данные модели успешно прошли валидацию, но&nbsp;до того, как&nbsp;они были сохранены. Эта&nbsp;функция также должна вернуть true, если вы&nbsp;хотите чтобы операция сохранения была выполнена.<br /> Этот колбэк особенно удобен для&nbsp;кода, который должен быть выполнен перед сохранением данных. Например, ваше хранилище данных принимает даты только в&nbsp;определенном формате. Вы&nbsp;можете получить доступ к&nbsp;данным через $this-&gt;data и&nbsp;изменить их.<br /> Ниже приведен пример, как&nbsp;beforeSave может быть применен для&nbsp;конвертации даты. Код&nbsp;в&nbsp;примере используется для&nbsp;приложения, где&nbsp;формат begindate в&nbsp;БД 'YYYY-MM-DD' и&nbsp;формат вывода 'DD-MM-YYYY'. Конечно, это&nbsp;легко может быть изменено. Используйте код, представленный ниже, в&nbsp;соответствующей модели.<br /> function beforeSave() {<br /> <div class="indent">if(!empty($this-&gt;data['Event']['begindate']) && !empty($this-&gt;data['Event']['enddate'])) {<br /> <div class="indent"> $this-&gt;data['Event']['begindate'] = $this-&gt;dateFormatBeforeSave($this-&gt;data['Event']['begindate']);<br /> $this-&gt;data['Event']['enddate'] = $this-&gt;dateFormat($this-&gt;data['Event']['enddate']);<br /> </div>}<br /> return true;</div> }<br /> function dateFormatBeforeSave($dateString) {<br /> <div class="indent">return date('Y-m-d', strtotime($dateString)); // Direction is&nbsp;from </div> }<br /> Убедитесь, что&nbsp;функция beforeSave() вернула true, или&nbsp;сохранение не&nbsp;произойдет.<a name="h817-3"></a><h3>afterSave</h3> <div class="indent"> <strong>afterSave(boolean $created)</strong></div> Если у&nbsp;вас есть код, который необходимо выполнять после каждой операции сохранения, то&nbsp;разместите его&nbsp;в&nbsp;этом колбэке.<br /> Значение $created будет true, если объект был&nbsp;создан (а не&nbsp;обновлен).<a name="h817-4"></a><h3>beforeDelete</h3> <div class="indent"> <strong>beforeDelete()</strong></div> Размещайте в&nbsp;этой функции любой код, который необходимо выполнить перед удалением. Эта&nbsp;функция должна вернуть true, чтобы удаление произошло и&nbsp;false в&nbsp;противном случае.<a name="h817-5"></a><h3>afterDelete</h3> <div class="indent"> <strong>afterDelete()</strong></div> Размещайте в&nbsp;этой функции любой код, который необходимо выполнять после каждого удаления.<a name="h817-6"></a><h3>onError</h3> <div class="indent"> <strong>onError()</strong></div> Вызывается, если возникают какие-либо проблемы.<br /> <span class="missingpage">&lt;&lt; Ассоциации: связывание моделей</span><a href="/wiki/Associations/edit?add=1" title="Создать эту страницу">?</a> | <span class="missingpage">Переменные модели</span><a href="/wiki/Attributes/edit?add=1" title="Создать эту страницу">?</a></div><br /> <b>Удалено:</b><br /> <div class="deletions"><strong>afterFind(array $results, bool $primary)</strong></div></div> 2009-02-12 20:28:34 /wiki/Manual/Developing/Models/Callbacks/show?time=2009-02-12+20%3A28%3A34 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a href="/wiki/Manual/Developing/Models/Callbacks" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Models&nbsp;/&nbsp;Callbacks</a> за <a href="/wiki/Manual/Developing/Models/Callbacks?time=2009-02-12+20%3A28%3A34">2009-02-12 20:28:34</a> и <a href="/wiki/Manual/Developing/Models/Callbacks?time=2009-03-01+18%3A32%3A02">2009-03-01 18:32:02</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><br /> Если вы&nbsp;хотите выполнить какой-то код&nbsp;перед или&nbsp;после действия модели &ndash; используйте колбэки модели. Эти&nbsp;функции могут быть определены в&nbsp;классах моделей (включая класс <!--notypo-->AppModel<!--/notypo--> ). <br /> <br /> <hr noshade="noshade" size="1" /> <a name="h817-1"></a><h3> beforeFind</h3> <br /> <div class="indent"> <strong>beforeFind(mixed $queryData)</strong></div> <br /> Вызывается перед любым, относящимся к&nbsp;поиску, действием. Параметр $queryData содержит информацию о&nbsp;текущем запросе: условия, поля и&nbsp;прочее.<br /> <br /> Если вы&nbsp;не хотите, чтобы операция поиска выполнилась (возможно из-за каких-то опций $queryData ), то&nbsp;возвращайте false. Иначе, возвращайте, возможно измененный, параметр $queryData, или&nbsp;что-либо другое, что&nbsp;вы&nbsp;хотите передать для&nbsp;поиска.<br /> <br /> Вы&nbsp;можете использовать этот колбэк для&nbsp;ограничения действий, в&nbsp;зависимости от&nbsp;роли пользователя. Или&nbsp;сделать кэширование на&nbsp;основе текущей загрузки.<br /> <br /> <hr noshade="noshade" size="1" /> <a name="h817-2"></a><h3>afterFind</h3> <br /> <strong>afterFind(array $results, bool $primary)</strong><br /> <br /> Используйте этот колбэк для&nbsp;изменения результатов, которые вернула операция поиска; или&nbsp;для вставки любого другого кода, который нужно выполнить после поиска. Параметр $results содержит, данные возвращенные поисковым действием, например:<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br />$results&nbsp;</span><span style="color: #007700">=&nbsp;array(<br />&nbsp;&nbsp;</span><span style="color: #0000BB">0&nbsp;</span><span style="color: #007700">=&gt;&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'ModelName'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'field1'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'value1'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'field2'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'value2'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;),<br />&nbsp;&nbsp;),<br />);<br /><br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--> <br /> <br /> Возвращаемое значение для&nbsp;этого колбэка &ndash; возможно измененные, результаты операции поиска, запустившей этот колбэк.<br /> <br /> Если $primary = false, то&nbsp;формат $results будет немного отличным, от&nbsp;ожидаемого; вместо обычного результата, который вы&nbsp;получаете после find операции, вы&nbsp;получите такой: <br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br />$results&nbsp;</span><span style="color: #007700">=&nbsp;array(<br />&nbsp;&nbsp;</span><span style="color: #DD0000">'field_1'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'value'</span><span style="color: #007700">,<br />&nbsp;&nbsp;</span><span style="color: #DD0000">'field_2'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'value2'<br /></span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--></div></div>