CakePHP - Manual/Developing/Components/Creating /wiki/Manual/Developing/Components/Creating History/revisions of CakePHP/Manual/Developing/Components/Creating en-us 2009-02-10 21:50:44 /wiki/Manual/Developing/Components/Creating/show?time=2009-02-10+21%3A50%3A44 <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.components.creating" href="/wiki/Manual/Developing/Components/Creating" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Components&nbsp;/&nbsp;Creating</a> за <a href="/wiki/Manual/Developing/Components/Creating?time=2009-02-10+21%3A50%3A44">2009-02-10 21:50:44</a> и <a href="/wiki/Manual/Developing/Components/Creating">2009-02-10 21:54:32</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><hr noshade="noshade" size="1" /> <hr noshade="noshade" size="1" /> <hr noshade="noshade" size="1" /></div></div> 2009-02-10 20:55:53 /wiki/Manual/Developing/Components/Creating/show?time=2009-02-10+20%3A55%3A53 <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/Components/Creating" class="">/Manual&nbsp;/&nbsp;Developing&nbsp;/&nbsp;Components&nbsp;/&nbsp;Creating</a> за <a href="/wiki/Manual/Developing/Components/Creating?time=2009-02-10+20%3A55%3A53">2009-02-10 20:55:53</a> и <a href="/wiki/Manual/Developing/Components/Creating?time=2009-02-10+21%3A50%3A44">2009-02-10 21:50:44</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions">Код, приведенный выше, передаст массив, содержащий precision и&nbsp;randomGenerator в&nbsp;метод initialize() компонента <!--notypo-->MathComponent<!--/notypo--> вторым параметром.<a name="h802-1"></a><h3>Доступ к&nbsp;MVC классу с&nbsp;помощью компонентов</h3> Для&nbsp;получения доступа к&nbsp;экземпляру контроллера с&nbsp;помощью созданного компонента, вам&nbsp;необходимо использовать метод <strong>initialize()</strong> или&nbsp;<strong>startup()</strong>. Эти&nbsp;специальные функции принимают ссылку к&nbsp;контроллеру в&nbsp;качестве своего первого параметра и&nbsp;автоматически вызываются. Метод initialize() вызывается перед методом контроллера beforeFilter(), а&nbsp;startup() метод &ndash; после beforeFilter(). Если, по&nbsp;каким-то причинам, вы&nbsp;не хотите, чтобы startup() метод вызывался, то&nbsp;присвойте переменной класса <strong>$disableStartup</strong> значение true.<br /> Если вы&nbsp;хотите вставить какой-то код&nbsp;перед тем, как&nbsp;beforeFilter() вызовется, вам&nbsp;необходимо использовать метод компонента initialize().<br /> class <span class="missingpage">Check&nbsp;Component</span><a href="/wiki/CheckComponent/edit?add=1" title="Создать эту страницу">?</a> extends Object {<br /> <div class="indent">//вызывается перед Controller::beforeFilter()<br /> function initialize(&$controller) {<br /> <div class="indent">// сохранение ссылки на&nbsp;контроллер для&nbsp;последующего использования<br /> $this-&gt;controller =& $controller;<br /> </div>}<br /> //вызывается после Controller::beforeFilter()<br /> function startup(&$controller) {<br /> }<br /> function redirectSomewhere($value) {<br /> <div class="indent">// вызов метода контроллера<br /> $this-&gt;controller-&gt;redirect($value);<br /> </div>}</div> Вы&nbsp;можете захотеть использовать другие компоненты внутри вашего компонента. Для&nbsp;этого создайте переменную класса $components в&nbsp;виде массива, который содержит имена нужных вам&nbsp;компонентов.<br /> <strong>Только метод initialize вызывается автоматически для&nbsp;вложенных компонентов!</strong><br /> class <span class="missingpage">My&nbsp;Component</span><a href="/wiki/MyComponent/edit?add=1" title="Создать эту страницу">?</a> extends Object {<br /> <div class="indent">// Этот компонент использует другие компоненты<br /> var $components = array('Session', 'Math');<br /> function doStuff() {<br /> <div class="indent">$result = $this-&gt;Math-&gt;doComplexOperation(1, 2);<br /> $this-&gt;Session-&gt;write('stuff', $result);<br /> </div>}</div> Использовать модели в&nbsp;компонентах, в&nbsp;общем случае, не&nbsp;рекомендуется; однако, если после взвешивания всех возможностей, вы&nbsp;захотите это&nbsp;сделать, то&nbsp;вам необходимо инициализировать класс модели в&nbsp;какую-либо переменную и&nbsp;использовать ее.<br /> Вот&nbsp;пример:<br /> <div class="indent">function doComplexOperation($amount1, $amount2) {<br /> <div class="indent">return $amount1 + $amount2;<br /> </div>}<br /> function doUberComplexOperation ($amount1, $amount2) {<br /> <div class="indent">$userInstance = <span class="missingpage">Class&nbsp;Registry</span><a href="/wiki/ClassRegistry/edit?add=1" title="Создать эту страницу">?</a>::init('User');<br /> $totalUsers = $userInstance-&gt;find('count');<br /> return ($amount1 + $amount2) / $totalUsers;<br /> </div>}</div><a name="h802-2"></a><h3>Использование других компонентов в&nbsp;вашем компоненте</h3> Иногда один из&nbsp;ваших компонентов может зависеть от&nbsp;другого. Если функциональность этих компонентов не&nbsp;связана иначе, кроме этой зависимости, то&nbsp;вы не&nbsp;захотите объединить их&nbsp;в один компонент. Вместо этого вы&nbsp;можете сделать ваш&nbsp;компонент родителем, создав массив $components со&nbsp;списком потомков. Компоненты-родители загружаются перед их&nbsp;потомками и&nbsp;у потомков есть доступ к&nbsp;родителям.<br /> Родитель:<br /> class <span class="missingpage">Parent&nbsp;Component</span><a href="/wiki/ParentComponent/edit?add=1" title="Создать эту страницу">?</a> extends Object {<br /> <div class="indent"><div class="indent">var $name = &#147;Parent&#148;;<br /> var $components = array( &#147;Child&#148; );<br /> function initialize(&$controller) {<br /> <div class="indent"><div class="indent">$this-&gt;Child-&gt;foo();<br /> </div></div>function bar() {<br /> <div class="indent"><div class="indent">// ...</div></div></div></div> Потомок:<br /> class <span class="missingpage">Child&nbsp;Component</span><a href="/wiki/ChildComponent/edit?add=1" title="Создать эту страницу">?</a> extends Object {<br /> <div class="indent"><div class="indent">var $name = &#147;Child&#148;;<br /> function initialize(&$controller) {<br /> <div class="indent"><div class="indent">$this-&gt;Parent-&gt;bar();<br /> </div></div>function foo() {<br /> <div class="indent"><div class="indent">// ...</div></div></div></div> <span class="missingpage">&lt;&lt; Настройка</span><a href="/wiki/Configuring/edit?add=1" title="Создать эту страницу">?</a> | <span class="missingpage">Модели &gt;&gt;</span><a href="/wiki/Models/edit?add=1" title="Создать эту страницу">?</a></div></div>