<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; &#x41D;&#x415;&#x43C;&#x435;&#x43B;&#x43E;&#x447;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; &#x442;&#x435;&#x43C;</title><link>http://opencartpascha.ru/forum/119-poleznye-nemelochi/</link><description>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; &#x41D;&#x415;&#x43C;&#x435;&#x43B;&#x43E;&#x447;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; &#x442;&#x435;&#x43C;</description><language>ru</language><item><title>10 &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x43E;&#x432; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x438;&#x442;&#x44C; &#x442;&#x440;&#x430;&#x444;&#x438;&#x43A; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x441;&#x430;&#x439;&#x442;&#x430; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; &#x441;&#x43E;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x441;&#x435;&#x442;&#x435;&#x439;</title><link>http://opencartpascha.ru/topic/140-10-sposobov-uvelichit-trafik-vashego-sayta-pri-pomoschi-socialnyh-setey/</link><description><![CDATA[<p>
	С развитием мобильных технологий популярность социальных сетей продолжает расти, тем более, что большинство приложений легко интегрируются с современными гаджетами. Увеличение продаж смартфонов и планшетов по всему миру является своеобразной подпиткой для социальных медиа приложений. Можем поспорить, что вы, как и миллионы других пользователей интернета, уже с трудом представляете свою жизнь без своего/своих социальных профилей.
</p>

<p>
	Интересно, а вы когда-нибудь задумывались о том, почему действие социальных сетей на наш мозг подобно лёгкому наркотику, вызывающему быструю психологическую зависимость? Давайте рассмотрим несколько главных причин.
</p>

<ul>
	<li>
		Для современного поколения социальные сети являются любимым местом времяпрепровождения.
	</li>
	<li>
		В социальных сетях можно заниматься реальным бизнесом.
	</li>
	<li>
		Социальные сети интерактивны.
	</li>
	<li>
		Они предоставляют возможность бесплатно обмениваться мгновенными сообщениями.
	</li>
	<li>
		Они позволяют создавать свой собственный контент стрим.
	</li>
	<li>
		Они предоставляют интересную информацию со всего веба.
	</li>
	<li>
		Они поощряют тягу пользователя к чтению.
	</li>
</ul>

<p>
	Действительно, можно сказать, что социальные сети правят миром вот уже целое десятилетие. Тем не менее, многие предприниматели всё ещё находятся в замешательстве и до сих пор точно не знают что стоит делать в социальных сетях для продвижения своего бизнеса, а чего точно не стоит. Дело в том, что с одной стороны социальные сети, такие как Facebook, Twitter, Google +, и другие помогают вашему бизнесу стать более известным, но с другой, если вы понятия не имеете о маркетинге в социальных сетях, вы можете представить свой бренд в невыгодном свете и здорово "подмочить" его, да и свою репутацию.
</p>

<p>
	Цель этой статьи не дать вам наделать ошибок и рассказать о верных методах привлечения аудитории к вашему сайту.
</p>

<p>
	Также необходимо чётко понимать какая из социальных сетей лучше всего подходит для вашего бизнеса. Если говорить о рекламе бизнеса в социальных сетях, то её преимущество состоит в том, что вы можете контактировать со своей целевой аудиторией без необходимости живого общения, на которое далеко не все потенциальные кленты охотно идут. Ссылки в социальных сетях намного облегчают продажи.
</p>

<p>
	Предлагаем немного углубиться в детали данного процесса. Социальные сети всегда были одним из первоисточников трафика наряду с поисковой системой Google. Facebook является явным лидером по привлечению трафика среди других платформ. Однако, мы нисколько не преуменьшаем заслуги Twitter, Reddit, Stumbleupon, Tumblr, и других. О них также не следует забывать потому, что эти источники тоже хороши.
</p>

<p>
	Просим прощения за повтор, но при выборе социальных сетей, в которых вы собираетесь развернуть свою маркетинговую компанию, вам необходимо учитывать нишу вашего сайта. Помните об этом.
</p>

<p>
	Название этой статьи обещает поделиться с вами 10 способоми увеличения трафика с использованием социальных сетей. В первом пункте мы собираемся поподробней остановиться на маркетинге в Facebook. Надеемся, что причины всем понятны. Ведь Facebook является крупнейшей и самой популярной социальной сетью в мире. Большинство компаний имеют свои профили в Facebook. Аудитория этой платформы настолько разнообразна, что она стала практически универсальным инструментом для привлечения трафика.
</p>

<p>
	Facebook внесла множество изменений в свой алгоритм, что повлияло на доступность страниц и профилей. Раньше было легче создать свою страницу в Facebook, однако, возможностей для привлечения трафика всё ещё много. Каковы же они?
</p>

<p>
	1. Давайте не будем торопиться. Прежде всего вам нужно создать страничку в Facebook с названием вашего сайта для приверженцев вашей компании.
</p>

<p>
	Вам нужно будет создавать страничку с нуля, увеличивать количество подписчиков (фолловеров), привлекать их качествеными постами. Это не только позволит вам увеличить трафик, но и заявить о своей компании, как о бренде, что ещё более ценно.
</p>

<p style="background-color:#ffffff; border-radius:0px !important; color:#333333; font-size:14px; text-align:start">
	Не забывайте, что ваша страничка в Facebook должна соответствовать вашему роду деятельности. Например, если ваш сайт относится к веб-дизайну, тогда ваши странички могут включать в себя, к примеру, странички знаменитостей в этой области, странички для фанатов различного программного обеспечения, странички спецефического юмора, понятного в основном только гикам, странички о веб-дизайне, новых технологиях, трендах, и т.п.
</p>

<p style="background-color:#ffffff; border-radius:0px !important; color:#333333; font-size:14px; text-align:start">
	Такие странички легче построить, купить или арендовать. И будьте уверены, они принесут много трафика вашему сайту.
</p>

<h3>
	Давайте немного поговорим о группах Facebook.
</h3>

<p>
	Facebook группы это старая стратегия привлечения трафика, но она всё ещё эффективна. Однако, эффективность данной стратегии очень сильно зависит от правильности выбора группы, в которой вы публикуете свою информацию. Только не вздумайте засорять (спамить) группу ненужной информацией, это уж точно не поможет.
</p>

<h4>
	Создавайте подлинные или липовые (фейковые) профили.
</h4>

<p>
	Профили Facebook очень хороши для привлечения трафика. Причём работают как настоящие, так и фейковые профили. Как только у вашего профиля станет достаточно много настоящих подписчиков, ваш сайт получит солидный прирост трафика.
</p>

<h3>
	Промо компании и посты
</h3>

<p>
	Это хороший способ привлечения трафика, но никогда не следует забывать о ROI (возврате инвестиций). Данная стратегия может быть использована для избранных постов, которые потенциально могут привлечь трафик. Не следует этого делать для каждого поста.
</p>

<p>
	Это были рекомендации, касающиеся конкретно привлечения трафика с Facebook, далее следуют более общие аспекты.
</p>

<ul>
	<li>
		Создайте чёткий график публикаций в социальных сетях. Здесь важны частота и разнообразие публикуемого контета.
	</li>
	<li>
		Профиль. Мы уже говорили о вашем профиле в Facebook. Создание профиля является фундаментом, началом-начал вашей деятельности в социальных сетях. И совершенно не важно какую сеть/сети вы выбрали, полностью заполненный профиль необходим.
	</li>
	<li>
		Присоединяйтесь к разным социальным сетям. Здесь всё просто - больше сетей, больше источников трафика.
	</li>
	<li>
		Постите регулярно. Как только вы начали размещать посты в социальных сетях, продолжайте делать это часто и упорно.
	</li>
	<li>
		Не нужно делиться одним и тем же сообщением дважды. Этот пункт может вызвать массу противоречий у вас в голове. Но не спешите с выводами, дочитайте до конца. Мы просто хотим сказать, что фолловерам будет скучно читать одно и то же сообщение, поэтому делитесь той же самой информацмей, но в другой форме/в другом формате, так, чтобы она не была похожа на ваш предыдущий пост.
	</li>
	<li>
		Вставляйте ссылки на ваши посты. Не стоит просто вставлять ссылку и название поста, лучше попытайтесь написать короткое описание, которое заинтересует пользователей и заставит их перейти по ссылке.
	</li>
	<li>
		Демонстрируйте свою вовлечённость. Делитесь ссылками, комментариями, постами других пользователей, задавайте вопросы и отвечайте на них - всё это поможет повысить уровень вовлечённости пользователей.
	</li>
	<li>
		Оптимизируйте контент для различных социальных сетей. У различных социальных сетей разные сильные стороны. Это может быть ловко использовано, в особенности, когда вы делитесь одним и тем же контентом более одного раза.
	</li>
	<li>
		Используйте ключевые слова для повышеия конверсии. Причём они должны быть разными для каждого социального сайта.
	</li>
</ul>

<h3>
	Подводим итоги
</h3>

<p>
	Будем краткими и точными. Для того, чтобы привлечь трафик через социальные сайты нужен хороший контент. И совершенно не важно чем вы занимаетесь. Это золотое правило онлайн-маркетинга. Будь то Facebook, Twitter, Pinterest, Instagram, Google+, или др., всё, чего хотят пользователи, это интересный контент.
</p>

<p>
	Вы можете пользоваться этими подсказками:
</p>

<ul>
	<li>
		Создайте крутой контент, чтобы привлечь внимание пользователей.
	</li>
	<li>
		Придумайте интригующий заголовок если вы делитесь статьёй. Он должен заставить пользователя перейти по ссылке на блог/сайт и прочитать статью целиком.
	</li>
	<li>
		Используйте текст и картинки при создании поста. Этот трюк минимизирует вероятность того, что ваш пост попросту проигнорируют.
	</li>
	<li>
		Делайте всё, что заставляет ваш социальный профиль работать в качестве мощного бэклинка (обратной ссылки) на ваш сайт.
	</li>
</ul>

<p>
	Надеемся, что наша статья поможет вам добиться желаемого увеличения трафика при помощи социальных сетей.
</p>
]]></description><guid isPermaLink="false">140</guid><pubDate>Sat, 19 Mar 2022 18:59:16 +0000</pubDate></item><item><title>C&#x430;&#x43C;&#x43E;&#x435; &#x432;&#x430;&#x436;&#x43D;&#x43E;&#x435; &#x43E; &#x43C;&#x435;&#x442;&#x430; &#x442;&#x435;&#x433;&#x430;&#x445;: title, description, keywords (&#x43E;&#x43F;&#x442;&#x438;&#x43C;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F;, &#x434;&#x43B;&#x438;&#x43D;&#x430;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B;)</title><link>http://opencartpascha.ru/topic/139-camoe-vazhnoe-o-meta-tegah-title-description-keywords-optimizaciya-dlina-primery/</link><description><![CDATA[<p>
	Для каждого отважного начинающего блогера или интернет-бизнесмена одной из самый первых и важных задач является навести порядок в хаосе терминов и их актуальности. Title, Description и Keywords это именно то, с чего следует начинать. Три маленьких слова, которые либо приведут ваш сайт на вершину поисковой пирамиды, либо похоронят под завалами других, неухоженных страниц, про которые никто никогда не узнает. Если это и есть ваш ночной кошмар, и вы чувствуете, что готовы немного потрудиться чтобы расставить всё на свои места – off we go.
</p>

<p>
	Для начала вспомним, что такое мета теги или meta tags. Это такие-себе HTML-теги для веб-документов, которые нужны для отображения мета данных вашей страницы. Указывать их нужно в заголовке в самом начале. Свою главную роль они играют при ранжировании в поиске, поисковые системы используют их для считывания и обработки данных с вашей страницы и определяют вам место в поисковых запросах. Чем лучше и грамотней прописаны мета теги, тем выше ваш результат окажется при поиске. Название, описание и ключевые слова – три столба, на которые опирается популярность вашей страницы.
</p>

<p>
	<strong>TITLE</strong>
</p>

<p>
	Теперь попробуем разобраться, что это все значит и с чем его едят.
</p>

<p>
	Title это тот же заголовок веб-сайта, который виден в браузере и при поиске. Его принято считать самым главным показателем релевантности сайта. Если для поисковых роботов заголовок будет максимально соответствующим по смыслу запросу, страница получит достаточно высокую позицию при поиске. Но не забывайте о том, что Title должен быть привлекательным не только для поисковых систем, а и для людей. Точно так же как в газетах и журналах, заголовок должен пробуждать интерес и обещать важную информацию. Так что не стоит писать его опустив рукава, пару лишних минут на создание мощного заголовка с лихвой вам окупятся, обещаю.
</p>

<p>
	<strong>ОСНОВНЫЕ ТРЕБОВАНИЕ К ЗАГОЛОВКУ</strong>
</p>

<p>
	Оптимальная длина заголовка это уже половина успеха. Больше 60 – поисковые системы не покажут дальше 60 символа, а слишком короткие чаще всего выглядят несерьезно и неубедительно. В идеале 45-60 символов.
</p>

<p>
	Заголовок для каждой страницы должен быть уникальным.
</p>

<p>
	Постарайтесь поставить ключевые слова в самом начале заголовка.
</p>

<p>
	Точка в конце запроса не нужна, точно так же, как и вопросительный знак.
</p>

<p>
	Забудьте про повторения. Получится каша вместо привлекательного заголовка.
</p>

<p>
	И маленькая подсказка: используйте только те заголовки, по теме которых действительно сможете дать нужную информацию. Иначе толку от высоких позиций не будет, а ваши клиенты или читатели покинут сайт недовольные и никогда больше не вернутся.
</p>

<p>
	Сравните сами:
</p>

<p>
	Here you can get the best WordPress themes for your business. - звучит неплохо, но слишком длинный заголовок будет обрезан, главные слова стоят ближе к концу и точка в конце лишняя.
</p>

<p>
	Best WordPress Business Themes - четко и ясно, поисковые системы пропустят по длине, точки в конце нет. Этот заголовок очень точно говорит о том, что ожидает посетителей на этой странице. Искали wordpress business themes, это и нашли.
</p>

<p>
	<strong>DESCRIPTION</strong>
</p>

<p>
	Description или описание - это мета-тег, который говорит о содержимом странице. Название говорит само за себя: короткое описание, которое видит пользователь, совершая поиск. Правильно составленное описание – маленькая SEO-деталь, которая может дать движение всему огромному механизму. Или же нет.
</p>

<p>
	Не стоит вписывать сюда название компании или контактную информацию. Пары интересных и грамотных предложений хватит для того чтобы задержать внимание потенциального читателя или клиента и превратить его в постоянного пользователя вашего ресурса.
</p>

<p>
	И куда же без правил?
</p>

<p>
	Длина Description должна быть около 150-165 символом, этого будет достаточно чтобы предоставить основную информацию о вашей странице и не усыпить ваших посетителей долгими и нудными описаниями.
</p>

<p>
	Описание должно быть уникальным. То есть просто скопировать информацию с сайта и вставить в строку будет недостаточно.
</p>

<p>
	Description должно отличаться от Titel.
</p>

<p>
	В конце ставится точка.
</p>

<p>
	Можете использовать ключевую фразу несколько раз, разбавляя её синонимами.
</p>

<p>
	Это ваш шанс написать о ваших сильных сторонах, то что выделяет вас среди сотен таких же блогов или компаний. Не упустите этот шанс.
</p>

<p>
	И еще. Взывайте к эмоциям и призывайте к действию, не стесняйтесь. Использование таких слов как «зайдите», «узнайте», «купите», «выберите», «прочитайте» только приветствуется. Убедитесь в этом сами:
</p>

<p>
	Here you can get the best WordPress themes for your business. Find the best one for your needs.слишком коротко и не цепляет, непонятно почему стоит выбирать именно эти шаблоны, в чем их преимущество.
</p>

<p>
	Need a website for your business that is easily customizable and yet feature rich and trendy looking? Choose best premium business WordPress themes from the web design masters at Template Monster.есть описание сильных сторон шаблонов компании, призыв к действию и описание достаточно многообещающее.
</p>

<p>
	<strong>KEYWORDS</strong>
</p>

<p>
	В последнее время ведется много споров о том, нужны ли ключевые слова для продвижения сайтов. Одни кричат, что век ключевых слов закончился еще в далеком 2002, другие все же советуют включить пару-тройку для очищения SEO-совести. Попробуем разобраться и в этом
</p>

<p>
	Изначально, ключевые слова отыгрывали такую же важную роль как и остальные мета теги, но особо хитрые начали использовать это далеко не в благих целях, а пичкать в эту строку самые частые запросы. То, что они чаще всего совершенно не отвечали действительности, никого не волновало, сайты ведь были в топе, хотя и целевую аудиторию за собой не приводили. Реакция на такие выходки не заставила себя долго ждать и умные поисковые системы просто начали банить за такое и само собой важность этих самых keywords значительно упала.
</p>

<p>
	Так что же теперь делать честным блогерам и предпринимателям, которые просто хотят продвинуть свой сайт и донести свой качественный контент до своей аудитории? Правду нужно искать где-то посередине. Ключевые слова в малых количествах точно не навредят, но, вероятнее всего и большой магии не сделают. Если же вы все же чувствуете острую необходимость использовать keywords, то постарайтесь соблюдать следующие правила:
</p>

<p>
	Используйте слова, которые действительно связанные с вашей страницей. Если вы говорите о шаблонах и бизнесе, то не стоит писать о революции в мире программирования.
</p>

<p>
	Пишутся ключевые слова как правильно в начале документа.
</p>

<p>
	Не переусердствуйте. Парочки запросов будет достаточно.
</p>

