<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум ReadyScript &mdash; Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
		<link>http://forum.readyscript.ru/topic/391/kak-sdelat-ajax-zapros-blok-kontrolleru-v-readyscript/</link>
		<atom:link href="http://forum.readyscript.ru/feed/rss/topic/391/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Как сделать Ajax запрос блок контроллеру в Readyscript?».]]></description>
		<lastBuildDate>Wed, 16 Nov 2016 16:17:37 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5347/#p5347</link>
			<description><![CDATA[<p>Всё, до меня дошло) У меня в форме экшн не указан и по этому у меня в результате был html всей страницы</p><p>Спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (Игорь)]]></author>
			<pubDate>Wed, 16 Nov 2016 16:17:37 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5347/#p5347</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5346/#p5346</link>
			<description><![CDATA[<p>Кажись понял. У Вас старая информация.&nbsp; Я вверху поправил. Но на всякий случай...<br />Т.е. в общем виде, если мы в блок контроллере реализуем пагинацию, то урл в шаблоне можно получить так:<br /></p><div class="codebox"><pre><code>{$router-&gt;getUrl(&#039;catalog-block-sidefilters&#039;, [&#039;_block_id&#039;=&gt;$this_controller-&gt;getBlockId(), &#039;p&#039;=&gt;2])}</code></pre></div><p>Т.е. используя объект <strong>$router</strong>. В данном примере это страница со списком товаров, и где-то там наш блок контроллер.</p><p>И тогда получится адрес примерно такой:<br /></p><div class="codebox"><pre><code>/catalog-block-sidefilters/?_block_id=-342342345&amp;p=2</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Закусило Александр)]]></author>
			<pubDate>Wed, 16 Nov 2016 15:29:56 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5346/#p5346</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5345/#p5345</link>
			<description><![CDATA[<p>А вы как обращаетесь к блоку? Какой урл у Вас в Ajax уходит?<br />Я бы кстати сделал бы вот так:<br /></p><div class="codebox"><pre><code>public function actionIndex()
    {
        if ($this-&gt;isMyPost()) {
            $email = $this-&gt;request(&#039;email&#039;, TYPE_STRING);

            if ($this-&gt;api-&gt;subscribeUser($email, $this-&gt;getParam(&#039;list_id&#039;))) {
                $this-&gt;view-&gt;assign(&#039;success&#039;, t(&#039;Вы успешно подписались на рассылку новостей&#039;));
            } else {
                $this-&gt;view-&gt;assign(&#039;error&#039;, t(&#039;Произошла ошибка в процессе подписки на рассылку&#039;));
            }

            if ($this-&gt;url-&gt;isAjax()) {
                $this-&gt;result-&gt;checkAjaxOutput(true); // Форсим AJAX
                $this-&gt;result-&gt;addSection(&#039;test&#039;, &#039;Foo&#039;); // Пробуем всунуть секцию
            }
        }

        return $this-&gt;result-&gt;setTemplate($this-&gt;getParam(&#039;indexTemplate&#039;));
    }</code></pre></div><p>Будет короче:)</p>]]></description>
			<author><![CDATA[null@example.com (Закусило Александр)]]></author>
			<pubDate>Wed, 16 Nov 2016 14:52:01 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5345/#p5345</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5344/#p5344</link>
			<description><![CDATA[<p>JSON для блока:<br /><span class="postimg"><img src="https://dl.dropboxusercontent.com/s/tm06a9xjv2s9l5j/shot_161116_154605.png" alt="https://dl.dropboxusercontent.com/s/tm06a9xjv2s9l5j/shot_161116_154605.png" /></span></p><p>Экшн контроллера:<br /></p><div class="codebox"><pre><code>public function actionIndex()
    {
        if ($this-&gt;isMyPost()) {
            $email = $this-&gt;request(&#039;email&#039;, TYPE_STRING);

            if ($this-&gt;api-&gt;subscribeUser($email, $this-&gt;getParam(&#039;list_id&#039;))) {
                $this-&gt;view-&gt;assign(&#039;success&#039;, t(&#039;Вы успешно подписались на рассылку новостей&#039;));
            } else {
                $this-&gt;view-&gt;assign(&#039;error&#039;, t(&#039;Произошла ошибка в процессе подписки на рассылку&#039;));
            }

            if ($this-&gt;url-&gt;isAjax()) {
                $this-&gt;result-&gt;checkAjaxOutput(true); // Форсим AJAX
                $this-&gt;result-&gt;addSection(&#039;test&#039;, &#039;Foo&#039;); // Пробуем всунуть секцию

                return $this-&gt;result-&gt;setTemplate($this-&gt;getParam(&#039;indexTemplate&#039;));
            }
        }

        return $this-&gt;result
            -&gt;setTemplate($this-&gt;getParam(&#039;indexTemplate&#039;));
    }</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Игорь)]]></author>
			<pubDate>Wed, 16 Nov 2016 13:49:16 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5344/#p5344</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5343/#p5343</link>
			<description><![CDATA[<p>Да возвращается JSON, но только в блок контроллере нет метода wrapOutput() - из-за этого возвращается HTML всей страницы и только в месте блока - JSON строка.<br /></p><div class="codebox"><pre><code>function getOutput()
    {
        $this-&gt;result[&#039;html&#039;] = $this-&gt;getHtml();
        if ($this-&gt;controller-&gt;url-&gt;isAjax() &amp;&amp; $this-&gt;checkAjaxOutput) {

            /*===== Смотрим на условие ниже =====*/

            if ($this-&gt;controller instanceof \RS\Controller\Front || $this-&gt;controller instanceof \RS\Controller\Admin\Front) {
                // Это работает толька для фронт и бек контроллеров, как видно из условия
                $this-&gt;controller-&gt;wrapOutput(false);
            }
            return json_encode($this-&gt;result);
        } else {            
            if ($this-&gt;noAjaxRedirect !== null) {
                $this-&gt;controller-&gt;redirect($this-&gt;noAjaxRedirect);
            }
            return isset($this-&gt;result[&#039;html&#039;]) ? $this-&gt;result[&#039;html&#039;] : &#039;&#039;;
        }
    }</code></pre></div><p>Вот и получается, что блок не может вернуть чистый JSON.</p><p><strong>Для чего это может быть нужно:</strong><br />Например, у нас на сайте есть форма подписки на рассылку. Для этой формы я сделал блок, который выводит эту самую форму и обрабатывает её отправку. Я хочу сделать отправку через AJAX запрос и с фронт котроллером это очень удобно делать, потому что можно добавить любую доп. информацию в секции (статус, код ошибки и т.п.). А для блока приходится искать в html с результатом нужный блок и заменять старый html новым. Не говоря о том, что не доступна информация из секций.</p><p>Понятно, что можно сделать отдельный фронт контроллер, который будет обрабатывать форму и возвращать JSON, но, по моему, если бы блок отдавал JSON в ответ на AJAX - было бы очень круто!</p>]]></description>
			<author><![CDATA[null@example.com (Игорь)]]></author>
			<pubDate>Wed, 16 Nov 2016 13:34:38 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5343/#p5343</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5323/#p5323</link>
			<description><![CDATA[<p>У нас всегда возвращается JSON, если Ajax. Но это в том случае если в блок контроллере возвращается через <strong>return $this-&gt;result</strong>. Но у нас вроде везде такая тема. Возможно система не может отпределить, что у Вас это Ajax запрос из-за NGINX на https. Если да, то смотрите сюда:<br /><a href="http://blog.chrismeller.com/getting-php-https-detection-working-in-nginx">http://blog.chrismeller.com/getting-php … g-in-nginx</a></p>]]></description>
			<author><![CDATA[null@example.com (Закусило Александр)]]></author>
			<pubDate>Mon, 14 Nov 2016 13:24:35 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5323/#p5323</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/5322/#p5322</link>
			<description><![CDATA[<p>Во фронт контроллере можно добавить секцию к ответу и если это аякс запрос, то в возвращаемом JSON будет эта секция. Но вот блок-контроллер всегда возвращает HTML - можно как-то получить JSON результат со спец секциями для блока?</p>]]></description>
			<author><![CDATA[null@example.com (Игорь)]]></author>
			<pubDate>Mon, 14 Nov 2016 12:04:28 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/5322/#p5322</guid>
		</item>
		<item>
			<title><![CDATA[Как сделать Ajax запрос блок контроллеру в Readyscript?]]></title>
			<link>http://forum.readyscript.ru/post/1458/#p1458</link>
			<description><![CDATA[<p><strong>Вопрос:</strong><br />Как сделать Ajax запрос блок контроллеру в Readyscript?</p><p><strong>Ответ:</strong><br />Дело в том, что каждый блок контроллер в системе обладает своим уникальным идентификатором. Заботится о нём не надо, т.к. как только вы его вставляете на страницу, то тут же у него генерируется уникальный номер. Это нужно для того, чтобы можно было вставить несколько таких же блок контроллеров или же разных, но чтобы именно тот который Вам нужно отработал. <br />Соответственно когда вы посылаете запрос, то надо передавать уникальный идентификатор блока в параметре с именем &quot;<strong>_block_id</strong>&quot;.<br />Т.е. например<br /></p><div class="codebox"><pre><code> 
?_block_id=-345345431</code></pre></div><p><strong>Как его получить?</strong><br />В шаблоне доступна переменная <strong>$this_controller</strong> у которой есть метод <strong>getBlockId</strong>, его то и можно использовать, например так<br /></p><div class="codebox"><pre><code>/путь к блок контроллеру/?_block_id={$this_controller-&gt;getBlockId()}</code></pre></div><p>Если вы реализуете форму, то есть метод, который вернёт скрытый input с прописанным id блока, который будет учитываться при отправке формы.<br /></p><div class="codebox"><pre><code>&lt;form&gt;
{$this_controller-&gt;myBlockIdInput()}
....
&lt;/form&gt;</code></pre></div><p>Т.е. в общем виде, если мы в блок контроллере реализуем пагинацию, то урл в шаблоне можно получить так:<br /></p><div class="codebox"><pre><code>{$router-&gt;getUrl(&#039;catalog-block-sidefilters&#039;, [&#039;_block_id&#039;=&gt;$this_controller-&gt;getBlockId(), &#039;p&#039;=&gt;2])}</code></pre></div><p>Т.е. используя объект <strong>$router</strong>. В данном примере это страница со списком товаров, и где-то там наш блок контроллер.</p><p>И тогда получится адрес примерно такой:<br /></p><div class="codebox"><pre><code>/catalog-block-sidefilters/?_block_id=-342342345&amp;p=2</code></pre></div><p>Ну хорошо, вот мы отправили запрос. <br /><strong>Как понять на стороне контроллера, какому контроллеру пришёл запрос и сделать обработку этого запроса?</strong></p><p>Всё просто. В нашем блок контроллере пишем...<br />Для POST запроса:<br /></p><div class="codebox"><pre><code>if ($this-&gt;isMyPost()){
   //Мой POST запрос
}</code></pre></div><p>Для GET запроса:<br /></p><div class="codebox"><pre><code>if ($this-&gt;myGet()){
   //Мой GET запрос
}</code></pre></div><p>Если есть вопросы, задавайте.</p>]]></description>
			<author><![CDATA[null@example.com (Александр)]]></author>
			<pubDate>Sun, 07 Jun 2015 11:27:43 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/1458/#p1458</guid>
		</item>
	</channel>
</rss>