<p>
	И еще раз, никакого спама, это грозит долгим и не очень увлекательным путешествием вашей страницы по самым низам поисковых списков.
</p>

<p>
	Теперь вы еще на шаг ближе к созданию чего-то действительно большого. Учитывая все эти правила вам не составит никакого труда создать качественные и цепляющие заголовки, описания и ключевые слова. Руководствуясь честностью и соблюдая уникальность, вы сможете не только поднять свою страницу на самый верх при поиске, но и заполучить внимание важной для вас аудитории. Удачи!
</p>
]]></description><guid isPermaLink="false">139</guid><pubDate>Sat, 19 Mar 2022 18:55:42 +0000</pubDate></item><item><title>&#x41E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430; &#x43A; &#x430;&#x434;&#x43C;&#x438;&#x43D; &#x43F;&#x430;&#x43D;&#x435;&#x43B;&#x438; &#x43F;&#x43E; IP</title><link>http://opencartpascha.ru/topic/126-ogranichenie-dostupa-k-admin-paneli-po-ip/</link><description><![CDATA[<p>
	Быстрый и мощный совет по обеспечению безопасности вашей админ панели, который ограничит доступ по определенному IP адресу.<br>
	Это решение идеально подходит для администраторов и менеджеров вашего интернет-магазина. В следующих шагах мы опишем простой метод реализации для всех версий OpenCart.
</p>

<p>
	<strong>ШАГ 1 - Узнаем свой  IP-адрес</strong>
</p>

<p>
	Первый шаг, узнаем свой публичный IP, который мы позже внесем в белый список разрешающих адресов и ограничим доступ в админ панель. Узнать IP можете здесь или здесь
</p>

<p>
	<strong>ШАГ 2 - Создаем файл .htaccess</strong>
</p>

<p>
	Подключаемся к серверу, где хранятся файлы вашего сайта, с помощью любого FTP клиента (например, FileZilla). Для того, чтобы соединиться с FTP сервером, вам понадобятся доступы. Узнать их можно у своего хостинг-провайдера.
</p>

<p>
	После успешного подключения перейдите к папке admin и создайте новый файл с именем .htaccess. Если такой файл уже существует, просто откройте его для редактирования. Добавьте следующий код ниже в файле .htaccess, заменяя 1.2.3.4 из кода ниже на ваш IP-адрес (который вы получили ранее). Вы можете разрешить несколько IP-адресов, добавляя с новой строки Allow from с нужным IP.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6609_5" style=""><span class="pln">Order deny,allow
Deny from all
Allow from 1.2.3.4</span></pre>

<p>
	Затем сохраните и загрузите файл.
</p>

<p>
	<strong>ШАГ 3 – Проверяем работоспособность</strong>
</p>

<p>
	Теперь откройте веб-браузер и перейдите в админ панель. Она должна выглядеть таким же образом, как и раньше, без каких-либо изменений. Теперь вернитесь к пункту 2 и измените разрешенный IP-адрес на отличающийся от вашего, и попробуйте снова войти в админ панель. Ваш доступ должен быть запрещен. Хорошая работа! Верните обратно свой IP адрес, и наслаждайтесь новой защитой.
</p>
]]></description><guid isPermaLink="false">126</guid><pubDate>Sat, 19 Mar 2022 16:14:27 +0000</pubDate></item><item><title>&#x41D;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; OCMOD?</title><link>http://opencartpascha.ru/topic/125-ne-rabotaet-ocmod/</link><description><![CDATA[<p style="background-color:#ffffff; color:#000000; font-size:15px; text-align:start">
	Иногда система OCMOD на OpenCart может перестать работать во фронтенде, и вы можете потратить какое-то время в поисках причины. Кажется, это довольно частая проблема, потому вот несколько советов по тому, как самостоятельно решить проблему, связанную с OCMOD.
</p>

<h2 style="background-color:#ffffff; color:#444444; font-size:21px; text-align:start">
	Что вызывает эту проблему?
</h2>

<p style="background-color:#ffffff; color:#000000; font-size:15px; text-align:start">
	В 100% случаев, которые возникали у нас, проблема была вызвана присутствием константы<span> </span><b>DIR_CATALOG</b><span> </span>в файле<span> </span><i>config.php</i>. Поскольку по умолчанию эта константа присутствует только в панели администратора, функция модификации проверяет, определена ли она и, если да, то ищет модификации в папке администратора. Таким образом, когда эта константа присутствует в части каталога, OpenCart путается и ищет модификации в папке администратора, но они обычно не присутствуют там, или эти модифицированные файлы имеют совершенно другую логику, и начинают возникать ошибки.
</p>

<h2 style="background-color:#ffffff; color:#444444; font-size:21px; text-align:start">
	Как решить эту проблему?
</h2>

<p style="background-color:#ffffff; color:#000000; font-size:15px; text-align:start">
	Будет лучше, если вы знаете, какое расширение/настройка используют константу<span> </span><b>DIR_CATALOG</b><span> </span>в каталоге, и свяжетесь с его разработчиком и попросите их внести исправления в расширение и убрать параметр из файла<span> </span><i>config.php</i>. Таким образом вы сохраните более чистую версию OpenCart, что поможет в будущем, когда вам нужно будет обновить систему.
</p>

<p style="background-color:#ffffff; color:#000000; font-size:15px; text-align:start">
	Ваш второй вариант состоит в том, чтобы модифицировать файл<span> </span><i>system/startup.php</i>. Откройте его и найдите функцию модификации. Она должна находиться где-то около середины файла и выглядит так:
</p>

<div style="background-color:#ffffff; color:#000000; font-size:15px; text-align:start">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5780_9" style=""><span class="pln">function modification($filename) {
if (!defined('DIR_CATALOG')) {
$file = DIR_MODIFICATION . 'catalog/' . substr($filename, strlen(DIR_APPLICATION));
} else {
$file = DIR_MODIFICATION . 'admin/' . substr($filename, strlen(DIR_APPLICATION));
}
if (substr($filename, 0, strlen(DIR_SYSTEM)) == DIR_SYSTEM) {
$file = DIR_MODIFICATION . 'system/' . substr($filename, strlen(DIR_SYSTEM));
}
if (is_file($file)) {
return $file;
}
return $filename;
}</span></pre>

	<p>
		Измените следующую строку:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5780_11" style=""><span class="pln">if (!defined('DIR_CATALOG')) {</span></pre>

	<p>
		на
	</p>
</div>

<div style="background-color:#ffffff; color:#000000; font-size:15px; text-align:start">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5780_7" style=""><span class="pln">if (basename(DIR_APPLICATION) == ‘catalog’) {</span></pre>

	<p>
		и это должно решить проблему.
	</p>
</div>
]]></description><guid isPermaLink="false">125</guid><pubDate>Sat, 19 Mar 2022 16:12:01 +0000</pubDate></item><item><title>&#x420;&#x430;&#x437;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x43F;&#x440;&#x43E;&#x43A;&#x441;&#x438; &#x432; OpenCart</title><link>http://opencartpascha.ru/topic/122-razbiraem-klass-proksi-v-opencart/</link><description><![CDATA[<p>
	Чаще всего мы принимаем что-то как должное. Если что-то работает так, как ожидалось, мы не будем беспокоиться о его внутренней работе, чтобы понять лежащий в основе механизм. Или, говоря иначе, мы не копаемся в чем-то, пока не будем в беде!
</p>

<p>
	Точно так же мне всегда было интересно узнать о нескольких концепциях OpenCart, которые использовались внутри фреймворка, и одним из них был класс Proxy. Мне потребовалось некоторое время, чтобы понять его, и я подумал, что с тобой приятно будет делиться, так как всегда интересно узнать что-то новое.
</p>

<p>
	Что такое класс прокси?
</p>

<p>
	Хотя вы найдете различные материалы в Интернете, которые определяют термин прокси, определение из Википедии  довольно легко понять.
</p>

<p>
	Прокси-сервер в его самой общей форме - это класс, функционирующий как интерфейс к чему-то другому.
</p>

<p>
	Таким образом, прокси делегирует элемент управления объекту, который он намеревается использовать, и таким образом действует от имени фактического класса, который был создан. Фактически, шаблон прокси-дизайна является очень популярным шаблоном, который используется популярными фреймворками по мере необходимости. Учитывая тот факт, что обсуждение прокси-метода само по себе является такой широкой темой и выходит за рамки этой статьи, я быстро подытожу, как он используется большую часть времени:
</p>

<p>
	Действует как обертка, чтобы обеспечить дополнительную функциональность.
</p>

<p>
	Задержка создания дорогостоящих объектов, также называемая ленивой загрузкой.
</p>

<p>
	В контексте OpenCart можно сказать, что шаблон прокси используется для добавления функциональности в базовый прокси-класс. Сказав это, базовый прокси-класс сам по себе не предоставляет ничего, кроме нескольких волшебных методов! Как мы увидим в следующем разделе, прокси-класс обогащается во время выполнения, добавляя к нему свойства.
</p>

<p>
	Прежде чем перейти к следующему разделу, давайте быстро взглянем на класс прокси.
</p>

<p>
	Он находится в<strong> system/engine/proxy.php.</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_5" style=""><span class="pun">&lt;?</span><span class="pln">php
 </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Proxy</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __get</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $this</span><span class="pun">-&gt;{</span><span class="pln">$key</span><span class="pun">};</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">   
     
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __set</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
         $this</span><span class="pun">-&gt;{</span><span class="pln">$key</span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $value</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
     
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> __call</span><span class="pun">(</span><span class="pln">$key</span><span class="pun">,</span><span class="pln"> $args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $arg_data </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">
         
        $args </span><span class="pun">=</span><span class="pln"> func_get_args</span><span class="pun">();</span><span class="pln">
         
        </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$args </span><span class="kwd">as</span><span class="pln"> $arg</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$arg </span><span class="kwd">instanceof</span><span class="pln"> </span><span class="typ">Ref</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                $arg_data</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=&amp;</span><span class="pln"> $arg</span><span class="pun">-&gt;</span><span class="pln">getRef</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                $arg_data</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=&amp;</span><span class="pln"> $arg</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
         
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;{</span><span class="pln">$key</span><span class="pun">}))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">      
            </span><span class="kwd">return</span><span class="pln"> call_user_func_array</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;{</span><span class="pln">$key</span><span class="pun">},</span><span class="pln"> $arg_data</span><span class="pun">);</span><span class="pln">   
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            $trace </span><span class="pun">=</span><span class="pln"> debug_backtrace</span><span class="pun">();</span><span class="pln">
             
            </span><span class="kwd">exit</span><span class="pun">(</span><span class="str">'&lt;b&gt;Notice&lt;/b&gt;:  Undefined property: Proxy::'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $key </span><span class="pun">.</span><span class="pln"> </span><span class="str">' in &lt;b&gt;'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $trace</span><span class="pun">[</span><span class="lit">1</span><span class="pun">][</span><span class="str">'file'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&lt;/b&gt; on line &lt;b&gt;'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $trace</span><span class="pun">[</span><span class="lit">1</span><span class="pun">][</span><span class="str">'line'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&lt;/b&gt;'</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
 </span><span class="pun">}</span></pre>

<p>
	Как вы можете видеть, он реализует три магических метода: __get(), __set() и __call(). Среди них реализация метода __call() является важной, и мы вернемся к ней довольно скоро.
</p>

<p>
	<strong>Как работает прокси-класс с моделью</strong>
</p>

<p>
	В этом разделе я объясню, как именно вызов типа $this-&gt;model_catalog_category-&gt;getCategory($category_id) работает из коробки.
</p>

<p>
	Фактически, история начинается со следующего утверждения.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_7" style=""><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Во время начальной загрузки оболочка OpenCart хранит все общие объекты в объекте Registry, чтобы их можно было получить по желанию. В результате этого вызов $this-&gt;load возвращает объект Loader из реестра.
</p>

<p>
	Класс Loader предоставляет различные методы для загрузки разных компонентов, но нас интересует метод model. Давайте быстро взглянем на фрагмент метода model из system/engine/ oader.php.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_9" style=""><span class="pln">public function model($route) {
    // Sanitize the call
    $route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
     
    // Trigger the pre events
    $this-&gt;registry-&gt;get('event')-&gt;trigger('model/' . $route . '/before', array(&amp;$route));
     
    if (!$this-&gt;registry-&gt;has('model_' . str_replace(array('/', '-', '.'), array('_', '', ''), $route))) {
        $file  = DIR_APPLICATION . 'model/' . $route . '.php';
        $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $route);
         
        if (is_file($file)) {
            include_once($file);
  
            $proxy = new Proxy();
             
            foreach (get_class_methods($class) as $method) {
                $proxy-&gt;{$method} = $this-&gt;callback($this-&gt;registry, $route . '/' . $method);
            }
             
            $this-&gt;registry-&gt;set('model_' . str_replace(array('/', '-', '.'), array('_', '', ''), (string)$route), $proxy);
        } else {
            throw new \Exception('Error: Could not load model ' . $route . '!');
        }
    }
     
    // Trigger the post events
    $this-&gt;registry-&gt;get('event')-&gt;trigger('model/' . $route . '/after', array(&amp;$route));
 }</span></pre>

<p>
	Учитывая вышеупомянутый пример, значением аргумента $route является catalog/category. Во-первых, значение переменной $route очищается и после этого запускает событие before, чтобы другие слушатели модуля могли изменить значение переменной $route.
</p>

<p>
	Затем он проверяет наличие запрошенного объекта модели в реестре. Если реестр содержит запрошенный объект, дальнейшая обработка не требуется.
</p>

<p>
	Если объект не найден, следует загрузить интересную процедуру, и это фрагмент, который мы ищем в контексте этой статьи.
</p>

<p>
	Для начала он подготавливает путь к файлу запрашиваемой модели и загружает ее, если она существует.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_11" style=""><span class="pln">...
 $file  = DIR_APPLICATION . 'model/' . $route . '.php';
 $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', $route);
  
 if (is_file($file)) {
     include_once($file);
  
   ...
 }
 ...</span></pre>

<p>
	После этого он создает объект Proxy.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_13" style=""><span class="pln">$proxy = new Proxy();</span></pre>

<p>
	Теперь обратите внимание на следующий цикл for: он намного больше, чем кажется.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_15" style=""><span class="pln">foreach (get_class_methods($class) as $method) {
    $proxy-&gt;{$method} = $this-&gt;callback($this-&gt;registry, $route . '/' . $method);
 }</span></pre>

<p>
	В нашем случае значение $class должно быть ModelCatalogCategory. Фрагмент get_class_methods($class) загружает все методы класса ModelCatalogCategory и проходит через него. Что он делает в цикле? Давайте посмотрим внимательно.
</p>

<p>
	В цикле он вызывает метод callback того же класса. Интересно отметить, что метод обратного вызова возвращает функцию, вызываемую для объекта $proxy с ключом в качестве имени метода. Конечно, прокси-объект не обладает такими свойствами; он будет создан на лету, используя магический метод __set()!
</p>

<p>
	Затем объект $ proxy добавляется в реестр, чтобы его можно было получить позже, когда это необходимо. Посмотрите на ключевой компонент метода set.
</p>

<p>
	В нашем случае это должна быть model_catalog_category.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_17" style=""><span class="pln">$this-&gt;registry-&gt;set('model_' . str_replace(array('/', '-', '.'), 
   array('_', '', ''), (string)$route), $proxy);</span></pre>

<p>
	В конце он вызовет событие after, чтобы другие слушатели модуля могли изменить значение переменной $route.
</p>

<p>
	Это одна часть истории.
</p>

<p>
	Давайте рассмотрим, что происходит, когда вы используете следующее в своем контроллере.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_19" style=""><span class="pln">$this-&gt;model_catalog_category-&gt;getCategory($category_id);</span></pre>

<p>
	Фрагмент $this-&gt;model_catalog_category пытается найти соответствие для ключа model_catalog_category в реестре. Если вам интересно, просто изучите определение класса Controller в файле system/engine/controller.php - он предоставляет магический метод __get(), который это делает.
</p>

<p>
	Как мы только что обсуждали, это должно вернуть объект $proxy, назначенный этому конкретному ключу. Затем он пытается вызвать метод getCategory для этого объекта. Но класс Proxy не реализует такой метод, так как это будет работать?
</p>

<p>
	Магический метод __call() приходит на помощь! Всякий раз, когда вы вызываете метод, который не существует в классе, элемент управления передается магическому методу __call().
</p>

<p>
	Давайте рассмотрим его подробно, чтобы понять, что происходит. Откройте файл класса Proxy и обратите внимание на этот метод.
</p>

<p>
	В $key содержится имя функции, которая называется-getCategory. С другой стороны, $args содержит аргументы, переданные методу, и он должен быть массивом из одного элемента, содержащего идентификатор категории, который передается.
</p>

<p>
	Далее, существует массив $arg_data, который хранит ссылки на аргументы. Честно говоря, я не уверен, что код $arg instanceof Ref имеет смысл. Если кто-нибудь знает, почему он там, я был бы рад узнать.
</p>

<p>
	Кроме того, он пытается проверить существование свойства $key в объекте $proxy, и это приводит к чему-то вроде этого.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_21" style=""><span class="pln">if (isset($this-&gt;getCategory)) {</span></pre>

<p>
	Напомним, что ранее мы назначили все методы класса ModelCatalogCategory как свойства объекта $proxy с использованием цикла for. Для вашего удобства я снова вставлю этот код.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_23" style=""><span class="pln">...
 foreach (get_class_methods($class) as $method) {
     $proxy-&gt;{$method} = $this-&gt;callback($this-&gt;registry, $route . '/' . $method);
 }
 ...</span></pre>

<p>
	Таким образом, он должен быть там, и он также должен вернуть нам функцию, которая вызывается! И, наконец, он вызывает эту функцию, вызываемую с помощью функции call_user_func_array, передавая аргументы метода.
</p>

<p>
	Теперь давайте обратим наше внимание на само вызываемое функцией определение. Я возьму фрагмент из метода callback, определенного в system/engine/ oader.php.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_25" style=""><span class="pln">...
 function($args) use($registry, &amp;$route) {
             static $model = array();             
              
             $output = null;
              
             // Trigger the pre events
             $result = $registry-&gt;get('event')-&gt;trigger('model/' . $route . '/before', array(&amp;$route, &amp;$args, &amp;$output));
              
             if ($result) {
                 return $result;
             }
              
             // Store the model object
             if (!isset($model[$route])) {
                 $file = DIR_APPLICATION . 'model/' .  substr($route, 0, strrpos($route, '/')) . '.php';
                 $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', substr($route, 0, strrpos($route, '/')));
  
                 if (is_file($file)) {
                     include_once($file);
                  
                     $model[$route] = new $class($registry);
                 } else {
                     throw new \Exception('Error: Could not load model ' . substr($route, 0, strrpos($route, '/')) . '!');
                 }
             }
  
             $method = substr($route, strrpos($route, '/') + 1);
              
             $callable = array($model[$route], $method);
  
             if (is_callable($callable)) {
                 $output = call_user_func_array($callable, $args);
             } else {
                 throw new \Exception('Error: Could not call model/' . $route . '!');
             }
              
             // Trigger the post events
             $result = $registry-&gt;get('event')-&gt;trigger('model/' . $route . '/after', array(&amp;$route, &amp;$args, &amp;$output));
              
             if ($result) {
                 return $result;
             }
                          
             return $output;
 };
 ...</span></pre>

<p>
	Поскольку это анонимная функция, она сохранила значения в виде переменных $register и $route, которые были переданы ранее методу callback. В этом случае значение переменной $route должно быть catalog/category/getCategory.
</p>

<p>
	Кроме того, если мы посмотрим на важный фрагмент этой функции, он создает экземпляр объекта ModelCatalogCategory и сохраняет его в статическом массиве $model.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_27" style=""><span class="pln">...
 // Store the model object
 if (!isset($model[$route])) {
     $file = DIR_APPLICATION . 'model/' .  substr($route, 0, strrpos($route, '/')) . '.php';
     $class = 'Model' . preg_replace('/[^a-zA-Z0-9]/', '', substr($route, 0, strrpos($route, '/')));
  
     if (is_file($file)) {
         include_once($file);
      
         $model[$route] = new $class($registry);
     } else {
         throw new \Exception('Error: Could not load model ' . substr($route, 0, strrpos($route, '/')) . '!');
     }
 }
 ...</span></pre>

<p>
	И вот фрагмент, который захватывает имя метода, которое нужно вызвать, используя переменную $route.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_29" style=""><span class="pln">$method = substr($route, strrpos($route, '/') + 1);</span></pre>

<p>
	Таким образом, мы имеем ссылку на объект и имя метода, которое позволяет нам вызывать его с помощью функции call_user_func_array. Следующий фрагмент делает именно это!
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1227_31" style=""><span class="pln">...
 if (is_callable($callable)) {
     $output = call_user_func_array($callable, $args);
 } else {
     throw new \Exception('Error: Could not call model/' . $route . '!');
 }
 ...</span></pre>

<p>
	В конце метода полученный результат возвращается через переменную $output. И да, это еще одна часть истории!
</p>

<p>
	Я намеренно игнорировал код pre и post events, который позволяет вам переопределять методы основных классов OpenCart. Используя это, вы можете переопределить любой метод основного класса и настроить его в соответствии с вашими потребностями. Но давайте сделаем в другой раз, так как это уже будет слишком много всего, чтобы вписаться в одну статью!
</p>

<p>
	Так вот как это работает. Я надеюсь, что вы должны быть более уверенны в этих коротких вызовах OpenCart и об их внутренней работе.
</p>

<p>
	<strong>Заключение</strong>
</p>

<p>
	То, что мы только что обсуждали, является одной из интересных и неоднозначных концепций в OpenCart: использование метода Proxy для поддержки сокращенных соглашений для вызова методов модели. Надеюсь, статья была достаточно интересна и обогатила ваши знания OpenCart.
</p>
]]></description><guid isPermaLink="false">122</guid><pubDate>Sat, 19 Mar 2022 16:01:07 +0000</pubDate></item><item><title>&#x41F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x44B; &#x432; OpenCart 2</title><link>http://opencartpascha.ru/topic/121-polzovatelskie-kontrollery-v-opencart-2/</link><description><![CDATA[<p>
	Сегодня мы рассмотрим концепцию контроллеров в OpenCart 2.x. С выпуском версии OpenCart 2.x они внедрили изменения фреймворка, требующие обновления, если вы сделали какие-либо пользовательские модули в более ранней версии - OpenCart 1.x. Мы рассмотрим практический пример того, что мы будем называть гостевой книгой в этом учебнике.
</p>

<p>
	Прежде чем двигаться дальше в этой статье, вы можете рассмотреть это как продолжение того, что я написал ранее. В этой статье я объяснил, как создать пользовательскую страницу в OpenCart 1.x, и если вы уже последовали этой статье, вы можете быстро пропустить большинство разделов сегодня!
</p>

<p>
	Конечно, это OpenCart 2.x, который будет обсуждаться сегодня, поэтому убедитесь, что вы внимательно следите за кодом.
</p>

<p>
	Если вы хотите узнать больше о шаблоне и контроллерах OpenCart, вы можете пройти пару первых разделов этой статьи. 
</p>

<p>
	<strong>Зачем вообще пользовательский контроллер?</strong>
</p>

<p>
	То, что вы можете спросить в первую очередь - почему пользовательский контроллер? Давайте быстро поймем, что такое контроллер в OpenCart, прежде чем мы займемся этим.
</p>

<p>
	В контексте OpenCart контроллер является незаменимым компонентом фреймворка, который напрямую связан с процессом маршрутизации и отображает пользовательский интерфейс. В этом процессе он рассматривает другие важные компоненты, такие как язык, модель и представление, чтобы построить окончательный результат.
</p>

<p>
	Когда вы открываете доступ к любой странице OpenCart, фреймворка OpenCart ищет соответствующий контроллер и делегирует ему дальнейшую обработку. Будучи модульным по своей природе, фреймворк OpenCart предоставляет несколько контроллеров, которые имеют дело с логически сгруппированными функциональными возможностями.
</p>

<p>
	Например, группа account содержит контроллеры, которые занимаются регистрацией, входом, профилем и аналогичными вариантами использования. Аналогично, группа контроллеров checkout обрабатывает процесс создания заказа.
</p>

<p>
	В двух словах, когда вы хотите создать функцию, которая не находится в ядре OpenCart, и если она использует новый URL-адрес в терминологии OpenCart, вы должны перейти на пользовательский контроллер. Он даст вам полный контроль над процессом создания страницы - какие элементы вы хотите отображать на своей странице.
</p>

<p>
	<strong>Создание пользовательского контроллера</strong>
</p>

<p>
	Сегодня мы реализуем базовую функциональность Guestbook, которая демонстрирует концепцию пользовательских контроллеров. В процессе этого мы создадим интерфейс, который позволит гостевым пользователям отправлять свои отзывы, введя свое имя и сообщение.
</p>

<p>
	Прежде чем продолжить, убедитесь, что у вас есть рабочая установка OpenCart 2.3.x. 
</p>

<p>
	Для тех, кто не знаком с фреймворком OpenCart, местом для поиска интерфейсных контроллеров является catalog/controller. Это каталог, который управляет всеми контроллерами по группам, основываясь на предоставляемых ими функциях.
</p>

<p>
	В нашем случае мы создадим отдельную группу под названием guestbook. Идем дальше и создаем каталог catalog/controller/guestbook. Внутри этого каталога создайте файл entry.php со следующим содержимым. Это файл контроллера, который обрабатывает логику приложения и логику отправки наших функций гостевой книги.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_5" style=""><span class="pun">&lt;?</span><span class="pln">php
 </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ControllerGuestbookEntry</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Controller</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">private</span><span class="pln"> $error </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">
  
   </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> index</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">(</span><span class="str">'guestbook/guestbook'</span><span class="pun">);</span><span class="pln">
  
     $this</span><span class="pun">-&gt;</span><span class="pln">document</span><span class="pun">-&gt;</span><span class="pln">setTitle</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'heading_title'</span><span class="pun">));</span><span class="pln">
  
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">server</span><span class="pun">[</span><span class="str">'REQUEST_METHOD'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'POST'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">validate</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(</span><span class="str">'guestbook/guestbook'</span><span class="pun">);</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'subject'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> sprintf</span><span class="pun">(</span><span class="str">'New guestbook entry submitted by %s'</span><span class="pun">,</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]);</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">];</span><span class="pln">
       $this</span><span class="pun">-&gt;</span><span class="pln">model_guestbook_guestbook</span><span class="pun">-&gt;</span><span class="pln">processGuestbookEntry</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">);</span><span class="pln">
       $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'text_success'</span><span class="pun">);</span><span class="pln">
       $this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">redirect</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'guestbook/entry'</span><span class="pun">,</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">];</span><span class="pln">
       unset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
       </span><span class="str">'text'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'text_home'</span><span class="pun">),</span><span class="pln">
       </span><span class="str">'href'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'common/home'</span><span class="pun">)</span><span class="pln">
     </span><span class="pun">);</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
       </span><span class="str">'text'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'heading_title'</span><span class="pun">),</span><span class="pln">
       </span><span class="str">'href'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'guestbook/entry'</span><span class="pun">,</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
     </span><span class="pun">);</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'heading_title'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'heading_title'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'entry_guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'entry_guest_name'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'entry_guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'entry_guest_message'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'entry_submit'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'entry_submit'</span><span class="pun">);</span><span class="pln">
  
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'error_guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">];</span><span class="pln">
     </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'error_guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'error_guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">];</span><span class="pln">
     </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'error_guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'action'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'guestbook/entry'</span><span class="pun">,</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
      
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">];</span><span class="pln">
     </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
      
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">];</span><span class="pln">
     </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $data</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  
     $data</span><span class="pun">[</span><span class="str">'column_left'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/column_left'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'column_right'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/column_right'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'content_top'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/content_top'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'content_bottom'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/content_bottom'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'footer'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/footer'</span><span class="pun">);</span><span class="pln">
     $data</span><span class="pun">[</span><span class="str">'header'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/header'</span><span class="pun">);</span><span class="pln">
  
     $this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">view</span><span class="pun">(</span><span class="str">'guestbook/entry'</span><span class="pun">,</span><span class="pln"> $data</span><span class="pun">));</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
  
   </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> validate</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">utf8_strlen</span><span class="pun">(</span><span class="pln">trim</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'error_guest_name'</span><span class="pun">);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
      
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">utf8_strlen</span><span class="pun">(</span><span class="pln">trim</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       $this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'error_guest_message'</span><span class="pun">);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  
     </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
 </span><span class="pun">}</span></pre>

<p>
	Согласно соглашениям об именах OpenCart, имя класса начинается с ключевого слова Controller, за которым следует имя каталога, Guestbook в нашем случае, в которой находится файл класса. Кроме того, имя файла класса, Entry в нашем случае, добавляется в конце.
</p>

<p>
	Каждый класс контроллера предоставляет де-факто метод index, который обрабатывает большую часть логики контроллера. Затем мы рассмотрим код в методе index, и при необходимости создадим другие файлы.
</p>

<p>
	В большинстве случаев мы начнем с включения языкового файла для конкретной группы. Таким образом OpenCart управляет ярлыками статического языка во всем приложении. Конечно, это делает внедрение многоязычных сайтов легче.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_7" style=""><span class="pln">$this-&gt;load-&gt;language('guestbook/guestbook');</span></pre>

<p>
	Прежде чем двигаться вперед, давайте создадим соответствующий языковой файл, чтобы наш контроллер мог его найти.
</p>

<p>
	Создайте файл catalog/language/en-gb/guestbook/guestbook.php со следующим содержимым.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_9" style=""><span class="pun">&lt;?</span><span class="pln">php
 </span><span class="com">// Heading</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'heading_title'</span><span class="pun">]</span><span class="pln">  </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Guestbook'</span><span class="pun">;</span><span class="pln">
  
 </span><span class="com">// Entry</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'entry_guest_name'</span><span class="pun">]</span><span class="pln">   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Your Name'</span><span class="pun">;</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'entry_guest_message'</span><span class="pun">]</span><span class="pln">   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Message'</span><span class="pun">;</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'entry_submit'</span><span class="pun">]</span><span class="pln">   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Submit'</span><span class="pun">;</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'text_success'</span><span class="pun">]</span><span class="pln">   </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Success: Your entry has been successfully submitted.'</span><span class="pun">;</span><span class="pln">
  
 </span><span class="com">// Error</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'error_guest_name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Please enter Your Name!'</span><span class="pun">;</span><span class="pln">
 $_</span><span class="pun">[</span><span class="str">'error_guest_message'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Please enter Message!'</span><span class="pun">;</span></pre>

<p>
	Как вы можете видеть, мы просто назначаем метки своими значениями в массиве языков.
</p>

<p>
	Вернемся к нашему контроллеру. Следующее - настроить тег заголовка HTML для нашей страницы.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_11" style=""><span class="pln">$this-&gt;document-&gt;setTitle($this-&gt;language-&gt;get('heading_title'));</span></pre>

<p>
	Внимательные читатели уже заметили, что мы использовали языковую переменную heading_title, определенную в языковом файле, созданном минуту назад.
</p>

<p>
	Чтобы понять следующий фрагмент кода, нам нужно создать файл модели.
</p>

<p>
	Поэтому на мгновение я отвлеку вас на создание файла модели в catalog/model/guestbook/guestbook.php со следующим содержимым.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_13" style=""><span class="pun">&lt;?</span><span class="pln">php
 </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ModelGuestbookGuestbook</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Model</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> processGuestbookEntry</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="com">// send email notification to store admin </span><span class="pln">
     $mail </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Mail</span><span class="pun">();</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">protocol </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_protocol'</span><span class="pun">);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">parameter </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_parameter'</span><span class="pun">);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">smtp_hostname </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_smtp_hostname'</span><span class="pun">);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">smtp_username </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_smtp_username'</span><span class="pun">);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">smtp_password </span><span class="pun">=</span><span class="pln"> html_entity_decode</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_smtp_password'</span><span class="pun">),</span><span class="pln"> ENT_QUOTES</span><span class="pun">,</span><span class="pln"> </span><span class="str">'UTF-8'</span><span class="pun">);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">smtp_port </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_smtp_port'</span><span class="pun">);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">smtp_timeout </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_mail_smtp_timeout'</span><span class="pun">);</span><span class="pln">
      
     $mail</span><span class="pun">-&gt;</span><span class="pln">setTo</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_email'</span><span class="pun">));</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">setFrom</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_email'</span><span class="pun">));</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">setSender</span><span class="pun">(</span><span class="pln">html_entity_decode</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_name'</span><span class="pun">),</span><span class="pln"> ENT_QUOTES</span><span class="pun">,</span><span class="pln"> </span><span class="str">'UTF-8'</span><span class="pun">));</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">setSubject</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">[</span><span class="str">'subject'</span><span class="pun">]);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">setText</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">[</span><span class="str">'message'</span><span class="pun">]);</span><span class="pln">
     $mail</span><span class="pun">-&gt;</span><span class="pln">send</span><span class="pun">();</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
 </span><span class="pun">}</span></pre>

<p>
	В OpenCart модель отвечает за обработку бизнес-логики приложения. Если вы хотите реализовать любую логику, которая включает базу данных, модель как раз для этого.
</p>

<p>
	Соглашение об именовании класса модели аналогично стандарту класса контроллера. Чтобы все было просто, мы внедрили метод processGuestbookEntry, который уведомляет администратора магазина по электронной почте, когда пользователь представляет запись в гостевой книге. Довольно просто, да?
</p>

<p>
	Вернемся к нашему контроллеру и рассмотрим следующий фрагмент кода в очереди.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_15" style=""><span class="pln">if (($this-&gt;request-&gt;server['REQUEST_METHOD'] == 'POST') &amp;&amp; $this-&gt;validate()) {
     $this-&gt;load-&gt;model('guestbook/guestbook');
   $data['subject'] = sprintf('New guestbook entry submitted by %s', $this-&gt;request-&gt;post['guest_name']);
    $data['message'] = $this-&gt;request-&gt;post['guest_message'];
    $this-&gt;model_guestbook_guestbook-&gt;processGuestbookEntry($data);
    $this-&gt;session-&gt;data['success'] = $this-&gt;language-&gt;get('text_success');
    $this-&gt;response-&gt;redirect($this-&gt;url-&gt;link('guestbook/entry', '', true));
 }</span></pre>

<p>
	Он проверяет действительный запрос POST и выполняет базовую проверку данных, отправленных пользователем, вызывая метод validate.
</p>

<p>
	Код $this-&gt;load-&gt;model('guestbook/guestbook') используется для загрузки модели, которую мы определили мгновение назад. Сразу же после этого мы готовим массив $data на основе ввода пользователя и вызываем метод processGuestbookEntry, который уведомляет администратора магазина о новой записи в гостевой книге. Наконец, мы перенаправляем пользователя обратно на страницу ввода гостевой книги.
</p>

<p>
	Двигаясь вперед в контроллере, следующий фрагмент устанавливает сообщение об успешном завершении, которое будет отображаться при отправке формы.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_17" style=""><span class="pln">$data['success'] = '';
 if (isset($this-&gt;session-&gt;data['success'])) {
     $data['success'] = $this-&gt;session-&gt;data['success'];
    unset($this-&gt;session-&gt;data['success']);
 }</span></pre>

<p>
	После этого есть фрагмент, который используется для создания набора ссылок для страницы.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_19" style=""><span class="pln">$data['breadcrumbs'] = array();
  
 $data['breadcrumbs'][] = array(
     'text' =&gt; $this-&gt;language-&gt;get('text_home'),
    'href' =&gt; $this-&gt;url-&gt;link('common/home')
 );
  
 $data['breadcrumbs'][] = array(
    'text' =&gt; $this-&gt;language-&gt;get('heading_title'),
    'href' =&gt; $this-&gt;url-&gt;link('guestbook/entry', '', true)
 );</span></pre>

<p>
	Следующий фрагмент является важным, и это то, что вы будете использовать большую часть времени для передачи информации из метода контроллера в шаблон представления.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_21" style=""><span class="pln">$data['heading_title'] = $this-&gt;language-&gt;get('heading_title');
 $data['entry_guest_name'] = $this-&gt;language-&gt;get('entry_guest_name');
 $data['entry_guest_message'] = $this-&gt;language-&gt;get('entry_guest_message');
 $data['entry_submit'] = $this-&gt;language-&gt;get('entry_submit');</span></pre>

<p>
	Аналогично назначению переменных OpenCart инициализирует общие элементы заголовка страницы, нижнего колонтитула и тому подобного, как показано в следующем фрагменте.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_23" style=""><span class="pln">$data['column_left'] = $this-&gt;load-&gt;controller('common/column_left');
 $data['column_right'] = $this-&gt;load-&gt;controller('common/column_right');
 $data['content_top'] = $this-&gt;load-&gt;controller('common/content_top');
 $data['content_bottom'] = $this-&gt;load-&gt;controller('common/content_bottom');
 $data['footer'] = $this-&gt;load-&gt;controller('common/footer');
 $data['header'] = $this-&gt;load-&gt;controller('common/header');</span></pre>

<p>
	Наконец, он вызывает шаблон представления, чтобы отобразить фактическую страницу!
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_25" style=""><span class="pln">$this-&gt;response-&gt;setOutput($this-&gt;load-&gt;view('guestbook/entry', $data));</span></pre>

<p>
	Конечно, мы еще не создали шаблон представления. Это идеальное время для этого! Идем дальше и создаем  файл catalog/view/theme/default/template/guestbook/entry.tpl со следующим содержимым.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2585_27" style=""><span class="pun">&lt;?</span><span class="pln">php echo $header</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
 </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
   </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"breadcrumb"</span><span class="tag">&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$breadcrumbs </span><span class="kwd">as</span><span class="pln"> $breadcrumb</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="tag">&lt;li&gt;</span><span class="pln">&lt;a href="</span><span class="pun">&lt;?</span><span class="pln">php echo $breadcrumb</span><span class="pun">[</span><span class="str">'href'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $breadcrumb</span><span class="pun">[</span><span class="str">'text'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
   </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
   </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$success</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"alert alert-success"</span><span class="tag">&gt;&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-check-circle"</span><span class="tag">&gt;&lt;/i&gt;</span><span class="pln"> </span><span class="pun">&lt;?</span><span class="pln">php echo $success</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/div&gt;</span><span class="pln">
   </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
   </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $column_left</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$column_left </span><span class="pun">&amp;&amp;</span><span class="pln"> $column_right</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php $class </span><span class="pun">=</span><span class="pln"> </span><span class="str">'col-sm-6'</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> elseif </span><span class="pun">(</span><span class="pln">$column_left </span><span class="pun">||</span><span class="pln"> $column_right</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php $class </span><span class="pun">=</span><span class="pln"> </span><span class="str">'col-sm-9'</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php $class </span><span class="pun">=</span><span class="pln"> </span><span class="str">'col-sm-12'</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     &lt;div id="content" class="</span><span class="pun">&lt;?</span><span class="pln">php echo $class</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $content_top</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
       </span><span class="tag">&lt;h1&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $heading_title</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
       &lt;form action="</span><span class="pun">&lt;?</span><span class="pln">php echo $action</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" method="post" enctype="multipart/form-data" class="form-horizontal"&gt;
           </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-group required"</span><span class="tag">&gt;</span><span class="pln">
             </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-2 control-label"</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"input-guest-name"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_guest_name</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/label&gt;</span><span class="pln">
             </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-10"</span><span class="tag">&gt;</span><span class="pln">
               &lt;input type="text" value="</span><span class="pun">&lt;?</span><span class="pln">php echo $guest_name</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" name="guest_name" placeholder="</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_guest_name</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" id="input-guest-name" class="form-control" size="10" /&gt;
               </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$error_guest_name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
               </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-danger"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $error_guest_name</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/div&gt;</span><span class="pln">
               </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
             </span><span class="tag">&lt;/div&gt;</span><span class="pln">
           </span><span class="tag">&lt;/div&gt;</span><span class="pln">
           </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-group required"</span><span class="tag">&gt;</span><span class="pln">
             </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-2 control-label"</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"input-guest-message"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_guest_message</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/label&gt;</span><span class="pln">
             </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-10"</span><span class="tag">&gt;</span><span class="pln">
               &lt;textarea name="guest_message" placeholder="</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_guest_message</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" id="input-guest-message" class="form-control"&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $guest_message</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/textarea&gt;</span><span class="pln">
               </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$error_guest_message</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
               </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-danger"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $error_guest_message</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/div&gt;</span><span class="pln">
               </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
             </span><span class="tag">&lt;/div&gt;</span><span class="pln">
           </span><span class="tag">&lt;/div&gt;</span><span class="pln">
           </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-group required"</span><span class="tag">&gt;</span><span class="pln">
             </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-2"</span><span class="tag">&gt;</span><span class="pln">&amp;nbsp;</span><span class="tag">&lt;/label&gt;</span><span class="pln">
             </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-10"</span><span class="tag">&gt;</span><span class="pln">
               &lt;input type="submit" value="</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_submit</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" class="btn btn-primary" /&gt;
             </span><span class="tag">&lt;/div&gt;</span><span class="pln">
           </span><span class="tag">&lt;/div&gt;</span><span class="pln">
       </span><span class="tag">&lt;/form&gt;</span><span class="pln">
       </span><span class="pun">&lt;?</span><span class="pln">php echo $content_bottom</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/div&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php echo $column_right</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/div&gt;</span><span class="pln">
 </span><span class="tag">&lt;/div&gt;</span><span class="pln">
 </span><span class="pun">&lt;?</span><span class="pln">php echo $footer</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	Это наш основной файл шаблона, который отвечает за отображение содержимого нашей страницы гостевой книги. В этом файле мы только что использовали переменные, которые были настроены в методе контроллера index.
</p>

<p>
	Важно отметить, что отзывчивость - это то, что поставляется с новейшими версиями OpenCart, поддерживаемыми платформой Bootstrap. Помимо этого, это довольно обычный HTML, который довольно просто понять.
</p>

<p>
	Итак, это то что касается настройки файлов.
</p>

<p>
	У нас все готово, но как вы получите доступ к этому из front-end?
</p>

<p>
	На фронтенде вы можете получить доступ к странице «Гостевая книга», добавив переменную переадресации маршрута, поэтому URL-адрес должен быть похож на http://your-opencart-store-url/index.php?route=guestbook/entry.
</p>

<p>
	Давайте разбираться, как OpenCart сопоставляет любой URL-адрес с конкретным файлом контроллера.
</p>

<p>
	Формат переменной маршрута - {directory}/{filename}/{methodname}.
</p>

<p>
	Компонент {directory} отображается в каталог catalog/controller.
</p>

<p>
	{filename} сопоставляется с именем файла контроллера в catalog/controller/{directory}.
</p>

<p>
	Наконец, он будет искать метод контроллера с именем {methodname}, если он указан в маршруте, иначе он вызовет метод index по умолчанию.‘
</p>

<p>
	Вот как выглядит конечный результат.
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="76" data-unique="mka4zvhpr" width="850" alt="custom-controllers-opencart-2.png" src="http://opencartpascha.ru/uploads/monthly_2022_03/custom-controllers-opencart-2.png.2c3ef795b91c76b95502cd740679a4cb.png" loading="lazy" height="391">
</p>

<p>
	Конечно, вы можете пойти дальше и протестировать его, отправив форму, и вы должны получить уведомление по электронной почте на адрес электронной почты, зарегистрированный в качестве администратора магазина.
</p>

<p>
	<strong>Заключение</strong>
</p>

<p>
	В любом фреймворке всегда интересно продолжить реализацию собственных пользовательских функций. Это стало предметом сегодняшнего учебника, в котором мы расширили OpenCart и разработали пользовательские контроллеры, создав довольно простую, но полезную функциональность гостевой книги.
</p>

<p>
	В этом процессе мы поняли, что речь идет не только о контроллерах - было несколько других ключевых элементов, которые были неизбежны. Поэтому мы также создали их: модель, язык и представление.
</p>

<p>
	В конце было приятно видеть рабочий прецедент того, что я обещал в начале статьи.
</p>
]]></description><guid isPermaLink="false">121</guid><pubDate>Sat, 19 Mar 2022 15:51:44 +0000</pubDate></item><item><title>&#x418;&#x43D;&#x442;&#x435;&#x433;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x445; &#x431;&#x438;&#x431;&#x43B;&#x438;&#x43E;&#x442;&#x435;&#x43A; &#x432; OpenCart &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; Composer</title><link>http://opencartpascha.ru/topic/120-integraciya-vneshnih-bibliotek-v-opencart-s-pomoschyu-composer/</link><description><![CDATA[<p>
	В настоящее время почти каждый фреймворк имеет встроенную поддержку Composer, потрясающего инструмента управления зависимостями в PHP, и OpenCart не является исключением. Из этого руководства вы узнаете, как использовать Composer для интеграции внешних библиотек в OpenCart.
</p>

<p>
	<strong>Роль Composer в OpenCart</strong>
</p>

<p>
	После представления OpenCart 2.2 поддерживается рабочий процесс на основе Composer. Так что, идите и возьмите последнюю версию OpenCart; как написано это — 2.3.0.2. Убедитесь, что вы установили и настроили последнюю загруженную версию, так как это пригодится нам позже в этой статье.
</p>

<p>
	Посмотрите структуру каталогов, и вы заметите некоторые отличия от более ранних версий OpenCart. Касательно этой статьи интересными кандидатами будут файл composer.json и каталог vendor.
</p>

<p>
	Давайте быстренько пройдемся по файлу composer.json.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9115_5" style=""><span class="pln">{
    "name": "opencart/opencart",
    "type": "project",
    "description": "OpenCart",
    "keywords": ["opencart", "ecommerce", "framework", "opensource"],
    "homepage": "https://www.opencart.com",
    "license": "GPL-3.0+",
    "require": {
        "cardinity/cardinity-sdk-php": "^1.0",
        "braintree/braintree_php" : "3.2.0",
        "leafo/scssphp": "0.0.12",
        "divido/divido-php": "&gt;=1.1.1",
        "klarna/kco_rest": "^2.2",
        "php": "&gt;=5.4.0"
    }
}</span></pre>

<p>
	Хотя обсуждение синтаксиса Composer выходит за рамки этой статьи, давайте быстро рассмотрим то, что говорится в определениях для непрофессионала.
</p>

<p>
	Во-первых, сам проект OpenCart теперь доступен как библиотека, поэтому вы можете установить его, используя Composer, не загружая его с сайта вручную. Кроме того, также требуется, чтобы другие сторонние библиотеки работали должным образом, такие как divo, leafo и т.д. Конечно, вам не нужно беспокоиться об этом, поскольку они будет обработанный автоматически при выполнении соответствующих команд Composer.
</p>

<p>
	Когда вы устанавливаете новую библиотеку, в файл composer.json будет добавлена соответствующая запись. Связанные файлы библиотеки помещаются в каталог vendor на том же уровне. Просто просмотрите этот каталог, и вы увидите, что библиотеки уже установлены!
</p>

<p>
	Каталог vendor также содержит файл autoload.php, сгенерированный самим Composer, который обеспечивает автоматическую загрузку библиотек в OpenCart, поэтому вы можете сразу использовать его. Конечно, OpenCart включает autoload.php при начальной загрузке проекта.
</p>

<p>
	Итак, это краткое введение в то, как Composer работает с OpenCart. В демонстрационных целях мы установим популярную библиотеку PHPMailer, используя Composer.
</p>

<p>
	<strong>Установка PHPMailer с помощью Composer</strong>
</p>

<p>
	PHPMailer — популярная библиотека PHP, которая используется для отправки электронных писем. Мы установим его в OpenCart с помощью Composer. Для этого, перейдите в свой терминал и измените каталог, чтобы вы находились на том же уровне, где находятся каталог vendor и файл composer.json.
</p>

<p>
	Теперь запустите команду composer require phpmailer/phpmailer и нажмите enter! Полагая, что все идет хорошо, ответ должен выглядеть следующим образом.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9115_7" style=""><span class="pln">$composer require phpmailer/phpmailer
Using version ^5.2 for phpmailer/phpmailer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing phpmailer/phpmailer (v5.2.16)
    Downloading: 100%         
 
 
phpmailer/phpmailer suggests installing league/oauth2-google (Needed for Google XOAUTH2 authentication)
Writing lock file
Generating autoload files</span></pre>

<p>
	Вот и всё! PHPMailer успешно загружен и установлен, в этом и есть вся прелесть Composer! Убедитесь, что заглянув в каталог vendor, вы найдете его установленным в каталог phpmailer/phpmailer.
</p>

<p>
	Также, давайте откроем composer.json, чтобы посмотреть как он выглядит.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9115_9" style=""><span class="pln">{
    "name": "opencart/opencart",
    "type": "project",
    "description": "OpenCart",
    "keywords": ["opencart", "ecommerce", "framework", "opensource"],
    "homepage": "http://www.opencart.com",
    "license": "GPL-3.0+",
    "require": {
        "cardinity/cardinity-sdk-php": "^1.0",
        "braintree/braintree_php" : "3.2.0",
        "leafo/scssphp": "0.0.12",
        "divido/divido-php": "&gt;=1.1.1",
        "klarna/kco_rest": "^2.2",
        "php": "&gt;=5.4.0",
        "phpmailer/phpmailer": "^5.2"
    }
}</span></pre>

<p>
	Как видите, запись "phpmailer/phpmailer": "^5.2" добавлена в раздел require. Это означает, что для правильной работы вашему проекту нужeн PHPMailer
</p>

<p>
	Давайте предположим, что вы работаете с другими разработчиками и вам нужно регулярно делиться вашей работой. В этом случае, вам нужно передать только ваш файл composer.json, а обо всём остальном позаботиться Composer! Им потребуется только выполнить команду composer update, это обеспечит установку требуемых зависимостей в их копии!
</p>

<p>
	Ну вот, мы установили PHPMailer используя Composer, но как его использовать? Не беспокойтесь, я не оставлю вас так быстро — это точный рецепт нашего следующего раздела!
</p>

<p>
	Как использовать библиотеку PHPMailer?
</p>

<p>
	Вы уже сделали себе одолжение, использовав Composer для установки библиотеки PHPMailer, и вы будете свидетелем того, как в этом разделе мы рассмотрим то, насколько просто его использовать в примерах кода.
</p>

<p>
	В целях примера, мы создадим довольно простой файл с пользовательским контроллером, который вы можете вызывать для отправки email.
</p>

<p>
	Откройте ваш любимый текстовый редактор и создайте example/email.php внутри каталога catalog/controller со следующим содержимым.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9115_11" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ControllerExampleEmail</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Controller</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> index</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// just instantiate the mailer object, no need to include anything to use it.</span><span class="pln">
    $objPhpMailer </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">PHPMailer</span><span class="pun">();</span><span class="pln">
 
 
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">From</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"sender@example.com"</span><span class="pun">;</span><span class="pln">
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">FromName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sajal Soni"</span><span class="pun">;</span><span class="pln">
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">AddAddress</span><span class="pun">(</span><span class="str">"receiver@example.com"</span><span class="pun">);</span><span class="pln">
 
 
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">WordWrap</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">50</span><span class="pun">;</span><span class="pln">
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">IsHTML</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
 
 
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">Subject</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Subject"</span><span class="pun">;</span><span class="pln">
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">Body</span><span class="pln">    </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;h2&gt;HTML Body&lt;/h2&gt;"</span><span class="pun">;</span><span class="pln">
    $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">AltBody</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Plain Body"</span><span class="pun">;</span><span class="pln">
 
 
    </span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">$objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">Send</span><span class="pun">())</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
       echo </span><span class="str">"Message could not be sent. &lt;p&gt;"</span><span class="pun">;</span><span class="pln">
       echo </span><span class="str">"Mailer Error: "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $objPhpMailer</span><span class="pun">-&gt;</span><span class="typ">ErrorInfo</span><span class="pun">;</span><span class="pln">
       </span><span class="kwd">exit</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
 
 
    echo </span><span class="str">"Message has been sent"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">exit</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	В методе index, вы видите, что мы создали экземпляр объекта PHPMailer без каких-либо указаний include, которые должны были включить требуемый класс PHPMailer, если бы мы не использовали рабочий процесс на основе Composer. Вы все поняли правильно, OpenCart Напомним, что autoload.php в каталоге vendor осуществляет всю эту магию!
</p>

<p>
	Вследствие этого есть некая довольно стандартная вещь, требуемая PHPMailer для отправки email. Конечно, я пытался сделать пример настолько просто насколько возможно, так как для обсуждения PHPMailer потребуется отдельная статья.
</p>

<p>
	Так что, это было быстрое и простое введение в то, как вы можете использовать Composer с OpenCart для интеграции со сторонними библиотеками.
</p>

<p>
	<strong>Выводы</strong>
</p>

<p>
	В этой статье мы только вскарабкались на поверхность рабочего процесса на основе Composer в OpenCart, чтобы использовать сторонние библиотеки в вашем проекте. Не говоря уже о том, что Composer — это будущее инструментов управления зависимостями в PHP. Поэтому всегда хорошо запачкать в этом ваши руки, поскольку это становится стандартом во всех популярных фреймворках.
</p>
]]></description><guid isPermaLink="false">120</guid><pubDate>Sat, 19 Mar 2022 15:40:45 +0000</pubDate></item><item><title>&#x412;&#x44B;&#x432;&#x43E;&#x434; &#x43E;&#x448;&#x438;&#x431;&#x43E;&#x43A; PHP &#x43D;&#x430; &#x44D;&#x43A;&#x440;&#x430;&#x43D;</title><link>http://opencartpascha.ru/topic/119-vyvod-oshibok-php-na-ekran/</link><description><![CDATA[<p>
	При работе с сайтом каждый разработчик сталкивался с ситуацией, когда при включении модуля, добавления своего кода или другого изменения на сайте, возникал так называемый WHITE SCREEN OF DEATH (белый экран смерти), который обычно вызван ошибкой PHP. Первое действие разработчика, естественно, откатить изменения, повлёкшие за собой эту ошибку. Но ведь ошибку-то исправлять надо, а значит, надо посмотреть что именно является причиной её возникновения.
</p>

<p>
	<strong>Включение вывода ошибок на экран через .htaccess</strong>
</p>

<p>
	В корне имеется файл .htaccess, который регулирует процессы загрузки страниц. Чтобы включить вывод сообщений, откройте его и добавьте следующие две строки:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1857_5" style=""><span class="pln">php_flag display_errors on
php_flag display_startup_errors on</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">119</guid><pubDate>Sat, 19 Mar 2022 15:29:34 +0000</pubDate></item><item><title>&#x421;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x435; &#x432; opencart 3</title><link>http://opencartpascha.ru/topic/118-sobytie-v-opencart-3/</link><description><![CDATA[<p>
	Думаю многие разработчики сталкивались с ситуацией, когда нужно выполнить какое-то действие при определенном событии на сайте. Многие сразу делают врезку через модификатор в нужный контроллер или модель со своей логикой. Но на мой взгляд это в корне не правильно, учитывая тот факт, что в опенкарт давно уже есть функционала событий который позволяет переопределить данные или выполнить свой скрипт в момент определенного события на сайте.
</p>

<p>
	Предлагаю разобрать как все работает на реальном примере. Реализуем простую отправку данных о заказе на сторонний сервис.
</p>

<p>
	Создаем модуль
</p>

<p>
	Для того что бы мы могли создать событие нужно для начала создать самый простой модуль и повесить на его активацию установку нашего события.
</p>

<p>
	Создаем контроллер модуля в админке
</p>

<p>
	Идем в папку admin/controller/extension/module и создаем файл mymodule.php со следующим содержимым:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2156_6" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ControllerExtensionModuleMymodule</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Controller</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">//Сработает только 1 раз при установке</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> install</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(</span><span class="str">'setting/event'</span><span class="pun">);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">model_setting_event</span><span class="pun">-&gt;</span><span class="pln">addEvent</span><span class="pun">(</span><span class="str">'sm-send-order-1c'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'catalog/model/checkout/order/addOrder/after'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'extension/module/mymodule/Send'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">//Сработает только 1 раз при удалении (удалит действие)</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> uninstall</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(</span><span class="str">'setting/event'</span><span class="pun">);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">model_setting_event</span><span class="pun">-&gt;</span><span class="pln">deleteEvent</span><span class="pun">(</span><span class="str">'sm-send-order-1c'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">private</span><span class="pln"> $error </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> index</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">(</span><span class="str">'extension/module/mymodule'</span><span class="pun">);</span><span class="pln">

$this</span><span class="pun">-&gt;</span><span class="pln">document</span><span class="pun">-&gt;</span><span class="pln">setTitle</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'heading_title'</span><span class="pun">));</span><span class="pln">

$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(</span><span class="str">'setting/setting'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">server</span><span class="pun">[</span><span class="str">'REQUEST_METHOD'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'POST'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">validate</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">model_setting_setting</span><span class="pun">-&gt;</span><span class="pln">editSetting</span><span class="pun">(</span><span class="str">'module_mymodule'</span><span class="pun">,</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">);</span><span class="pln">

$this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'text_success'</span><span class="pun">);</span><span class="pln">

$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">redirect</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'marketplace/extension'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'user_token='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'user_token'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&amp;type=module'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'warning'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'error_warning'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'warning'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'error_warning'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
</span><span class="str">'text'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'text_home'</span><span class="pun">),</span><span class="pln">
</span><span class="str">'href'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'common/dashboard'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'user_token='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'user_token'</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
</span><span class="str">'text'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'text_extension'</span><span class="pun">),</span><span class="pln">
</span><span class="str">'href'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'marketplace/extension'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'user_token='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'user_token'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&amp;type=module'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'breadcrumbs'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
</span><span class="str">'text'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'heading_title'</span><span class="pun">),</span><span class="pln">
</span><span class="str">'href'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'extension/module/mymodule'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'user_token='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'user_token'</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'action'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'extension/module/mymodule'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'user_token='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'user_token'</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'cancel'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'marketplace/extension'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'user_token='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[</span><span class="str">'user_token'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'&amp;type=module'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'module_mymodule_status'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'module_mymodule_status'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[</span><span class="str">'module_mymodule_status'</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'module_mymodule_status'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'module_mymodule_status'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$data</span><span class="pun">[</span><span class="str">'header'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/header'</span><span class="pun">);</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'column_left'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/column_left'</span><span class="pun">);</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'footer'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">'common/footer'</span><span class="pun">);</span><span class="pln">

$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">view</span><span class="pun">(</span><span class="str">'extension/module/mymodule'</span><span class="pun">,</span><span class="pln"> $data</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> validate</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">user</span><span class="pun">-&gt;</span><span class="pln">hasPermission</span><span class="pun">(</span><span class="str">'modify'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'extension/module/mymodule'</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">[</span><span class="str">'warning'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'error_permission'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> </span><span class="pun">!</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">error</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	Сосредоточимся на двух функциях:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2156_8" style=""><span class="pln">public function install() {
$this-&gt;load-&gt;model('setting/event');
$this-&gt;model_setting_event-&gt;addEvent('sm-send-order-1c', 'catalog/model/checkout/order/addOrder/after', 'extension/module/mymodule/Send');
}</span></pre>

<p>
	Тут мы регистрируем наше событие в момент установки модуля. Вызываем метод “addEvent” и передаем туда 3 параметра:
</p>

<p>
	1.'sm-send-order-1c' - название события (произвольное)
</p>

<p>
	2.'catalog/model/checkout/order/addOrder/after' - путь к контроллеру, модели, языку или загрузчику шаблона.
</p>

<p>
	У нас мы указали путь к модели создания заказа.
</p>

<p>
	Обратите внимание данный параметр состоит с двух частей 2.1. catalog/model/checkout/order/addOrder - непосредственно пусть к модели
</p>

<p>
	2.2 after - время выполнения вашего нового события.
</p>

<p>
	Если after то ваш код будет выполнен уже после выполнения основного кода Функции "addOrder".
</p>

<p>
	Если вы укажете before - то сначала выполниться ваш код, а потом уже остальной код.
</p>

<p>
	Нас интересует выполнение уже после добавления заказа.
</p>

<p>
	Поэтому мы указали after. 3. 'extension/module/mymodule/Send' - путь к функции нашего контроллера где будет описана вся логика которую надо выполнить после создания заказа (отправка данных о заказе на сторонний сервис)
</p>

<p>
	 
</p>

<p>
	Вторая функция - это функция удаления события.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2156_10" style=""><span class="pln">public function uninstall() {
$this-&gt;load-&gt;model('setting/event');
$this-&gt;model_setting_event-&gt;deleteEvent('sm-send-order-1c');
}</span></pre>

<p>
	Создаем файл шаблона модуля twig
</p>

<p>
	Создаем файл mymodule.twig в папке admin\view\template\extension\module\mymodule.twig с кодом:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2156_12" style=""><span class="pln">{{ header }}{{ column_left }}
</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"content"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"page-header"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container-fluid"</span><span class="tag">&gt;</span><span class="pln">
            </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"pull-right"</span><span class="tag">&gt;</span><span class="pln">
                </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">form</span><span class="pun">=</span><span class="atv">"form-module"</span><span class="pln"> </span><span class="atn">data-toggle</span><span class="pun">=</span><span class="atv">"tooltip"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"{{ button_save }}"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"btn btn-primary"</span><span class="tag">&gt;&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-save"</span><span class="tag">&gt;&lt;/i&gt;&lt;/button&gt;</span><span class="pln">
                </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"{{ cancel }}"</span><span class="pln"> </span><span class="atn">data-toggle</span><span class="pun">=</span><span class="atv">"tooltip"</span><span class="pln"> </span><span class="atn">title</span><span class="pun">=</span><span class="atv">"{{ button_cancel }}"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"btn btn-default"</span><span class="tag">&gt;&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-reply"</span><span class="tag">&gt;&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;</span><span class="pln">
            </span><span class="tag">&lt;h1&gt;</span><span class="pln">{{ heading_title }}</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
            </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"breadcrumb"</span><span class="tag">&gt;</span><span class="pln">
                {% for breadcrumb in breadcrumbs %}
                    </span><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"{{ breadcrumb.href }}"</span><span class="tag">&gt;</span><span class="pln">{{ breadcrumb.text }}</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span><span class="pln">
                {% endfor %}
            </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
        </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container-fluid"</span><span class="tag">&gt;</span><span class="pln">
        {% if error_warning %}
            </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"alert alert-danger alert-dismissible"</span><span class="tag">&gt;&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-exclamation-circle"</span><span class="tag">&gt;&lt;/i&gt;</span><span class="pln"> {{ error_warning }}
                </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"close"</span><span class="pln"> </span><span class="atn">data-dismiss</span><span class="pun">=</span><span class="atv">"alert"</span><span class="tag">&gt;</span><span class="pln">&amp;times;</span><span class="tag">&lt;/button&gt;</span><span class="pln">
            </span><span class="tag">&lt;/div&gt;</span><span class="pln">
        {% endif %}
        </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"panel panel-default"</span><span class="tag">&gt;</span><span class="pln">
            </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"panel-heading"</span><span class="tag">&gt;</span><span class="pln">
                </span><span class="tag">&lt;h3</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"panel-title"</span><span class="tag">&gt;&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-pencil"</span><span class="tag">&gt;&lt;/i&gt;</span><span class="pln"> {{ text_edit }}</span><span class="tag">&lt;/h3&gt;</span><span class="pln">
            </span><span class="tag">&lt;/div&gt;</span><span class="pln">
            </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"panel-body"</span><span class="tag">&gt;</span><span class="pln">
                </span><span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">action</span><span class="pun">=</span><span class="atv">"{{ action }}"</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"post"</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">"multipart/form-data"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"form-module"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-horizontal"</span><span class="tag">&gt;</span><span class="pln">
                    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-group"</span><span class="tag">&gt;</span><span class="pln">
                        </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-2 control-label"</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"input-status"</span><span class="tag">&gt;</span><span class="pln">{{ entry_status }}</span><span class="tag">&lt;/label&gt;</span><span class="pln">
                        </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-sm-10"</span><span class="tag">&gt;</span><span class="pln">
                            </span><span class="tag">&lt;select</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"module_mymodule_status"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"input-status"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-control"</span><span class="tag">&gt;</span><span class="pln">
                                {% if module_mymodule_status %}
                                    </span><span class="tag">&lt;option</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln"> </span><span class="atn">selected</span><span class="pun">=</span><span class="atv">"selected"</span><span class="tag">&gt;</span><span class="pln">{{ text_enabled }}</span><span class="tag">&lt;/option&gt;</span><span class="pln">
                                    </span><span class="tag">&lt;option</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"0"</span><span class="tag">&gt;</span><span class="pln">{{ text_disabled }}</span><span class="tag">&lt;/option&gt;</span><span class="pln">
                                {% else %}
                                    </span><span class="tag">&lt;option</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"1"</span><span class="tag">&gt;</span><span class="pln">{{ text_enabled }}</span><span class="tag">&lt;/option&gt;</span><span class="pln">
                                    </span><span class="tag">&lt;option</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="atn">selected</span><span class="pun">=</span><span class="atv">"selected"</span><span class="tag">&gt;</span><span class="pln">{{ text_disabled }}</span><span class="tag">&lt;/option&gt;</span><span class="pln">
                                {% endif %}
                            </span><span class="tag">&lt;/select&gt;</span><span class="pln">
                        </span><span class="tag">&lt;/div&gt;</span><span class="pln">
                    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
                </span><span class="tag">&lt;/form&gt;</span><span class="pln">
            </span><span class="tag">&lt;/div&gt;</span><span class="pln">
        </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span><span class="pln">
{{ footer }}</span></pre>

<p>
	Здесь я думаю все всем понятно и по сути нечего объяснять.
</p>

<p>
	Дальше нужно создать файл переводов в папке admin\language\ru-ru\extension\module\mymodule.php с кодом:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2156_14" style=""><span class="pun">&lt;?</span><span class="pln">php


</span><span class="com">// Heading</span><span class="pln">
$_</span><span class="pun">[</span><span class="str">'heading_title'</span><span class="pun">]</span><span class="pln">    </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Мой новый модуль с событием отправки заказа'</span><span class="pun">;</span><span class="pln">

$_</span><span class="pun">[</span><span class="str">'text_module'</span><span class="pun">]</span><span class="pln">      </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Модули'</span><span class="pun">;</span><span class="pln">
$_</span><span class="pun">[</span><span class="str">'text_success'</span><span class="pun">]</span><span class="pln">     </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Настройки успешно изменены!'</span><span class="pun">;</span><span class="pln">
$_</span><span class="pun">[</span><span class="str">'text_edit'</span><span class="pun">]</span><span class="pln">        </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Редактирование'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Entry</span><span class="pln">
$_</span><span class="pun">[</span><span class="str">'entry_status'</span><span class="pun">]</span><span class="pln">     </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Статус'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Error</span><span class="pln">
$_</span><span class="pun">[</span><span class="str">'error_permission'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'У вас недостаточно прав для внесения изменений!'</span><span class="pun">;</span></pre>

<p>
	<strong>Проверка установки события</strong>
</p>

<p>
	После создания нашего нового модуля идем и активируем его в разделе Дополнения-модули.
</p>

<p>
	После этого если все сделано правильно наше событие “sm-send-order-1c” должно появиться в списке событий в разделе “Разширения-События”
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="75" href="http://opencartpascha.ru/uploads/monthly_2022_03/image.png.7313319ee04c2bb0d76b5609d260c0ad.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="75" data-unique="38rvp96u6" style="height: auto;" width="1000" src="http://opencartpascha.ru/uploads/monthly_2022_03/image.thumb.png.d369e1542af778cec967daabcd67d012.png" loading="lazy" height="390"></a>
</p>

<p>
	Если все так. То идем дальше.
</p>

<p>
	<strong>Создаем сам обработчик события</strong>
</p>

<p>
	Создаем файл catalog\controller\extension\module\mymodule.php с кодом:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2156_16" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ControllerExtensionModuleSm1c</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Controller</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="typ">Send</span><span class="pun">(&amp;</span><span class="pln">$route</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$args</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">$output</span><span class="pun">)</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
      
        $this</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">-&gt;</span><span class="pln">write</span><span class="pun">(</span><span class="pln">print_r</span><span class="pun">(</span><span class="pln">$route</span><span class="pun">,</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">-&gt;</span><span class="pln">write</span><span class="pun">(</span><span class="pln">print_r</span><span class="pun">(</span><span class="pln">$args</span><span class="pun">,</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">log</span><span class="pun">-&gt;</span><span class="pln">write</span><span class="pun">(</span><span class="pln">print_r</span><span class="pun">(</span><span class="pln">$output</span><span class="pun">,</span><span class="kwd">true</span><span class="pun">));</span><span class="pln">
       
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	В функции ” Send” я просто вывел данные в журнал логов опенкарта.
</p>

<p>
	Но тут можно делать с данными все что угодно.
</p>

<p>
	В переменной $args будут все данные по заказу которые вы можете смело отправлять на сторонний сервис например при помощи CURL.
</p>
]]></description><guid isPermaLink="false">118</guid><pubDate>Sat, 19 Mar 2022 13:50:00 +0000</pubDate></item><item><title>API Opencart 3.* &#x43E;&#x442; &#x410; &#x434;&#x43E; &#x42F; &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442; &#x438; &#x43A;&#x430;&#x43A; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;</title><link>http://opencartpascha.ru/topic/117-api-opencart-3-ot-a-do-ya-kak-rabotaet-i-kak-ispolzovat/</link><description><![CDATA[<p>
	Речь в этой статтье пойдет о API opencart 3.*
</p>

<p>
	Насколько я понял , то само АПИ 3.* и 2.3 не особо отличаются, но я разбирал именно opencart 3.0.2.1 с большой вероятностью в ocstore 3.0 апи точно такой же и эта статья подойдет и для тех кто использует русскую сборку данного движка. Но все же могут быть отличия так-что разбирайтесь сравнивайте и реализуйте.
</p>

<p>
	И так, ближе к делу, как говорится. Поступила заявка реализовать обновление количества товаров в магазине с 1С. Причем я уже делал данную процедуру, но только магазин выступал клиентом а 1С  – сервером. Тоесть я с магазина делал запрос к API 1C и в ответ получал данные которые обрабатывал уже в своем скрипте. Но сейча какраз все наоборот. 1С делает запрос к REST API opencart и отдает мне данные с которыми я должен работать.
</p>

<p>
	Сначала опишу в двух словах как это работает пошагово.
</p>

<p>
	Шаг №1 Подключение со стороны 1С к сайту
</p>

<p>
	Шаг №2 Сайт проверяет логин и пароль и в ответ отдает токен сесии
</p>

<p>
	Шаг 3 1С делает повторный запрос но уже к контроллеру обновления даннх товаров
</p>

<p>
	По сути все довольно просто и можно было бы написать самостоятельно все нужные контроллеры. НО зачем? Ведь в опенкарт 3 уже есть REST API в которого уже есть функционал авторизации. И осталось только написать обновление товаров. Но не тут то было. Разработчики движка наверное уж большо спешили выпустить новый релиз и наделали ошибок. Да и в документации по использованию API привелм примеры не на php, как мне бы хотелось, а на piton ) Ну ничего.
</p>

<p>
	Сейчас со всем разберемся.
</p>

<p>
	Но перед тем как начать писать свое АПИ подключение надо бы поправить баги которые допустили разработчики в opencart 3/ БУдем надеятся что они хи исправят но поканужно внести пару парвок. Если этого не сделать то в момент подключения вы будете получать ошибку
</p>

<p>
	<strong>Notice: Undefined index: api_token in /catalog/controller/startup/session.php on line 8.</strong>
</p>

<p>
	И так :
</p>

<p>
	идем  в файл /catalog/controller/startup/session.php и ищем строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_5" style=""><span class="pln">$this-&gt;db-&gt;query(“DELETE FROM `” . DB_PREFIX . “api_session` WHERE TIMESTAMPADD(HOUR, 1, date_modified) &lt; NOW()”);</span></pre>

<p>
	и перед этой сторокой надо добавить:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_7" style=""><span class="pln">if (!isset($this-&gt;request-&gt;get[‘api_token’])) { $this-&gt;request-&gt;get[‘api_token’] = ”; }</span></pre>

<p>
	2. идем в файл catalog/model/account/api.php и ищем строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_16" style=""><span class="pln">$query = $this-&gt;db-&gt;query(“SELECT * FROM `” . DB_PREFIX . “api` WHERE `username` = ‘” . $this-&gt;db-&gt;escape($username) . “‘ AND `key` = ‘” . $this-&gt;db-&gt;escape($key) . “‘ AND status = ‘1’”); [/php] в этой строке также допущена ошибка пропущен and. Ниже я указал правильную строку, просто замените на нее: [php] $query = $this-&gt;db-&gt;query("SELECT * FROM `" . DB_PREFIX . "api` WHERE `username` = '" . $this-&gt;db-&gt;escape($username) . "' AND `key` = '" . $this-&gt;db-&gt;escape($key) . "' AND status = '1'");</span></pre>

<p>
	3. Последний шаг и можно приступать. Идем в файл /catalog/controller/api/login.php и ишем там строку :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_12" style=""><span class="pln">$session = new Session($config-&gt;get('session_engine'), $registry);</span></pre>

<p>
	И тут разработчики чуток на путали. правильный синтаксис такой :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_14" style=""><span class="pln">$session = new Session($this-&gt;config-&gt;get('session_engine'), $this-&gt;registry);</span></pre>

<p>
	Вот и все. Можно идти дальше и сделать само потключение.
</p>

<p>
	И так поехали.
</p>

<p>
	Представим что у нас есть
</p>

<p>
	Сайт-1 – сайт где надо обновить данные по товарам 
</p>

<p>
	Сайт-2 – откуда надо подключится и выслать те самые данные.
</p>

<p>
	Подключение к API opencart 3
</p>

<p>
	Для начала на Сайте-2 (откуда мы хотим подключится) создадим простой файл в корне (разместить вы его можете где угодно, но для примера я выбрал именно корень сайта). И так создадим файл connect.php. Я решил использовать для соединения с другим сайтом CURL. И в этом файле описываю саму функцию присоединения к удаленному сайту – Сайт-1
</p>

<p>
	 
</p>

<p>
	текст файл выглядит так:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_22" style=""><span class="pln">$apiKey = "r9DkS8KmRO5YNCHoQFh16ZQwHW5f3yf9ClETja06un2dk17Q078AoSWoAjLCx7zNUhbT2oSsq8xdYg7iUt0267aRPoaCCA4jdkHEjXI1RZ9IcVWHQE7lClm5dCHpdwo6gAfJC9pJUUNVA7WZkl1jDDicTchVsGkcXXzgKjULfBLuSpdkbtOFUEl3wmy9OWzFR01r0zGsp6gmjfNBmjlUtxtS8RxydlsSyrO0effEBWJkU4sfNDPfbmF6LiFOAyoa"; //Whatever you put in System -&gt; Users -&gt; API
$url = "http://opencart3.myopencart.club/index.php?route=api/login";
$curl = curl_init($url);

$post = array (
    'username' =&gt; 'Default',
    'key' =&gt; $apiKey
);
curl_setopt_array( $curl, array(
    CURLOPT_RETURNTRANSFER=&gt; TRUE,
    CURLOPT_POSTFIELDS      =&gt; $post
) );

$raw_response = curl_exec( $curl );
//var_dump($raw_response);
$response = json_decode($raw_response);
curl_close($curl);
$api_token = $response-&gt;api_token;
// создем масив товаров для обновления информации
$products = Array (
    '123' =&gt; Array (
            'price' =&gt; 350,
            'quantity' =&gt; 10,
            'product_discount' =&gt; 100
             ),
    '555' =&gt; Array (
            'quantity' =&gt; 44
            )
);
// подключаемся к сайту 2 и к вновь созданному файлу которій будет отвечать за обновление товаров. Создание его я опишу ниже.
$url = "http://opencart3.myopencart.club/index.php?route=api/updateproduct&amp;api_token=".$api_token;
$post = $products;

$curl = curl_init($url);
curl_setopt_array( $curl, array(
CURLOPT_RETURNTRANSFER=&gt; TRUE,
CURLOPT_POSTFIELDS =&gt; $post
) );
$raw_response = curl_exec( $curl );
var_dump($raw_response);</span></pre>

<p>
	Имя пользователя и пароль берем в админке Сайта-1.
</p>

<p>
	Идем в раздел System -&gt; Users -&gt; API
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/Screenshot_1-1024x452.jpg.db456e547d5e586a957e51de51ebd802.jpg" data-fileid="74" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="74" data-unique="3fqch15i1" width="1000" alt="Screenshot_1-1024x452.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/Screenshot_1-1024x452.thumb.jpg.2afc80d22a96fa880c413ba9b1ec525c.jpg" loading="lazy" height="440"></a>
</p>

<p>
	И так на данный момент у нас готова  часть которая отвечает за подключени и отправку данных по API.
</p>

<p>
	Теперь осталось создать файл который будет обрабатывать полученные данный с сайта-2 на сайте-1.
</p>

<p>
	Итак идем в папку catalog/controller/api на Сайте-1 и создаем файл updateproduct.php
</p>

<p>
	Саму логику обновлеия данных по товарам я не буду описывать.
</p>

<p>
	Просто приведу пример получения данных и отправки ответа.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6422_24" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ControllerApiUpdateproduct</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Controller</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> index</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">(‘</span><span class="pln">api</span><span class="pun">/</span><span class="pln">currency</span><span class="pun">’);</span><span class="pln">

$json </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">session</span><span class="pun">-&gt;</span><span class="pln">data</span><span class="pun">[‘</span><span class="pln">api_id</span><span class="pun">’]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$json</span><span class="pun">[‘</span><span class="pln">error</span><span class="pun">’]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">error_permission</span><span class="pun">’);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(‘</span><span class="pln">catalog</span><span class="pun">/</span><span class="pln">product</span><span class="pun">’);</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[‘</span><span class="pln">product</span><span class="pun">’])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// Здесь будет ваша логика обработки полученных товаров</span><span class="pln">

$json</span><span class="pun">[‘</span><span class="pln">success</span><span class="pun">’]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">text_success</span><span class="pun">’);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$json</span><span class="pun">[‘</span><span class="pln">error</span><span class="pun">’]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">language</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">error_currency</span><span class="pun">’);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">server</span><span class="pun">[‘</span><span class="pln">HTTP_ORIGIN</span><span class="pun">’]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">addHeader</span><span class="pun">(‘</span><span class="typ">Access</span><span class="pun">-</span><span class="typ">Control</span><span class="pun">-</span><span class="typ">Allow</span><span class="pun">-</span><span class="typ">Origin</span><span class="pun">:</span><span class="pln"> </span><span class="pun">‘</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">server</span><span class="pun">[‘</span><span class="pln">HTTP_ORIGIN</span><span class="pun">’]);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">addHeader</span><span class="pun">(‘</span><span class="typ">Access</span><span class="pun">-</span><span class="typ">Control</span><span class="pun">-</span><span class="typ">Allow</span><span class="pun">-</span><span class="typ">Methods</span><span class="pun">:</span><span class="pln"> GET</span><span class="pun">,</span><span class="pln"> PUT</span><span class="pun">,</span><span class="pln"> POST</span><span class="pun">,</span><span class="pln"> DELETE</span><span class="pun">,</span><span class="pln"> OPTIONS</span><span class="pun">’);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">addHeader</span><span class="pun">(‘</span><span class="typ">Access</span><span class="pun">-</span><span class="typ">Control</span><span class="pun">-</span><span class="typ">Max</span><span class="pun">-</span><span class="typ">Age</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">’);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">addHeader</span><span class="pun">(‘</span><span class="typ">Access</span><span class="pun">-</span><span class="typ">Control</span><span class="pun">-</span><span class="typ">Allow</span><span class="pun">-</span><span class="typ">Headers</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Content</span><span class="pun">-</span><span class="typ">Type</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Authorization</span><span class="pun">,</span><span class="pln"> X</span><span class="pun">-</span><span class="typ">Requested</span><span class="pun">-</span><span class="typ">With</span><span class="pun">’);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">addHeader</span><span class="pun">(‘</span><span class="typ">Content</span><span class="pun">-</span><span class="typ">Type</span><span class="pun">:</span><span class="pln"> application</span><span class="pun">/</span><span class="pln">json</span><span class="pun">’);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">json_encode</span><span class="pun">(</span><span class="pln">$json</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Вот и все. 
</p>
]]></description><guid isPermaLink="false">117</guid><pubDate>Sat, 19 Mar 2022 13:38:17 +0000</pubDate></item><item><title>OCMOD opencart &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x44F;</title><link>http://opencartpascha.ru/topic/116-ocmod-opencart-sozdanie-modulya/</link><description><![CDATA[<p>
	С версии opencart 2 в поставке CMS уже встроена система модификации файлов OCMOD. Она пришла на замену VQMOD и имеет некоторые отличия как в принципах формирования файлов xml так и в установке файлов модификаций. Очень большим плюсов OCMOD является тот, что он уже встроен в opencart и не нуждается в дополнительной установке.
</p>

<p>
	Структура папок модуля для OCMOD
</p>

<p>
	Весь модуль должен быть упакаван в zip архів и иметь название xxx.ocmod.zip где ххх – любое слово латиницей.
</p>

<p>
	Внутренняя структура архива:
</p>

<p>
	<strong>папка upload</strong>
</p>

<p>
	- обязательная папка в которой находяться файлі модуля с подпапками
</p>

<p>
	папка admin - папка с файлами модуля
</p>

<p>
	папка catalog - папка с файлами модуля
</p>

<p>
	и так далее - другие папки
</p>

<p>
	<strong>файл instal.xml</strong>
</p>

<p>
	- файл с изменениями которые нужно внести в файлы ядра opencart
</p>

<p>
	<strong>файл instal.php</strong>
</p>

<p>
	- php файл с функциями которые надо выполнить во время установки модуля
</p>

<p>
	<strong>файл instal.sql</strong>
</p>

<p>
	- sql файл с командами insert, update или delete которые надо выполнить во время установки модуля
</p>

<p>
	<strong>Подробнее о структуре файла instal.xml</strong>
</p>

<p>
	Данный файл отвечает за внесение изменений в любые файлы ядра движка, при этом сами файлы не изменяются, а делается их копия с внесенными изменениями. Данные копии используются при загрузке сайта вместо стандартных.
</p>

<p>
	Просмотреть все созданные файлы можно в папке system/storage/modification в данной папке повторяется полная структура папок ядра где размещается модифицированый файл.
</p>

<p>
	<strong>Поговорим о самой структуре файла.</strong>
</p>

<p>
	Пример файла:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_5" style=""><span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=”</span><span class="lit">1.0</span><span class="pun">″</span><span class="pln"> encoding</span><span class="pun">=”</span><span class="pln">utf</span><span class="pun">-</span><span class="lit">8</span><span class="pun">″?&gt;</span><span class="pln">
</span><span class="tag">&lt;modification&gt;</span><span class="pln">
</span><span class="tag">&lt;name&gt;</span><span class="pln">Modification Default</span><span class="tag">&lt;/name&gt;</span><span class="pln">
</span><span class="tag">&lt;version&gt;</span><span class="pln">1.0</span><span class="tag">&lt;/version&gt;</span><span class="pln">
</span><span class="tag">&lt;author&gt;</span><span class="pln">OpenCart Ltd</span><span class="tag">&lt;/author&gt;</span><span class="pln">
</span><span class="tag">&lt;link&gt;</span><span class="pln">http://www.opencart.com</span><span class="tag">&lt;/link&gt;</span><span class="pln">
</span><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/common/home.php”</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;operation&gt;</span><span class="pln">
</span><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[
$data[‘column_left’] = $this-&gt;load-&gt;controller(‘common/column_left’);
]]&gt;</span><span class="tag">&lt;/search&gt;</span><span class="pln">
</span><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">”replace”</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[
test123
]]&gt;</span><span class="tag">&lt;/add&gt;</span><span class="pln">
</span><span class="tag">&lt;/operation&gt;</span><span class="pln">
</span><span class="tag">&lt;/file&gt;</span><span class="pln">
</span><span class="tag">&lt;/modification&gt;</span></pre>

<p>
	<strong>Атрибуты:</strong>
</p>

<p>
	“name”
</p>

<p>
	- название модификатора должно быть уникалное в разрезе всех установленных модификаторов. Обязательно к заполнению.
</p>

<p>
	“version”
</p>

<p>
	- версия вашего модификатора/модуля. Не обязательно но желательно к заполнению.
</p>

<p>
	“author”
</p>

<p>
	- автор модуля/модификатора.Не обязательно но желательно к заполнению.
</p>

<p>
	“link”
</p>

<p>
	- линк на любой сайт. Можете указать свой сайт ии оставить пустым.
</p>

<p>
	Теги: “file“
</p>

<p>
	- в данном теге прописывается путь и название файла в который мы будем вносить изменения.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_7" style=""><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/common/home.php”</span><span class="tag">&gt;</span></pre>

<p>
	изменения будут вноситься в файл
</p>

<p>
	home.php который находится в папке catalog/controller/common
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_9" style=""><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/{common,product}/home.php”</span><span class="tag">&gt;</span></pre>

<p>
	поиск файла home.php будет происходить уже в двух папках в
</p>

<p>
	catalog/controller/common и catalog/controller/product.
</p>

<p>
	То есть можно укозать несколько папок для поиска файла. Для єтого нужно просто указать все папки между двух "{}" через запятую. Если указать путь к файлу так:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_11" style=""><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/*/home.php”</span><span class="tag">&gt;</span></pre>

<p>
	То поиск файла home.php будет происходить во всех подпапках папки controller.
</p>

<p>
	Так же есть возможность задать несколько файлов в которые мы хотим внести изменения.
</p>

<p>
	Для нескольких файлов :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_13" style=""><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/common/{home,header}*.php”</span><span class="tag">&gt;</span></pre>

<p>
	Для всех файлов с разширением .php директории “common":
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_15" style=""><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/common/*.php”</span><span class="tag">&gt;</span></pre>

<p>
	“operation“
</p>

<p>
	- тег в котором заключено описание что именно искать и что делать с найденным элементом. Для каждлго задания данный тег открывается и закрывается отдельно. В теге может быть указан атрибут:
</p>

<p>
	error = "skip" - (работает только начина с версии opencart - 2.3) позволят пропускать задачу при возникновении ошибки, без прерывания выполнения всех задач.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_17" style=""><span class="tag">&lt;operation</span><span class="pln"> </span><span class="atn">error</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="atv">“skip”</span><span class="tag">&gt;</span><span class="pln"> … </span><span class="tag">&lt;/operation&gt;</span></pre>

<p>
	“search”
</p>

<p>
	 – в данном теге указываем элемент поиска. То, что нужно найти в файле/файлах указаных в теге
</p>

<p>
	“file”
</p>

<p>
	В теги serch можно указывать несколько атрибутов:
</p>

<p>
	trim="(true|false)" - удалять пробелы в указаном искомом тексте
</p>

<p>
	regex="(true|false)" - используется только когда поиск текста происходит через регулярное выражение
</p>

<p>
	index="(number)" - указывает к какому по очереди искомому тексту применять изменения описанные в теге "add"(о нем ниже).  Тоесть если указаный код выглядит так:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_19" style=""><span class="tag">&lt;search</span><span class="pln"> </span><span class="atn">index</span><span class="pun">=</span><span class="atv">”2″</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[$data[‘column_left’]]]&gt;</span><span class="tag">&lt;/search&gt;</span></pre>

<p>
	то, если в указаном файле, код – “$data[‘column_left’]” встречается несколько раз, то изменения будут применены только ко второму по счету совпавшему тексту.
</p>

<p>
	 "add"
</p>

<p>
	- в данном теге указывается текст который надо вставить в искомый файл. Место куда именно внужно вставить указывается атрибутами:
</p>

<p>
	<strong>trim="(true|false)"</strong> - перед вставкой уода будут удалены все ненужные пробелы. (не обязателен)
</p>

<p>
	<strong>position=</strong>"(Replace|Before|After)" - обязателен атрибут.
</p>

<p>
	<strong>replace</strong> - заменить найденый текст (который указаный в теге "search") на текст который указан в теге "add"
</p>

<p>
	<strong>before</strong> - вставить  текст с теге "add" над котом указаный в теге "search"
</p>

<p>
	<strong>after</strong> - вставить  текст с теге "add" под котом указаный в теге "search"
</p>

<p>
	<strong>offset=</strong>"(число)" - атрибут указывает сколько строчек отступить от кода указаного в теге "search" и только потом вставить новый код. Если тег "add" будет иметь атрибут position="before" и offset="5"
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_21" style=""><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">”before”</span><span class="pln"> </span><span class="atn">trim</span><span class="pun">=</span><span class="atv">”true”</span><span class="pln"> </span><span class="atn">offset</span><span class="pun">=</span><span class="atv">”5″</span><span class="tag">&gt;</span></pre>

<p>
	. То будет найдена искомая строка, потом от нее будет отсчитано 5 строк вверх и после пятой строки встится новый код. Обратите внимание если указать
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_23" style=""><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">”replace</span><span class="pln"> ” </span><span class="atn">trim</span><span class="pun">=</span><span class="atv">”true”</span><span class="pln"> </span><span class="atn">offset</span><span class="pun">=</span><span class="atv">”5″</span><span class="tag">&gt;</span></pre>

<p>
	 то система найдет искомый код отступить от него в низ 5 строчек и заменить сам искомый текст и эти 5 строк на новый код.
</p>

<p>
	Все тексты которые мы ищим и те которые хотим вставить должны  заключаться в специальные теги в  начале  “&lt;![CDATA[” и закрываться в конце “]]&gt;". Пример:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_25" style=""><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[ искомый текст ]]&gt;</span><span class="tag">&lt;/search&gt;</span><span class="pln"> </span><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">"replace"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[ добавляемый текст ]]&gt;</span><span class="tag">&lt;/add&gt;</span></pre>

<p>
	И так, давайте теперь разберем код который  я наводил в начале статьи:<br>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2505_27" style=""><span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=”</span><span class="lit">1.0</span><span class="pun">″</span><span class="pln"> encoding</span><span class="pun">=”</span><span class="pln">utf</span><span class="pun">-</span><span class="lit">8</span><span class="pun">″?&gt;</span><span class="pln">
</span><span class="tag">&lt;modification&gt;</span><span class="pln">
</span><span class="tag">&lt;name&gt;</span><span class="pln">Modification Default</span><span class="tag">&lt;/name&gt;</span><span class="pln">
</span><span class="tag">&lt;version&gt;</span><span class="pln">1.0</span><span class="tag">&lt;/version&gt;</span><span class="pln">
</span><span class="tag">&lt;author&gt;</span><span class="pln">OpenCart Ltd</span><span class="tag">&lt;/author&gt;</span><span class="pln">
</span><span class="tag">&lt;link&gt;</span><span class="pln">http://www.opencart.com</span><span class="tag">&lt;/link&gt;</span><span class="pln">
</span><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">”catalog/controller/common/home.php”</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;operation&gt;</span><span class="pln">
</span><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[
$data[‘column_left’] = $this-&gt;load-&gt;controller(‘common/column_left’);
]]&gt;</span><span class="tag">&lt;/search&gt;</span><span class="pln">
</span><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">”replace”</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[
test123
]]&gt;</span><span class="tag">&lt;/add&gt;</span><span class="pln">
</span><span class="tag">&lt;/operation&gt;</span><span class="pln">
</span><span class="tag">&lt;/file&gt;</span><span class="pln">
</span><span class="tag">&lt;/modification&gt;</span></pre>

<p>
	Что он делает?
</p>

<p>
	Ответ:
</p>

<p>
	ищем файл catalog/controller/common/home.php
</p>

<p>
	в данном файле ищем строку
</p>

<p>
	$data['column_left'] = $this-&gt;load-&gt;controller('common/column_left');
</p>

<p>
	 найденную строку замеяем на ” test123″
</p>

<p>
	Надеюсь я хоть чуточку улучшил вам понимание в даном моде и в том как с ним работать.
</p>
]]></description><guid isPermaLink="false">116</guid><pubDate>Sat, 19 Mar 2022 13:22:48 +0000</pubDate></item><item><title>&#x417;&#x430;&#x43C;&#x435;&#x43D;&#x430; &#x418;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430; &#x43D;&#x430; &#x43A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x43A;&#x443; &#x43E;&#x43F;&#x446;&#x438;&#x438;</title><link>http://opencartpascha.ru/topic/115-zamena-izobrazheniya-tovara-na-kartinku-opcii/</link><description><![CDATA[<p>
	Как мы уже знаем, а те кто не знает, сейчас будут проинформированы  , начиная с версии opencart 2.2* в CMS появился новый тип опций “image”, который позволяет добавлять картинку к каждой опции. И вот недавно мне задали вопрос – “Как сделать так чтобы при выборе опции данного типа, изображение товара заменялось на изображение опции?”. Не долго размышляя, я начал искать в google, но к моему удивлению ничего похожего не нашел. По этой причине пришлось все делать самостоятельно. Вот об это я и будет данная статья.
</p>

<p>
	Первое, что нужно сделать – это добавить новую опцию с типом “image”. Заходим в административную часть своего сайта в раздел “Каталог”/”Опции” и жмем “Добавить”.
</p>

<p>
	Заполняем все поля и добавляем каждой опции свою картинку
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/optionimage1.jpg.b9d0df04354d3e9af96da9b97bf04644.jpg" data-fileid="72" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="72" data-unique="7hz2fx0il" width="1000" alt="optionimage1.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/optionimage1.thumb.jpg.fd98a972665b69ac19b03b46fca44783.jpg" loading="lazy" height="550"></a>
</p>

<p>
	Далее добавляем данную опцию на товар, как любую другую. В результате мы должны получить вот такой вид страницы товара
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/optionimage2.jpg.9592f33b48657c5008fb56541af0b1ca.jpg" data-fileid="73" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="73" data-unique="gxd2c25y2" width="1000" alt="optionimage2.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/optionimage2.thumb.jpg.8af49c130399dea73621a97f5f4f5f0e.jpg" loading="lazy" height="550"></a>
</p>

<p>
	 Как мы видим, на странице появилась возможность выбрать нашу опцию и возле каждого значения вывелось изображение, которое мы добавили раннее. Это довольно удобно. Например каждая опция  – это товар в разном цвете и таким образом, покупатель может увидеть например какой вид будет иметь товар о выбранном им цвете. Но есть один недостаток, изображение возле опции, слишком маленькое.
</p>

<p>
	 Давайте сделаем так, что бы при выборе опции, главная картинка товара, заменялась на изображение опции.
</p>

<p>
	Создаем модель в которой будем получать изображение опции в исходном размере по id опции.
</p>

<p>
	Создаем файл smoption.php в папке корневая_папка_сайта/catalog/model/module/smoption.php
</p>

<p>
	с текстом :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5553_5" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ModelModuleSmoption</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Model</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="typ">GetImageById</span><span class="pun">(</span><span class="pln">$product_option_id</span><span class="pun">,</span><span class="pln"> $product_option_value_id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$query </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(“</span><span class="kwd">select</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> FROM </span><span class="pun">”</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="pun">“</span><span class="pln">option_value ov</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">SELECT pov</span><span class="pun">.</span><span class="pln">option_value_id FROM </span><span class="pun">”</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="pun">“</span><span class="pln">product_option_value pov

WHERE pov</span><span class="pun">.</span><span class="pln">product_option_id like </span><span class="pun">”</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $product_option_id </span><span class="pun">.</span><span class="pln"> </span><span class="pun">”</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> pov</span><span class="pun">.</span><span class="pln">product_option_value_id like </span><span class="pun">”</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $product_option_value_id</span><span class="pun">.”)</span><span class="pln"> t WHERE ov</span><span class="pun">.</span><span class="pln">option_value_id </span><span class="pun">=</span><span class="pln"> t</span><span class="pun">.</span><span class="pln">option_value_id</span><span class="pun">”)</span><span class="pln"> </span><span class="pun">;</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">row</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	Создаем контроллер который будет обрабатывать все данные
</p>

<p>
	Создаем файл smoption.php в папке корневая_папка_сайт/catalog/controller/module/smoption.php
</p>

<p>
	и добавим туда код :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5553_7" style=""><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ControllerModuleSmoption</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Controller</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="typ">GetImage</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(‘</span><span class="kwd">module</span><span class="pun">/</span><span class="pln">smoption</span><span class="pun">’);</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">model</span><span class="pun">(‘</span><span class="pln">tool</span><span class="pun">/</span><span class="pln">image</span><span class="pun">’);</span><span class="pln">
</span><span class="com">//получаем исходное изображение опции</span><span class="pln">
$result </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">model_module_smoption</span><span class="pun">-&gt;</span><span class="typ">GetImageById</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[‘</span><span class="pln">option_id</span><span class="pun">’],</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="pln">post</span><span class="pun">[‘</span><span class="pln">option_val_id</span><span class="pun">’]);</span><span class="pln">
</span><span class="com">// если изображение есть, то создаем две копии данного изображения с нужными размерами(размеры берутся с настроек магазина)</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">){</span><span class="pln">
$images </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
</span><span class="pun">‘</span><span class="pln">popup</span><span class="pun">’</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">model_tool_image</span><span class="pun">-&gt;</span><span class="pln">resize</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">[‘</span><span class="pln">image</span><span class="pun">’],</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">config_image_popup_width</span><span class="pun">’),</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">config_image_popup_height</span><span class="pun">’)),</span><span class="com">// изображение всплывающее при клике</span><span class="pln">
</span><span class="pun">‘</span><span class="pln">thumb</span><span class="pun">’</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">model_tool_image</span><span class="pun">-&gt;</span><span class="pln">resize</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">[‘</span><span class="pln">image</span><span class="pun">’],</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">config_image_thumb_width</span><span class="pun">’),</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(‘</span><span class="pln">config_image_thumb_height</span><span class="pun">’))</span><span class="pln"> </span><span class="com">// главное изображение товара</span><span class="pln">
</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">json_encode</span><span class="pun">(</span><span class="pln">$images</span><span class="pun">));</span><span class="pln">

</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	Пишем скрипт который будет, при клике по опции, заменят изображение
</p>

<p>
	Идем в папку корневая_папка_сайт/catalog/view/theme/напка с названием вашей темы/template/product/product.tpl
</p>

<p>
	Ищем код:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5553_9" style=""><span class="pun">&lt;?</span><span class="pln">php echo $footer</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	и перед ним вставляем :
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5553_11" style=""><span class="tag">&lt;script&gt;</span><span class="pln">
$</span><span class="pun">(‘.</span><span class="pln">form</span><span class="pun">-</span><span class="pln">group label img</span><span class="pun">’).</span><span class="pln">click</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(){</span><span class="pln">
option_id </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">parseInt</span><span class="pun">(</span><span class="pln">$</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">).</span><span class="pln">prev</span><span class="pun">().</span><span class="pln">attr</span><span class="pun">(“</span><span class="pln">name</span><span class="pun">”).</span><span class="pln">replace</span><span class="pun">(</span><span class="str">/[^0-9]*/</span><span class="pln">g</span><span class="pun">,</span><span class="pln"> </span><span class="pun">“”),</span><span class="lit">10</span><span class="pun">));</span><span class="pln">
option_val_id </span><span class="pun">=</span><span class="pln">$</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">).</span><span class="pln">prev</span><span class="pun">().</span><span class="pln">val</span><span class="pun">();</span><span class="pln">

$</span><span class="pun">.</span><span class="pln">ajax</span><span class="pun">({</span><span class="pln">
url</span><span class="pun">:’</span><span class="pln">index</span><span class="pun">.</span><span class="pln">php</span><span class="pun">?</span><span class="pln">route</span><span class="pun">=</span><span class="pln">module</span><span class="pun">/</span><span class="pln">smoption</span><span class="pun">/</span><span class="typ">GetImage</span><span class="pun">’,</span><span class="pln">
type</span><span class="pun">:</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">post</span><span class="pun">’,</span><span class="pln">
data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">option_id</span><span class="pun">=’+</span><span class="pln">option_id</span><span class="pun">+’&amp;</span><span class="pln">option_val_id</span><span class="pun">=’+</span><span class="pln">option_val_id</span><span class="pun">,</span><span class="pln">
dataType</span><span class="pun">:</span><span class="pln"> </span><span class="pun">‘</span><span class="pln">json</span><span class="pun">’,</span><span class="pln">
success</span><span class="pun">:</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">json</span><span class="pun">){</span><span class="pln">
popup </span><span class="pun">=</span><span class="pln"> json</span><span class="pun">.</span><span class="pln">popup</span><span class="pun">;</span><span class="pln">
thumb </span><span class="pun">=</span><span class="pln"> json</span><span class="pun">.</span><span class="pln">thumb</span><span class="pun">;</span><span class="pln">
$</span><span class="pun">(‘.</span><span class="pln">thumbnails </span><span class="pun">.</span><span class="pln">thumbnail</span><span class="pun">’).</span><span class="pln">first</span><span class="pun">().</span><span class="pln">attr</span><span class="pun">(‘</span><span class="pln">href</span><span class="pun">’,</span><span class="pln">popup</span><span class="pun">)</span><span class="pln">
$</span><span class="pun">(‘.</span><span class="pln">thumbnails img</span><span class="pun">’).</span><span class="pln">first</span><span class="pun">().</span><span class="pln">attr</span><span class="pun">(‘</span><span class="pln">src</span><span class="pun">’,</span><span class="pln">thumb</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">});</span><span class="pln">

</span><span class="pun">});</span><span class="pln">

</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	После чего сохраняем файл. Вот и все. Теперь если вы все сделали правильно, то при клике на изображение опции, главная картинка товара будет подменяться на картинку опции.
</p>

<p>
	<span></span>
</p>
]]></description><guid isPermaLink="false">115</guid><pubDate>Sat, 19 Mar 2022 13:06:58 +0000</pubDate></item><item><title>&#x41F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x43E;&#x43B;&#x44F; Opencart</title><link>http://opencartpascha.ru/topic/114-proizvolnye-polya-opencart/</link><description><![CDATA[<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/Screenshot_2.png.41dffc8b65643cb815bd7984e2f6bbe6.png" data-fileid="70" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="70" data-unique="r9ynxj3hg" width="1000" alt="Screenshot_2.png" src="http://opencartpascha.ru/uploads/monthly_2022_03/Screenshot_2.thumb.png.3a64e171456803a74c109c0b512cee1b.png" loading="lazy" height="320"></a>
</p>

<p>
	В данной статье мы постараемся разобрать новый функционал, который появился во второй версии opencart, а именно – возможность добавления произвольных полей в карточку покупателя.
</p>

<p>
	Все поля, которые  вы добавите в данном разделе, будут доступны только для администратора с административной панели. То есть и заполнить его сможете только вы в разделе Покупатели/Покупатели при добавлении или редактировании покупателя.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/Screenshot_2.png.13dfa48e9c2d78c6e7b12b186a745158.png" data-fileid="71" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="71" data-unique="uvsootpgv" width="1000" alt="Screenshot_2.png" src="http://opencartpascha.ru/uploads/monthly_2022_03/Screenshot_2.thumb.png.8c474adcdc28bf2f1ef4b85011910584.png" loading="lazy" height="320"></a>
</p>

<p>
	Итак, зайдя в раздел –  Покупатели/Произвольные поля, мы можем добавить новое поле, при этом есть возможность:
</p>

<p>
	Выбрать место отображение:
</p>

<p>
	Аккаунт (вывод поля на этапе заполнения информации о покупателе)
</p>

<p>
	Адрес (поле будет выводиться на этапе добавления адреса для доставки)
</p>

<p>
	Тип поля (выбираем тип нового поля из стандартных, возможных в opencart)
</p>

<p>
	Группа покупателей (возможность выбрать у какой группы покупателей будет отображаться данное поля)
</p>

<p>
	Обязательно (выбор для какой группы покупателей добавляемое поле обязательно для заполнения)
</p>

<p>
	Статус (выводить/не выводить новое поле)
</p>

<p>
	Порядок сортировки (порядок вывода нового поля среди всех костюмных полей)
</p>

<p>
	Значение для этого поля – Данная форма появиться, если поле, которое вы добавляете, несет выборочных характер. То есть, пользователь должен выбрать уже существующее значение. Данные значения вводятся предварительно вами в эту форму.  Форма появляется только для «Типов поля»:
</p>

<p>
	Select
</p>

<p>
	Checkbox
</p>

<p>
	Radio
</p>

<p>
	 
</p>

<p>
	 Данная функция очень даже интересна, но, на мой взгляд, более логично, было бы сделать возможность отображать данные поля, так же для пользователя при регистрации или изменении личных данных с кабинета покупателя. На данный же момент данные поля несут только информационную функци.
</p>
]]></description><guid isPermaLink="false">114</guid><pubDate>Sat, 19 Mar 2022 12:59:16 +0000</pubDate></item><item><title>&#x41C;&#x430;&#x440;&#x43A;&#x435;&#x442;&#x438;&#x43D;&#x433; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;&#x43D;&#x438;&#x44F; Opencart</title><link>http://opencartpascha.ru/topic/113-marketing-kompaniya-opencart/</link><description><![CDATA[<p>
	В любом бизнесе, что бы держаться на плаву, вам нужно постоянно рекламировать свой продукт, будь то интернет магазин или любой другой товар или услугу.
</p>

<p>
	В эпоху электронной коммерции, реклама и отслеживание ее результатов стало не менее важным этапом в достижении цели, чем сама реклама, что бы применять стратегии, которые создают продажи и доход. В этом уроке, мы рассмотрим как запустить маркетинговую компанию в Opencart, для стимулирования продаж.
</p>

<p>
	От OpenCart 2.0.x и версиями выше, вы увидите новая функция: «Отслеживание Маркетинга”. Данный функционал позволяет создавать маркетинговые кампании. Давайте попробуем понять основную концепция маркетинговых кампании:
</p>

<p>
	Конкретные мероприятия, направленные на содействие продукта, услуги или бизнес. Маркетинговая кампания представляет собой скоординированные ряд шагов, которые могут включать в себя продвижение продукта через различные среды (телевидение, радио, печать, интернет), используя множество различных видов рекламы.
</p>

<p>
	Поэтому в основном, это реклама вашего продукта через различные средства массовой информации.<br>
	Давайте рассмотрим простой приме. Представим, что скоро Рождество, и вы хотите рекламировать определенные продукты вашего интернет-магазина в рамках «Рождественской кампании». Таким образом, вы создаете определенные баннеры, связанные с этими продуктами и разместить их на своем сайте и на сторонних ресурсах.
</p>

<p>
	Каждая кампания идентифицируется уникальной ссылкой, которая позволяет отслеживать продажи, сгенерированные конкретной кампанией. Таким образом, мы можем анализировать трафик по определенной рекламе, продажи с нее и на основе данной информации принимать решения о целесообразности продолжения данной компании.
</p>

<p>
	Как создать маркетинговые кампании со стороны Административной панели.
</p>

<p>
	Теперь, давайте пройдем процесс создания кампании в админке OpenCart.
</p>

<p>
	Войти в административную панель сайта и перейдите Маркетинг/ Маркетинг.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark1-1.jpg.e370b21eb904e7d63da618ca634f5f2d.jpg" data-fileid="63" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="63" data-unique="qvyw54k2z" width="1000" alt="mark1-1.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark1-1.thumb.jpg.e6f0531813e676edefb11a70f886b1a9.jpg" loading="lazy" height="430"></a>
</p>

<p>
	Здесь мы видим раздел, в котором будут отображаться созданные нами компании. Для удобства поиска нужных нам рекламных компаний на странице присутствует фильтр.
</p>

<p>
	Для создания новой рекламной компании нужно нажать кнопку «Добавить» в виде плюсика.<br>
	После нажатия нас будет перенаправлено на страницу «Отслеживание Маркетинга»
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark2.jpg.e068696dd5fc510a3d4c86913882b55d.jpg" data-fileid="64" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="64" data-unique="zm80cq6qy" width="1000" alt="mark2.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark2.thumb.jpg.ac283f524aec4f1d31cfcc3420d51325.jpg" loading="lazy" height="540"></a>
</p>

<p>
	Заполните поля обязательные к заполнению (они отмечены звездочкой).<br>
	Поле «Код отслеживания», уже будет заполнено, его изменять не нужно. В данном поле надо вводить уникальный код для отслеживания, его система генерирует самостоятельно.<br>
	Так же Система генерирует примеры ссылок рекламных компаний. На данный момент мы не будем обращать на это внимания, и просто сохраним нашу новую компанию. Ниже я приведу пример ссылок для рекламной компании определенного товара.
</p>

<p>
	Настройка отслеживания со стороны продающей части сайта (Front-End)
</p>

<p>
	Итак. Мы создали компанию. И теперь мы готовы отслеживать ее. Ка я писал выше, мы можем разместить компанию, как на собственном сайте, так и на любом другом стороннем ресурсе (конечно же с разрешения его владельца  ). Для простоты, мы разместим созданную компанию на нашем же сайте с помощью ” HTML Содержимое” модуль OpenCart! Для тех, кто не знаком с этим модулем, ” HTML Содержимое” Модуль позволяет создать пользовательский HTML блоки контента на вашем сайте.
</p>

<p>
	Перейдите Дополнения &gt; Модули и установите модуль ” HTML Содержимое”, если он уже не установлен. После включения, нажмите на кнопку редактирования, чтобы создать новый экземпляр модуля, как показано на следующем рисунке.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark3.jpg.9d9d383036223bda9c3fbd6cecba597f.jpg" data-fileid="65" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="65" data-unique="srx5cjpsz" width="1000" alt="mark3.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark3.thumb.jpg.6e0140618c5375807d955d1305c6b3c6.jpg" loading="lazy" height="430"></a>
</p>

<p>
	Заполните детали, как показано на следующем рисунке. Среди других полей, поле «Описание» имеет самое важное значение, я использовал HTML код, который будет отображать изображение рекламируемого товара. Кроме того, убедитесь, что статус имеет значение «Включено».
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark4.jpg.11a804e8a717761693ddc516d5e5d203.jpg" data-fileid="66" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="66" data-unique="nod82txdq" width="1000" alt="mark4.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark4.thumb.jpg.30026f36205494b343135913fc825c47.jpg" loading="lazy" height="540"></a>
</p>

<p>
	И так, рассмотрим введенный код в поле «Описание»
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3488_5" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=”</span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> </span><span class="atn">center</span><span class="pln">;”</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">”http://www.ваш</span><span class="pln"> сайт</span><span class="pun">/</span><span class="atn">index</span><span class="pln">.</span><span class="atn">php</span><span class="pln">?</span><span class="atn">route</span><span class="pun">=</span><span class="atv">product/product&amp;amp;product_id=42&amp;amp;tracking=570b4c68ec57f”</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=”</span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> 142.75</span><span class="atn">px</span><span class="pln">; </span><span class="atn">float</span><span class="pln">: </span><span class="atn">none</span><span class="pln">;” </span><span class="atn">src</span><span class="pun">=</span><span class="atv">”http://www.</span><span class="pln"> ваш сайт</span><span class="pun">/</span><span class="atn">image</span><span class="pun">/</span><span class="atn">cache</span><span class="pun">/</span><span class="atn">catalog</span><span class="pun">/</span><span class="atn">demo</span><span class="pun">/</span><span class="atn">apple_cinema_30-200</span><span class="pln">×200.</span><span class="atn">jpg</span><span class="pln">”</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;/a&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	Это самый простой вид кода, который будет отображать изображение, связанный с вашей кампанией. В приведенном выше примере, мы использовали “Apple Cinema 30” продукт в нашем примере кампании, а это значит, что при нажатии на изображение будет открыть страницу с подробным описанием продукта.
</p>

<p>
	Важно отметить здесь “отслеживание = 560fd1cb5c4e7”, который будет отслеживать клики. Убедитесь, что вы используете код отслеживания из нашей “Рождественской кампании”. Очевидно, что вы можете использовать любое другое изображение вместо изображения, используемого в приведенном выше примере. Теперь сохраните модуль, и он будет отображаться в списке, как показано здесь.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark5.jpg.7d38475249d4a873004c8222275e96f6.jpg" data-fileid="67" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="67" data-unique="g3h351n5v" width="1000" alt="mark5.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark5.thumb.jpg.9c9d4b8dc89ebe21904db3ccdb9f0284.jpg" loading="lazy" height="390"></a>
</p>

<p>
	Теперь, нам нужно вновь созданный контент раздел, разместить на нашем сайте. Размещать будем на главной странице в верхней части сайта.<br>
	Перейдите Дизайн &gt; Схемы. Перейдите в редактирование макета Главная и добавьте новый модуль HTML Содержимое&gt;Новая рекламная компания. Расположение – выбираем «Вверху страницы».
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark6.jpg.a57a49b9111064ba1cde6fa39034ad4f.jpg" data-fileid="68" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="68" data-unique="vmugup57g" width="1000" alt="mark6.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark6.thumb.jpg.f52bd96264117419ab70e8fd9e7eb8a3.jpg" loading="lazy" height="530"></a>
</p>

<p>
	Переходим на главную страницу нашего сайта. Если все сделали правильно, то мы должны увидеть<br>
	Изображение нашего товара.<br>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2022_03/mark7.jpg.960fa4c47e48804c4b904e1ec6611c92.jpg" data-fileid="69" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="69" data-unique="5iw9xi3de" width="1000" alt="mark7.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/mark7.thumb.jpg.af79938265a7257da28120ab41c35b84.jpg" loading="lazy" height="620"></a>
</p>

<p>
	Отслеживание статистики
</p>

<p>
	Итак. Мы сделали компанию и разместили баннер на сайте. Теперь проверим, как это работает.<br>
	Для проверки, перейдите на главную страницу вашего сайта и кликните по изображению нашего товара с рекламной компании. После клика вас будет перенаправлено на страницу с описанием данного товара и совершите покупку данного товара.<br>
	Теперь вы можете зайти в административную панель в раздел Маркетинг &gt; Маркетинг и увидеть информацию по нашей компании. Столбцы «Кликов» и «Заказов» показывают, сколько раз наш модуль кампании был нажат, и купили товара или нет после перехода! Итак, таким образом, вы можете создать столько угодно кампаний, и отслеживать, были ли они успешными!
</p>

<p>
	 
</p>

<p>
	Вывод
</p>

<p>
	В этой статье мы рассмотрели важную маркетинговую концепцию кампании. Мы также создали кампанию в OpenCart, и опубликовал его на главную страницу.
</p>

<p>
	Оставляйте свои вопросы и предложения в комментариях к статье. Так же вы можете задавать вопросы, используя форму обратной связи.<br>
	Все кто читает наши статьи и интересуется интернет продажами и интернет магазинами, мы также предлагаем широкий спектр доработок, модулей и других функциональных решений для Opencart и ocStore, которые могут бить полезными для вашего бизнеса.
</p>
]]></description><guid isPermaLink="false">113</guid><pubDate>Sat, 19 Mar 2022 12:48:11 +0000</pubDate></item><item><title>&#x427;&#x435;&#x43C; &#x438; &#x43A;&#x430;&#x43A; &#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x430;&#x439;&#x43B;&#x44B; &#x441;&#x430;&#x439;&#x442;&#x430;</title><link>http://opencartpascha.ru/topic/112-chem-i-kak-redaktirovat-fayly-sayta/</link><description><![CDATA[<p>
	В этой статье, речь пойдет о том, какие программы лучше использовать для правки кода в файлах вашего сайта. Как я заметил, многие выкладывают в интернет решения тех или иных проблем или задач, которые требуют непосредственной правкой кода в файлах движка. И при этом многие забывают объяснить, как правильно вносить эти изменения, что бы сайт продолжал работать, и не появлялось множество ошибок.
</p>

<p>
	В этой статье я постараюсь максимально подробно расписать, как и какими средствами лучше вносить изменения.
</p>

<p>
	И так, для начала вам понадобится менеджер файлов. Я отдаю предпочтение NotPad++.
</p>

<p>
	Качаем на официальном сайте и устанавливаем себе на компьютер.
</p>

<p>
	Далее  понадобится узнать у своего хостинг провайдера параметры доступа к сайту по ФТП.
</p>

<p>
	Это:
</p>

<p>
	Хост – зачастую это просто доменное имя сайта, но может быть и другим
</p>

<p>
	Порт – не обязательный параметр
</p>

<p>
	Логин  – для доступа по FTP
</p>

<p>
	Пароль –  для доступа по FTP
</p>

<p>
	 
</p>

<p>
	После того, как эти данные  у нас есть,  нужно выбрать FTP клиент (программа, которая позволяет подключаться к серверу и управлять файлами сайта). Таких программ существует много, одни из самых популярных это, наверное  – Total Commander и Fille Zilla.  Я отдаю предпочтение именно второй, и в этом есть свои причины, одна из которых – автоматическое слежение за изменением файла.
</p>

<p>
	Значит, качаем данную программу с  официального сайта (она бесплатная) и устанавливаем ее себе на компьютер. После чего запускаем и начинаем настраивать подключение к серверу, где лежит наш с вами сайт. Переходим в меню Файл/Менеджер сайта
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="57" data-unique="jnb6lcgat" width="300" alt="FilleZilla-1-300x178.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/FilleZilla-1-300x178.jpg.968a4523663260ab48790e309d1456ee.jpg" loading="lazy" height="177">
</p>

<p>
	В открывшемся окне нажимаем кнопку «Новый сайт» и в форме над кнопкой появится новая папка с названием «Новый сайт». Его можно сразу изменить и назвать например в соответствии с названием вашего доменного имени, дабы в дальнейшем не путаться , среди множества подключений к другим сайтам(да именно так,  в данной программе можно создавать неограниченное количество подключений к разным серверам и подключаться к ним буквально по одному щелчку мышки). Я назову свою папочку «ATest». Теперь обратим внимание на правую часть окна программы, там мы будем вводить данные для подключения
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="58" data-unique="rfpl7rq61" width="300" alt="FilleZilla-2-300x194.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/FilleZilla-2-300x194.jpg.97dd67573402d9367724584ccbed1b50.jpg" loading="lazy" height="192">
</p>

<p>
	Итак начинаем заполнять поля в программе, соответствующими данными которые нам дал хостер.
</p>

<p>
	Для ввода Логина в поле «Пользователь» и пароля, нужно изменить поле «Тип входа» на «Нормальный»
</p>

<p>
	После того как вы ввели все данные просто жмем «Соединиться».  И если все сделано правильно то вы должны увидеть примерно такую картинку
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="59" data-unique="6cv7ilyw8" width="300" alt="FilleZilla-3-300x177.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/FilleZilla-3-300x177.jpg.7f1b1900a579b87fce4217e60ec5d72a.jpg" loading="lazy" height="177">
</p>

<p>
	Теперь идем в меню Редактирование/Настройки …/Правка файлов и в разделе «Редактор по умолчанию» ставим галочку возле «Использовать следующий редактор».
</p>

<p>
	После чего выбираем редактор – Notepad++ нажав на кнопку «Обзор… ». Выбрали и сохранили наши настройки, нажав «Ок»
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="60" data-unique="8359wswib" width="300" alt="FilleZilla-4-300x206.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/FilleZilla-4-300x206.jpg.98f4e454882f459cdd3f51ca8c57ce48.jpg" loading="lazy" height="204">
</p>

<p>
	Как работать с файлами в File Zill.
</p>

<p>
	Для перемещения файла с компьютера на сервер и обратно, вам просто нужно выделив нужный элемент (файл или папку) и  не отпуская левую кнопку мышки просто перетянуть его в противоположное окно.
</p>

<p>
	Теперь поговорим о самом редактировании файлов
</p>

<p>
	Что бы открыть файл на редактирование нужно щёлкнуть правой кнопкой мышки по нужному объекту и выбрать, с выпавшего меню, пункт «Просмотр/Правка». И нужный файл откроется в нужном нам редакторе для редактирования.
</p>

<p>
	Теперь для более удобного  восприятия написанного кода вам надо зайти в пункт «Синтаксис/ Р /PHP. Таким способом мы даем понять программе что смотрим файл написанный на языке php и весь код будет понятно подсвечен, что в разы улучшает его восприятие .
</p>

<p>
	Теперь один из самых важных, а может и самых важный момент, для которого и была написана вся эта статья. В 99% -х случаем все файлы нужно сохранять в кодировке «Кодировка в UTF-8 без BOM», что бы ваш сайт не выдавал ошибок из за скрытых символов которые могут появится при сохранении кода в других кодировках. Перед внесением любых правок  вам надо зайти в раздел «Кодировка» и в выпавшем меню выбрать «Кодировка в UTF-8 без BOM»
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="61" data-unique="3rbzszp46" width="300" alt="FilleZilla-5-300x203.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/FilleZilla-5-300x203.jpg.dc4a8b9260335e20e6861a33ea5ad9f4.jpg" loading="lazy" height="201">
</p>

<p>
	Теперь после внесения изменений в файле вы просто нажимаете «Сохранить» (изображение дискети в верхнем левом углу редактора) . Автоматически наш FTP клиент, поймет что произошло изменение файла и спросит перезаписать ли старый файл на сервере новым?
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="62" data-unique="6p0ty4q4d" width="300" alt="FilleZilla-6-300x129.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_03/FilleZilla-6-300x129.jpg.53ff62b5daa6c6eba04dd31db5acfb6b.jpg" loading="lazy" height="129">
</p>

<p>
	Просто соглашаетесь нажатием кнопочки «ок» и все, дело сделано.
</p>

<p>
	Надеюсь, эта инструкция поможет многим избежать ошибок во время правки файлов.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">112</guid><pubDate>Sat, 19 Mar 2022 12:36:29 +0000</pubDate></item></channel></rss>
