tag:blogger.com,1999:blog-74779113660368393462024-02-20T11:06:23.473-08:00Cosmos-blogЗаписки web-программистаCosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comBlogger100125tag:blogger.com,1999:blog-7477911366036839346.post-73241795311061523342021-02-04T01:51:00.002-08:002021-02-04T01:55:18.338-08:00Failed to start mars-pn: Failed to exec docker-compose: exec: "docker-compose": executable file not found in $PATH<p><br /></p><pre class="hljs"><code>IF YOU GOT THESE ERRORS:</code></pre><pre class="hljs"><code>ddev composer install</code></pre><pre class="hljs"><code>return errors</code></pre><pre class="hljs"><code><span style="color: red;">docker executable file not found in PATH</span></code></pre><pre class="hljs"><code><span>and</span></code></pre><pre class="hljs"><code><span style="color: red;">Failed to start mars-pn: Failed to exec docker-compose: exec: "docker-compose": executable file not found in $PATH</span></code></pre><pre class="hljs">and </pre><pre class="hljs"><code>docker–compose –version</code></pre><pre class="hljs"><code>return
<i><span style="color: red;">Command 'docker–compose' not found, did you mean:
command 'docker-compose' from deb docker-compose
Try: sudo apt install <deb name></span></i>
</code></pre><div>FIX error</div><p><span style="color: red; font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;"><span style="font-size: 15.008px; white-space: pre;">pyrsistent requires Python '>=3.5' but the running Python is 2.7.17</span></span></p><p><span style="color: #6aa84f; font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;"><span style="background-color: #f9f9f9; font-size: 15.008px; white-space: pre;">try to install python 3</span></span></p><p><b>install python 3</b></p><p><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;">sudo apt-get -y -qq update</span><br style="background-color: white; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 15.008px;" /><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;">sudo apt-get install python3-pip python3-dev build-essential</span><br style="background-color: white; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 15.008px;" /><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;">sudo pip3 install --upgrade setuptools</span><br style="background-color: white; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 15.008px;" /><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;">sudo pip3 install awsebcli --upgrade</span></p><p><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;"><br /></span></p><p><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;"><b>then install</b></span></p><p><span style="background-color: white; font-size: 15.008px;"><span face="Helvetica, Arial, sans-serif" style="color: #222222;">pip3 install docker-compose</span></span></p><p><span style="background-color: white; font-size: 15.008px;"><span face="Helvetica, Arial, sans-serif" style="color: #222222;"><br /></span></span></p><p><span style="background-color: white; font-size: 15.008px;"><span face="Helvetica, Arial, sans-serif" style="color: #222222;"><br /></span></span></p><p><span style="background-color: white; font-size: 15.008px;"><span face="Helvetica, Arial, sans-serif" style="color: #222222;"><br /></span></span></p><p><span face="Helvetica, Arial, sans-serif" style="background-color: white; color: #222222; font-size: 15.008px;"><br /></span></p>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-80306933916173937532021-01-28T01:27:00.004-08:002021-01-28T01:35:23.304-08:00Drupal 8. Composer update drupal<p><br /></p><p>Check current status</p><p>composer outdated 'drupal/*'</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRnBWppUgn0G-K6o4l_B9OaBLlp4ChTjC5PPTit_J0a-FAFwGYklfHywzQjh_tCTpxsNa5SvqDaHq5iPaFyIXdcQPyHSpLyenvFvMXzfMr5abbHoBiuJPFfBscETEKg5-Z_jOnN62Jv3A/s883/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2021-01-28+13-27-05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="180" data-original-width="883" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRnBWppUgn0G-K6o4l_B9OaBLlp4ChTjC5PPTit_J0a-FAFwGYklfHywzQjh_tCTpxsNa5SvqDaHq5iPaFyIXdcQPyHSpLyenvFvMXzfMr5abbHoBiuJPFfBscETEKg5-Z_jOnN62Jv3A/w644-h131/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2021-01-28+13-27-05.png" width="644" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p></p><p>Update drupal</p><p><b> <span style="color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; white-space: pre-wrap;">composer update drupal</span><span class="token operator" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre-wrap;">/</span><span style="color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; white-space: pre-wrap;">core </span><span class="token string" style="border: 0px; box-sizing: border-box; color: #308217; font-family: inherit; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre-wrap;">'drupal/core-*'</span><span style="color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; white-space: pre-wrap;"> </span><span class="token operator" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre-wrap;">--</span><span style="color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; white-space: pre-wrap;">with</span><span class="token operator" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre-wrap;">-</span><span style="color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; white-space: pre-wrap;">all</span><span class="token operator" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre-wrap;">-</span><span style="color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-style: inherit; font-variant-caps: inherit; font-variant-ligatures: inherit; white-space: pre-wrap;">dependencies</span></b></p><p><span style="color: #4e4e4e; font-family: Monaco, Consolas, Andale Mono, Ubuntu Mono, monospace;"><span style="font-size: 12px; white-space: pre-wrap;"><br /></span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyFTGiY0UAfNXYjoZenvo90elLj_1FRke3igjRW9JeFsQa2vJf0qqpj8NQG7c3o3MACio6McoD_ruaOsHshAdDDyoqy6za-_coMwQ2-cTtGpICmQdcRUWYQ7R1SGBCM_riCpBjZ9aCmaA/s893/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2021-01-28+13-30-04.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="519" data-original-width="893" height="367" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyFTGiY0UAfNXYjoZenvo90elLj_1FRke3igjRW9JeFsQa2vJf0qqpj8NQG7c3o3MACio6McoD_ruaOsHshAdDDyoqy6za-_coMwQ2-cTtGpICmQdcRUWYQ7R1SGBCM_riCpBjZ9aCmaA/w633-h367/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA+%25D1%258D%25D0%25BA%25D1%2580%25D0%25B0%25D0%25BD%25D0%25B0+%25D0%25BE%25D1%2582+2021-01-28+13-30-04.png" width="633" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><span style="background-color: whitesmoke; color: #222222; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 12px; white-space: pre-wrap;"><b>Then run;</b></span></div><div class="separator" style="clear: both; text-align: left;"><span style="background-color: whitesmoke; color: #222222; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 12px; white-space: pre-wrap;"><b><br /></b></span></div><div class="separator" style="clear: both; text-align: left;"><span style="background-color: whitesmoke; color: #222222; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 12px; white-space: pre-wrap;">drush updb</span></div><div class="separator" style="clear: both; text-align: left;"><span style="background-color: whitesmoke; color: #222222; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 12px; white-space: pre-wrap;">drupal cr</span></div><p></p>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-87602731513724682482021-01-28T01:25:00.002-08:002021-01-28T07:19:05.711-08:00Drupal 8. Plugin API<p>Plugin system overview<span style="white-space: pre;"> </span></p><p><b>1. What the plugin is ? </b></p><p><b><a href="https://druki.ru/wiki/8/plugins">https://druki.ru/wiki/8/plugins</a></b></p><p><strong style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Plugins</strong><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"> are small pieces of functionality that are swappable. Plugins that perform similar functionality are of the same </span><strong style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">plugin type</strong></p><p><strong style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="font-family: "Lucida Grande", "DejaVu Sans", "Bitstream Vera Sans", Verdana, Arial, sans-serif; font-size: 13px; font-weight: 400;">The basic idea of plugins is to allow a particular module or subsystem of Drupal to provide functionality in an extensible, object-oriented way. </span></strong></p><p class="selectionShareable" style="background-color: white; box-sizing: border-box; color: #2a2d33; font-family: Merriweather, georgia, serif; font-size: 13px; line-height: inherit; margin: 0px 0px 1.5rem; padding: 0px;">Drupal 8 plugins similar to Drupal 7 hooks</p><ul style="background-color: white; box-sizing: border-box; color: #2a2d33; font-family: Merriweather, georgia, serif; font-size: 13px; margin: 0px; padding: 0px 0px 0px 4rem;"><li style="box-sizing: border-box; margin: 0px; padding: 0px;">@<span style="box-sizing: border-box; font-weight: 700; margin: 0px; padding: 0px;">FieldType</span> = hook_field_info()</li><li style="box-sizing: border-box; margin: 0px; padding: 0px;">@<span style="box-sizing: border-box; font-weight: 700; margin: 0px; padding: 0px;">FieldType</span> = hook_field_schema()</li><li style="box-sizing: border-box; margin: 0px; padding: 0px;">@<span style="box-sizing: border-box; font-weight: 700; margin: 0px; padding: 0px;">FieldFormatter</span> = hook_field_formatter_info()</li><li style="box-sizing: border-box; margin: 0px; padding: 0px;">@<span style="box-sizing: border-box; font-weight: 700; margin: 0px; padding: 0px;">FieldWidget</span> = hook_field_widget_info()</li></ul><p><br /></p><p><b>Создание кастомного плагина</b></p><p>Плагины состоят из:</p><p>Аннотации - это то что в комментариях задается. По сути можно передать какие-то базовые данные о плагине без необходимости писать код и методы. Т.е. данные что у плагина всегда будут статичны внутри него и не будут меняться ни при каких обстоятельствах - можно выносить в аннотации, например: id плагина и его заголовок. Обязательно, как минимум, должен содержать id;</p><p>Интерфейс плагина - тут мы описываем какие методы плагин обязан описать у себя;</p><p>База плагина (Plugin Base) - абстрактный класс, который наследуется от интерфейса плагина и позволяет для методов задать значения по-умолчанию, тем самым сделав эти методы не обязательными для объявления, если поведения из базового хватает. Это очень востребовано для получения данных из аннотации, так как они получаются всегда одним путем, то их можно описать в базе плагина;</p><p>Менеджер плагина (это сервис) - это класс который описывает где искать наш плагин, и указывает что является интерфейсом плагина и аннотацией.</p><p><br /></p><p><b>2.Compare plugins vs. services </b></p><p><a href="https://www.drupal.org/forum/support/module-development-and-code-questions/2015-09-29/d8-difference-between-service-and">https://www.drupal.org/forum/support/module-development-and-code-questions/2015-09-29/d8-difference-between-service-and</a></p><p>Плагины реализуют различные модели поведения через общий интерфейс.</p><p>Например, подумайте о преобразованиях изображений. Обычные преобразования изображений-масштабирование, обрезка, обесцвечивание и т. д. Каждый тип преобразования действует одинаково на одни и те же данные - он принимает файл изображения, выполняет преобразование, а затем возвращает измененное изображение. Однако каждый эффект очень разный.</p><p>Сервисы предоставляют одинаковую функциональность и взаимозаменяемы, отличаясь только своей внутренней реализацией.</p><p>Например Кэш должен предоставлять методы get, set и expire. Пользователь просто ожидает кэш, и один должен быть в состоянии заменить другой без каких-либо функциональных различий. Внутренняя реализация этих методов и механизмы, которые она использует для этого, могут быть совершенно разными. В этом случае более подходящим будет использовать Сервисы.</p><p>Исключение</p><p>Если вы предоставляете пользовательский интерфейс, с помощью которого люди могут настроить или выбрать нужную им реализацию, вы должны использовать систему плагинов.</p><p><br /></p><p>3. Explain Plugin Types, Plugin Discovery, Plugin Factory </p><p style="background-color: white; box-sizing: border-box; color: #222330; font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 16px; margin-bottom: var(--p-margin--y); margin-left: 0px; margin-right: 0px; margin-top: var(--p-margin--y); min-width: 0px;">Систему плагинов можно разделить на несколько фундаментальных элементов:</p><ol style="background-color: white; box-sizing: border-box; color: #222330; font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 16px; margin: var(--list-margin); min-width: 0px; padding: var(--list-padding);"><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><abbr style="box-sizing: border-box; min-width: 0px;" title="Типы плагинов"><strong style="box-sizing: border-box; min-width: 0px;">Plugin Types</strong></abbr> — централизованное место, объявляющая как плагины данного типа будут обнаруживаться и использоваться.</li><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><abbr style="box-sizing: border-box; min-width: 0px;" title="Исследователь плагинов"><strong style="box-sizing: border-box; min-width: 0px;">Plugin Discovery</strong></abbr> — процесс, который используется менеджером плагинов, для того чтобы найти плагины конкретного типа, объявленных во всех модулях. Плагины могут объявляться несколькими способами:<ul style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px; padding: var(--list-padding);"><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><abbr style="box-sizing: border-box; min-width: 0px;" title="Аннотация — специально отформатированный PHP комментарий."><strong style="box-sizing: border-box; min-width: 0px;">Annotation</strong></abbr>: Данный плагины являются объектами, в комментариях класса которого находится аннотация, описывающая параметры для конкретного типа плагина. Это основной способ определения и поиска плагинов, как и самый распространенный для создания собственных типов.</li><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><a href="https://druki.ru/wiki/8/hooks" style="box-sizing: border-box; min-width: 0px; text-decoration-line: none; text-decoration-skip-ink: auto;"><strong style="box-sizing: border-box; min-width: 0px;">Хуки</strong></a>: Плагины, объявленные через хуки.</li><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><strong style="box-sizing: border-box; min-width: 0px;">YAML</strong>: Плагины, описанные в YAML файлах. Ядро Drupal использует данный способ для обнаружения ссылок local tasks (вкладки) и local action (кнопки действий на страницах). Данный способ очень полезен для тех типов плагинов, где используется один общий класс.</li><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><abbr style="box-sizing: border-box; min-width: 0px;" title="Статический"><strong style="box-sizing: border-box; min-width: 0px;">Static</strong></abbr>: Плагины являются объектами, но регистрируются менеджером плагинов. Это полезно, если вы хотите запретить создание плагинов данного типа (используется статичный список плагинов в коде).</li></ul></li><li style="box-sizing: border-box; margin-bottom: var(--spacing-xxs); margin-top: var(--spacing-xxs); min-width: 0px;"><abbr style="box-sizing: border-box; min-width: 0px;" title="Фабрика плагинов"><strong style="box-sizing: border-box; min-width: 0px;">Plugin Factory</strong></abbr> — отвечает за определенных плагинов для конкретного использования.</li></ol><p><br /></p><p><b>Core Plugins</b><span style="white-space: pre;"> </span></p><p>field formatters, field widgets, views filters, </p><p><br /></p><p><b>Plugin Discovery<span style="white-space: pre;"> </span></b></p><p>1. Explain Core Discovery Types </p><p>2. How to implement custom Plugin Discovery component?</p><p><br /></p><p><b>Annotations-based plugins<span style="white-space: pre;"> </span></b></p><p>1. Anotations discovery mechanism vs. hook discovery </p><p>2. How to create custom annotation class?</p><p><br /></p><p><b>Plugin Manager<span style="white-space: pre;"> </span></b></p><p>1. How to implement custom Plugin Manager?</p><p><b><br /></b></p><p><b>Plugin Derivatives, Discovery Decorators</b><span style="white-space: pre;"> </span></p><p>1. Explain what the Plugun Derivatives is. </p><p>2. Explain what the Discovery Decorators is.</p><p> </p><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p></p>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-67984207117466685642021-01-21T22:59:00.002-08:002021-01-21T23:01:54.932-08:00Drupal 8. Entity API<p><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"><br /></span></p><p><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"><br /></span><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCQZBYme1Csso5WV7j-oDPR7BKMjW1BIBnbPpNzjaFG2pBPJdISJ85biKOkMa44xJe8z7vmJtp6yQXYUfNNmGL3_2eJvbfNq_75y1iD5_54Y_Kcdt6KqDv5b-_2Mx8xRHx6auOknjMkgg/" style="font-size: 17.3333px; margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="" data-original-height="503" data-original-width="805" height="368" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCQZBYme1Csso5WV7j-oDPR7BKMjW1BIBnbPpNzjaFG2pBPJdISJ85biKOkMa44xJe8z7vmJtp6yQXYUfNNmGL3_2eJvbfNq_75y1iD5_54Y_Kcdt6KqDv5b-_2Mx8xRHx6auOknjMkgg/w590-h368/image.png" width="590" /></a></span></p><p><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"><br /></span></p><p><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;">Entity types in core come in two variants. </span><span face=""Open Sans", sans-serif" style="background-color: white; color: #4f484f; font-size: 17.3333px;">Content & Config</span></p><p> <span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;">The </span><strong style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Entity System</strong><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"> is the API for entities manipulation (CRUD: create, read, update, delete). </span><a href="https://www.drupal.org/node/2015613" rel="nofollow" style="background-color: white; border: 0px; box-sizing: border-box; color: #0678be; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; text-decoration-line: none; vertical-align: baseline;">Entity validation has its own API</a><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px;"> (which could validate an Entity saved via REST, rather than a form, for example).</span></p><p><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px; font-weight: 700;">Entities are typed classes with methods</span></p><p><span face="Ubuntu, sans-serif" style="background-color: white; color: #222222; font-size: 16px; font-weight: 700;"><br /></span></p><dt style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; font-weight: bold; line-height: inherit; margin: 0.692em 0px 0px; padding: 0px; vertical-align: baseline;">Configuration Entity</dt><dd style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 0.692em; padding: 0px 0px 0px 2em; vertical-align: baseline;">Used by the <a href="https://www.drupal.org/developing/api/8/configuration" rel="nofollow" style="border: 0px; box-sizing: border-box; color: #0678be; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; text-decoration-line: none; vertical-align: baseline;">Configuration System</a>. Supports translations and can provide custom defaults for installations. Configuration entities are stored within the common <code class="language-php" style="background: whitesmoke; border-radius: 0.25em; border: 0px; box-sizing: border-box; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0.25em; vertical-align: baseline; white-space: pre-wrap;">config</code> database table as rows.</dd><dt style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; font-weight: bold; line-height: inherit; margin: 0.692em 0px 0px; padding: 0px; vertical-align: baseline;">Content Entity</dt><dd style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 0.692em; padding: 0px 0px 0px 2em; vertical-align: baseline;">Consist of configurable and base fields, and can have revisions and support translations. Content entities are stored within a custom database table as rows. The table name is the same as the content entity "id", and the columns are defined by the entity's "baseFieldDefinitions" method.</dd><dd style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 0.692em; padding: 0px 0px 0px 2em; vertical-align: baseline;"><br /></dd><dd style="background-color: white; border: 0px; box-sizing: border-box; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 0.692em; padding: 0px 0px 0px 2em; vertical-align: baseline;"><p style="border: 0px; box-sizing: inherit; color: #4f484f; font-family: "Open Sans", sans-serif; font-size: 17.3333px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 2em; padding: 0px; vertical-align: baseline;">Охватывает методы API общего объекта</p><ul style="border: 0px; box-sizing: inherit; color: #4f484f; font-family: "Open Sans", sans-serif; font-size: 17.3333px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; list-style: none; margin: 0px; padding: 0px 0px 0px 20px; vertical-align: baseline;"><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::create()</li><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::load()</li><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::save()</li><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::id()</li><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::bundle()</li><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::isNew()</li><li style="border: 0px; box-sizing: inherit; font: inherit; list-style: disc; margin: 0px; padding: 0px; vertical-align: baseline;">Entity::label()</li></ul><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div><div><span face=""Open Sans", sans-serif" style="color: #4f484f; font-size: 17.3333px;">В Drupal 8 бандлы представляют собой тип контейнера для информации, которая содержит определения полей или настроек.</span></div><div><br /></div><div><span face=""Open Sans", sans-serif" style="color: #4f484f; font-size: 17.3333px;"><div class="separator" style="clear: both; text-align: center;"><br /></div></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><a href="https://www.yuseferi.com/en/blog/everything-entity-or-entity-everything-drupal-8">https://www.yuseferi.com/en/blog/everything-entity-or-entity-everything-drupal-8</a></span></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><b>Annotations</b></span></span></div><div><p style="border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;">Annotations are read and parsed at runtime by an annotation engine. Drupal 8 uses the Doctrine annotation parser, which turns it into an object that PHP can use.</p><p style="border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;"><br /></p><p style="border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;"><br /></p><p style="border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://drupalbook.org/sites/default/files/inline-images/classDrupal_Entities.png" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="" data-original-height="2048" data-original-width="1304" height="908" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmrk_ODuU2pLczwOt9CU26tlKr0bZuvUE1cxM50Jmb2oUN8MJq9tJKgZvx8dSrs6zY_LOkHm1wdx6fnIQ9cWYLAXevKyVLxFZj1uFkcBP6lHLn71L_CVebG5YXJuR-UzIXvO-ZTQ-VKu8/w579-h908/image.png" width="579" /></a></div><br /><br /><p></p><div><br /></div></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div><div><span face="Open Sans, sans-serif" style="color: #4f484f;"><span style="font-size: 17.3333px;"><br /></span></span></div></dd>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-19257813773833126482021-01-17T21:21:00.009-08:002021-01-18T00:52:39.453-08:00Drupal 8. Drupal Console and Drush<p><b>Installation<span style="white-space: pre;"> </span></b></p><p><a href="https://hechoendrupal.gitbooks.io/drupal-console/en/index.html">https://hechoendrupal.gitbooks.io/drupal-console/en/index.html</a> </p><p>http://docs.drush.org/en/master/ </p><p><a href="https://www.webwash.net/drupal-cli-drush-and-drupal-console/">https://www.webwash.net/drupal-cli-drush-and-drupal-console/</a></p><p><br /></p><p><b><span style="font-size: medium;">install drush via composer</span></b></p><h1 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.57813rem; font-weight: 100; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;"><pre style="background: rgb(243, 243, 243); border-radius: 3px; border: 1px solid rgb(242, 242, 242); box-sizing: border-box; color: #0f0f0f; font-family: monospace, monospace; font-size: 16px; letter-spacing: normal; margin-bottom: 2rem; margin-top: 0px; overflow-wrap: normal; overflow: auto; padding: 1.2rem; white-space: pre-wrap; word-break: normal;">$ composer global require drush/drush:dev-master</pre></h1><h1 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.57813rem; font-weight: 100; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;">Установка с помощью приложения Composer</h1><p style="background-color: white; box-sizing: border-box; color: #757575; font-family: "Open Sans", sans-serif; font-size: 15px; margin-bottom: 1rem; margin-top: 0px;">Перейти в папку с Drupal:</p><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;">cd /path/to/drupal8.dev
</code></pre><p style="background-color: white; box-sizing: border-box; color: #757575; font-family: "Open Sans", sans-serif; font-size: 15px; margin-bottom: 1rem; margin-top: 0px;">Установка командой composer require:</p><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;">composer require drupal/console:~1.0 \
--prefer-dist \
--optimize-autoloader
</code></pre><h2 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.10938rem; font-weight: 400; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;">Скачать шаблон DrupalComposer</h2><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;">composer create-project \
drupal-composer/drupal-project:8.x-dev \
drupal8.dev \
--prefer-dist \
--no-progress \
--no-interaction
</code></pre><h2 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.10938rem; font-weight: 400; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;">Обновить Drupal Console:</h2><h1 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.57813rem; font-weight: 100; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;"><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; letter-spacing: normal; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;">composer update drupal/console --with-dependencies</code></pre><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; letter-spacing: normal; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;"><br /></code></pre></h1><h1 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.57813rem; font-weight: 100; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;">Установка пускового файла Drupal Console</h1><h2 style="background-color: white; box-sizing: border-box; color: #323d47; font-family: Barlow, sans-serif; font-size: 2.10938rem; font-weight: 400; letter-spacing: 0.5px; line-height: 1.5; margin-bottom: 0.5rem; margin-top: 0px;"><p style="box-sizing: border-box; color: #757575; font-family: "Open Sans", sans-serif; font-size: 15px; letter-spacing: normal; margin-bottom: 1rem; margin-top: 0px;">С помощью командного приложения curl:</p><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; letter-spacing: normal; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;">curl https://drupalconsole.com/installer -L -o drupal.phar
mv drupal.phar /usr/local/bin/drupal
chmod +x /usr/local/bin/drupal
</code></pre><p style="box-sizing: border-box; color: #757575; font-family: "Open Sans", sans-serif; font-size: 15px; letter-spacing: normal; margin-bottom: 1rem; margin-top: 0px;">ИЛИ если командное приложение curl не установлено</p><pre style="background-color: #f9fafb; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-left: 5px solid rgb(234, 239, 244); box-sizing: border-box; color: #999999; direction: ltr; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.875rem; letter-spacing: normal; margin-bottom: 1rem; margin-top: 0px; overflow: auto; padding: 12px;"><code style="box-sizing: border-box; color: inherit; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: inherit; word-break: normal;">php -r "readfile('https://drupalconsole.com/installer');" > drupal.phar</code></pre></h2><p><b>Capabilities</b><span style="white-space: pre;"> </span></p><p>https://github.com/hechoendrupal/drupal-console h</p><p>ttps://drushcommands.com/ </p><p>https://pantheon.io/drupal-8/introduction-drush-and-drupal-console </p><p>https://valuebound.com/resources/blog/developing-drupal-8-sites-a-smarter-way-drupal-console</p><p></p><p><b>Custom commands<span style="white-space: pre;"> </span></b></p><p>https://hechoendrupal.gitbooks.io/drupal-console/en/extending/creating-custom-commands.html https://valuebound.com/resources/blog/how-to-write-custom-drush-commands-drupal-8 https://www.droptica.com/blog/your-own-drush-command-drupal-8/ https://drupalize.me/tutorial/drupal-console?p=2766 https://valuebound.com/resources/blog/power-of-drupal-console-in-drupal-8</p><div><br /></div>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-3304993609497116582021-01-13T05:49:00.005-08:002021-01-13T05:49:38.708-08:00Drupal 8: Services<p> https://niklan.net/blog/150</p>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-81051396503414858032021-01-13T03:16:00.005-08:002021-01-13T05:48:48.584-08:00Drupal 8 Authentication API<p> https://niklan.net/blog/166</p><p><br /></p><p style="background-color: white; border: 0px; box-sizing: border-box; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;"><span style="color: #222222; font-family: Ubuntu, sans-serif;"><a href="https://www.drupal.org/docs/8/core/modules/basic_auth/overview">https://www.drupal.org/docs/8/core/modules/basic_auth/overview</a></span></p><p style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;">Here is an example of a route that uses Basic Auth to authenticate users:</p><pre class=" language-php" style="background: whitesmoke; border-radius: 0.25em; border: none; box-sizing: border-box; color: #4e4e4e; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin-bottom: 1em; margin-top: 0.5em; padding: 0.25em 0.5em; vertical-align: baseline; white-space: pre-wrap;"><code class=" language-php" style="background: none; border: 0px; box-sizing: border-box; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="token shell-comment comment" style="border: none; box-sizing: border-box; color: #707070; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"># core/modules/system/tests/modules/router_test_directory/router_test.routing.yml</span>
module<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">.</span>router_test_11<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span>
path<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span> <span class="token string" style="border: 0px; box-sizing: border-box; color: #308217; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">'/router_test/test11'</span>
options<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span>
_auth<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span> <span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">[</span> <span class="token string" style="border: 0px; box-sizing: border-box; color: #308217; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">'basic_auth'</span> <span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">]</span>
requirements<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span>
_user_is_logged_in<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span> <span class="token string" style="border: 0px; box-sizing: border-box; color: #308217; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">'TRUE'</span>
defaults<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span>
_content<span class="token punctuation" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">:</span> <span class="token string" style="border: 0px; box-sizing: border-box; color: #308217; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">'\Drupal\router_test\TestContent::test11'</span>
</code></pre><p style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;">In order to access to <code class=" language-php" style="background: whitesmoke; border-radius: 0.25em; border: 0px; box-sizing: border-box; font-family: Monaco, Consolas, "Andale Mono", "Ubuntu Mono", monospace; font-size: 0.75em; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0.25em; vertical-align: baseline; white-space: pre-wrap;"><span class="token operator" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span>router_test<span class="token operator" style="border: 0px; box-sizing: border-box; color: #555555; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span>test11</code>, you have to fill the Authentication header with a valid Drupal user who has permissions to access to that page.</p><p style="background-color: white; border: 0px; box-sizing: border-box; color: #222222; font-family: Ubuntu, sans-serif; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px 0px 1.385em; padding: 0px; vertical-align: baseline;">Note that Basic Auth is NOT a means of logging into a Drupal site in order to make service GET requests that depend on the identity of the logged-in user (e.g. a views REST display that uses an Authored By relationship to return content belonging to the logged-in user). It is cookie authentication that makes views Relationships possible. See <a href="https://www.drupal.org/node/2076725" rel="nofollow" style="border: 0px; box-sizing: border-box; color: #0678be; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin: 0px; padding: 0px; text-decoration-line: none; vertical-align: baseline;">Using other authentication protocols</a> for more on how to login from a client application and get the session cookie.</p>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-82610679537709321292021-01-13T01:26:00.005-08:002021-01-13T01:53:13.413-08:00Drupal 8 Configuration<p> </p><span id="docs-internal-guid-a6772705-7fff-30b8-61c4-ce8c224f603e"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.drupal.org/docs/8/modules/configuration-split/split-directory-structure" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><br class="Apple-interchange-newline" />https://www.drupal.org/docs/8/modules/configuration-split/split-directory-structure</span></a></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">best method to organize configuration location is</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">sites/default/files/config/sync</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Grouped splits</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">:</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">../</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">config</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">/</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">├── sync</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">│ config</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">yml</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">│ </span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">...</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">└── splits</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> ├── dev</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> │ config</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">yml</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> │ </span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">...</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> └── live</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> config</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">yml</span></p><div><br /></div><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="607"></col></colgroup><tbody><tr style="height: 26.5pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.drupal.org/docs/8/configuration-management/changing-the-storage-location-of-the-sync-directory" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/changing-the-storage-location-of-the-sync-directory</span></a></p></td></tr><tr style="height: 88pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/workflow-using-the-drupal-ui</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.drupal.org/docs/8/configuration-management/changing-the-storage-location-of-the-sync-directory" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/changing-the-storage-location-of-the-sync-directory</span></a></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.drupal.org/docs/8/configuration-management/workflow-using-drush" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/workflow-using-drush</span></a></p><br /></td></tr><tr style="height: 25.75pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/workflow-using-drush</span></p></td></tr><tr style="height: 25.75pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://www.drupal.org/project/config_readonly" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/project/config_readonly</span></a></p><br /></td></tr><tr style="height: 24.75pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/api/configuration-api/configuration-override-system</span></p></td></tr><tr style="height: 145pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: middle;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/modules/configuration-split</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/project/config_split</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/modules/configuration-split/cli-integration</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/modules/configuration-split/per-environment-configuration</span></p></td></tr><tr style="height: 90.25pt;"><td style="overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: bottom;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/file-system-based-workflow</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/configuration-management/keeping-your-local-and-remote-sites-synchronized-drupal-8</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://medium.com/@ChandeepKhosa/easy-drupal-8-configuration-management-with-fellow-developers-743018498d6f" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://medium.com/@ChandeepKhosa/easy-drupal-8-configuration-management-with-fellow-developers-743018498d6f</span></a></p><br /><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">https://www.drupal.org/docs/8/modules/configuration-split/creating-a-simple-split-configuration-dev-modules-only-in-dev</span></p><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 14pt;"><span style="background-color: transparent; color: #222222; font-family: Verdana; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">in settings.php</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #0678be; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">$settings</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #308217; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">'config_exclude_modules'</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">]</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">=</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #308217; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">'devel'</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">,</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #4e4e4e; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #308217; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">'stage_file_proxy'</span><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">];</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span style="font-family: inherit; white-space: pre-wrap;">Configuration schema-metadata</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;">https://www.drupal.org/docs/drupal-apis/configuration-api/configuration-schemametadata</p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;">https://drupalbook.org/ru/docs/8/api/configuration-api/configuration-schemametadata</p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 11pt; margin-top: 6pt;"><span face="Consolas, sans-serif" style="background-color: whitesmoke; color: #555555; font-size: 8.5pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><br /><br /><br /><br /><br /><br /></td></tr></tbody></table></div></span>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-3407440309014761092015-12-23T12:09:00.002-08:002015-12-23T12:09:41.148-08:00Распространенные ошибки при разработке, недочеты в коде и рекомендации<div dir="ltr" style="text-align: left;" trbidi="on">
Распространенные ошибки при разработке, недочеты в коде и<br />
рекомендации.<br />
1. Двойные кавычки. Старайтесь использовать их только когда это необходимо, ибо<br />
http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double <br />
2. вместо<br />
<br />
if (is_array($var) && isset($var[‘abcde’]) && $var[‘abcde’])<br />
{...} <br />
достаточно написать <br />
if (!empty($var[‘abcde’])) {...} <br />
<br />
, даже если<br />
переменная <br />
$var <br />
не объявлена, или она пришла не в виде массива, или в массиве <br />
$var <br />
отстутствует ключ <br />
‘abcde’ <br />
.<br />
3. вместо <br />
array_push($array, $value); <br />
достаточно написать <br />
$array[] = $value;<br />
4. вместо <br />
if ($a > 0) {...} <br />
можно написать <br />
if ($a) {...} <br />
, хотя в случае если $a<br />
меньше нуля это не прокатит. Однако в разработке под друпал мы редко работаем с отрицательными числами.<br />
5. вместо <br />
if (count($array)) {...} <br />
достаточно написать <br />
if ($array) {...} <br />
6. вместо <br />
if ($x) {$a = ‘yes’;} else {$a = ‘no’;} <br />
<br />
целесообразнее написать <br />
$ <br />
a =<br />
$x ? ‘yes’ : ‘no’;<br />
7. вместо <br />
$a == ‘yes’ ? $b = 1 : $b = 0; <br />
пишем <br />
$b = $a == ‘yes’ ? 1 : 0;<br />
8. вместо <br />
$a = $b > 10 ? TRUE : FALSE; <br />
пишем <br />
$a = $b > 10;<br />
9. многие пишут<br />
<br />
if (isset($var)) {unset($var);} <br />
. Это неправильно. Unset не<br />
нуждается в такой проверке.<br />
10. бывает и так: <br />
unset($var); $var = array(); <br />
.<br />
11. C/C++ программисты, опустившиеся до PHP. Отбрасываем привычки навроде приведения<br />
типов (int)$var, (string)$str без нужды при каждом пуке (было такое, было). Изучите <br />
“Loose<br />
comparisons with ==” <br />
, <br />
“Strict comparisons with ===” <br />
и <br />
“Comparisons of $x with PHP functions” <br />
(гугл в<br />
помощь). <br />
12. Не используем алиасы функций вместо актуальных (например, <br />
sizeof() = count(),<br />
chop() = rtrim() <br />
)<br />
13. Помните, что вызов функции <br />
t(‘text’) <br />
влечет за собой сохранение в базе переводов<br />
значения ‘text’, если оно там отсутствует, или перевода на русский этого текста, если он<br />
есть. Поэтому использование динамических строк типа <br />
t(‘count is ’ . $value)<br />
недопустимо. Вам придется наблюдать в управлении переводами кучу неперевёденных<br />
строк <br />
‘count is 1’, ‘count is 2’, ‘count is 3’, ‘count is 333’ <br />
, и т.д. Вместо<br />
этого пишем <br />
t(‘count is @value’, array(‘@value’ => $value)); <br />
. <br />
<br />
Изучите<br />
справку по <br />
t() <br />
и <br />
format_plural() <br />
.<br />
14. Вместо <br />
if (node_load(123) && $a) {...} <br />
<br />
и т.п., следует писать <br />
if ($a &&<br />
node_load(123)) <br />
. Сначала выполняем легкие проверки, а потом тяжелые, не тормозим<br />
без нужды работу сайта, drupal и так тормозной!<br />
15. некоторые после использования переменной могут в конце написать<br />
unset($переменная) <br />
, несмотря на то, что далее к ней не будет обращения. Это не очень<br />
нужно.<br />
16. switch/case <br />
<br />
стейтмент не пихаем везде и всюду. Используем разумно.<br />
17. @ <br />
зло.<br />
18. Белый экран иногда (обычно на сабмитах форм), ошибок в коде нет, логи тоже пусты, “не<br />
знаю что делать”. скорее всего закрывающий тэг <br />
?> <br />
с переносом или пробелом после,<br />
либо PHPфайл в UTF8 с BOM. Ктото нарушил пункт No0 :) Ищите в последних<br />
модифицированных или добавленных файлах.<br />
19. Какието внезапные трудно отлавливаемые ошибки в js или стили едут скорее всего<br />
чтото связанное с UTF8 или кириллицей в скриптах. Либо использование для последнего<br />
елемента jsмассива запятой. Болезненно для ИЕ.<br />
20. Проблема сайт внезапно стал тормозить. Причины могуть быть разные, но одна из самых<br />
неявных вы по какимто причинам решили удалить включенный модуль физически, но не<br />
отключили его в админке. Ядро в таком случае каждый раз, видя в БД включенный модуль<br />
(поле <br />
status=1 <br />
в таблице <br />
system <br />
) <br />
и не находя его тело, начинает искать по всем папкам. При<br />
этом, независимо от результатов поиска система его сама не отключает.<br />
21. Если переменная <br />
$var <br />
<br />
существует, но равна <br />
NULL <br />
, то <br />
isset($var) <br />
<br />
вернет <br />
FALSE <br />
.<br />
22. Вместо <br />
array_key_exists() <br />
<br />
проще использовать <br />
isset() <br />
. Исключение определение<br />
наличия в массиве ключа даже со значением NULL(см выше), тут <br />
isset() <br />
не сработает.<br />
23. foreach (db_query(‘нехитрый SQLзапрос’) as $result) {...} <br />
это не<br />
страшно. <br />
24. запросы (даже нехитрые) в теле foreach/for вот что страшно.<br />
25. Вместо <br />
strlen() <br />
<br />
используем аналог <br />
<br />
drupal_strlen() <br />
! Тоже самое касается<br />
substr(), strtolower(), strtoupper() <br />
. См. справку. Исключение гарантированно не содержащие UTF8 строки.<br />
26. Имена таблиц в SQLзапросах оборачиваем в <br />
{плейсхолдеры} <br />
. <br />
Также <br />
не <br />
используем т.н.<br />
грависы (`такие` `вот` `кавычки`)<br />
27. Запросы генерим по обстоятельствам, гдето используем объект <br />
db_select() <br />
, гдето<br />
напрямую вызов<br />
<br />
db_query() <br />
, как проще. <br />
28. При сохранении таймштампа в БД используем константу <br />
REQUEST_TIME <br />
29. При выводе этого таймштампа юзеру, используем друпаловскую <br />
format_date() <br />
.<br />
30. Прежде чем изобретать велосипед для игрищ с датами/временем не поленитесь заглянуть<br />
в справку по PHP. Там для этого инструментов навалом. Плюс велосипеды в поставке<br />
Друпала.<br />
31. Тоже самое касается строк и массивов.<br />
32. В функции <br />
my_module_install() <br />
<br />
в установщике модуля, вместо <br />
t(‘text’) <br />
<br />
пишем <br />
$t =<br />
get_t(); $t(‘text’);<br />
33. В хуке <br />
hook_menu() <br />
<br />
при указании заголовка пункта меню <br />
(‘title’ => ‘Title’) <br />
не<br />
используем фю <br />
t() <br />
.<br />
34. Создал новый пункт меню программно (<br />
hook_menu() <br />
) не работает. Нужно чистить кэш<br />
Друпала.<br />
35. Также после добавлении какихлибо хуковых функций они не “подхватываются” чистим<br />
кэш Друпала.<br />
36. Добавление всех подряд файлов модуля в директивы <br />
files[] = <br />
... .infoфайла. Если вы<br />
увидели такой подход в скачанном с друпал.орг модуле, то это не значит что так и надо<br />
делать. Читаем внимательно <br />
http://drupal.org/node/542202#files<br />
37. Самое главное никаких модификаций в файлах ядра или сторонних модуле</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-35804640302021538032015-05-12T01:29:00.005-07:002015-05-12T01:31:23.397-07:00Group by views_pre_execute and "group by"/**
* Implements hook_views_pre_execute().
* @param $view
*/
function mymodule_views_pre_execute(&$view) {
if ($view->name == 'commerce_orders' && $view->current_display == 'admin_page') {
// Group order list on /admin/commerce/orders/list page.
$view->build_info['query']->groupBy('commerce_order.order_id');
}
}
Help links
https://www.drupal.org/node/1342616
http://linuxdev.dk/blog/altering-views-queriesCosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-76511786856918455462015-05-12T01:08:00.002-07:002015-05-12T01:11:29.872-07:00Create a custom views access plugin<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="field field-name-body field-type-text-with-summary field-label-hidden">
<div class="field-items">
<div class="field-item even" property="content:encoded">
<br />
If you want to create a custom views access plugin the reason for this will be to allow you to have an entry point to add custom logic to protect the access to your view.<br />
Let say you need a finer access control to a view than roles and permissions. For example you are storing properties on a user object who determine if certain user can see certain views independent of their roles.<br />
What we need to do, is to configure our views correctly with a views access plugin. <br />
<b>The hacky way: </b><br />
You could load the user in the template file of your view and check for the property but this is not what we want to do. While this would work you would have to redo it in every template and you will not be able to configure it. It is also difficult to control. Its hacky and hacky solutions tend to cause a lot of maintenance. Making these quick solutions costing more in the long run. This is worth a different blog post entirely.<br />
<b>Here is the drupal way:</b><br />
Views has this beautiful architecture in place that allows you to extend its base classes. If you start writing a custom views plugin the best thing to do is to examine an other plugin of its kind. For example check out the permissions access plugin. (tip: a good way to write plugins is to look at examples from views or other module implementing the same system)<br />
The file:<br />
<br />
<div class="geshifilter">
<pre class="text geshifilter-text" style="font-family: monospace;">/views/plugins/views_plugin_access_perm.inc</pre>
</div>
<div class="geshifilter">
<pre class="text geshifilter-text" style="font-family: monospace;"><?php
/**
* @file
* Definition of views_plugin_access_perm.
*/
/**
* Access plugin that provides permission-based access control.
*
* @ingroup views_access_plugins
*/
class views_plugin_access_perm extends views_plugin_access {
function access($account) {
return views_check_perm($this->options['perm'], $account);
}
function get_access_callback() {
return array('views_check_perm', array($this->options['perm']));
}
function summary_title() {
$permissions = module_invoke_all('permission');
if (isset($permissions[$this->options['perm']])) {
return $permissions[$this->options['perm']]['title'];
}
return t($this->options['perm']);
}
function option_definition() {
$options = parent::option_definition();
$options['perm'] = array('default' => 'access content');
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$perms = array();
$module_info = system_get_info('module');
// Get list of permissions
foreach (module_implements('permission') as $module) {
$permissions = module_invoke($module, 'permission');
foreach ($permissions as $name => $perm) {
$perms[$module_info[$module]['name']][$name] = strip_tags($perm['title']);
}
}
ksort($perms);
$form['perm'] = array(
'#type' => 'select',
'#options' => $perms,
'#title' => t('Permission'),
'#default_value' => $this->options['perm'],
'#description' => t('Only users with the selected permission flag will be able to access this display. Note that users with "access all views" can see any view, regardless of other permissions.'),
);
}
}</pre>
</div>
This is a clear example that we can use to start with. You can see there are some essential functions to create this plugin. Lets check our example to see which ones.<br />
Create a file called custommodule_access_plugin.inc in the root of your custom module.<br />
<div class="geshifilter">
<pre class="text geshifilter-text" style="font-family: monospace;"><?php
/**
* Access plugin that provides property based access control.
*/
class custommodules_access_plugin extends views_plugin_access {
function summary_title() {
return t('Custom acces plugin');
} // summary_title()
/**
* Determine if the current user has access or not.
*/
function access($account) {
return custommodules_access($account);
}
function get_access_callback() {
return array('custommodules_access', array());
}
}</pre>
</div>
For the custom views plugin you need three functions. The summary_title to return the title in the admin interface. This is what you will see when you go to the views interface and you select your plugin. It will appear next to role based and permission based access in the views interface.<br />
Then we have our access method where you the custom callback. Finaly you must declare to views your custom access callback. You can pass arguments if need using the array see in the example above.<br />
We have our file with the class now we need to tell views that we have created a new access plugin.<br />
Two things need to be done. First in the info file you must tell there is a file containing the class.<br />
<div class="geshifilter">
<pre class="text geshifilter-text" style="font-family: monospace;">name = custommodule
description = Custom code
core = 7.x
package = custom
dependencies[] = views
files[] = custommodule_access_plugin.inc</pre>
</div>
The you need to implement a hook_views_plugins to tell views that there is a new custom access plugin available<br />
<div class="geshifilter">
<pre class="text geshifilter-text" style="font-family: monospace;"> /**
* Implements hook_views_plugins()
*/
function custommodule_views_plugins() {
$plugins = array(
'access' => array(
'test' => array(
'title' => t('Custom Access check'),
'help' => t('this is a custom access plugin'),
'handler' => 'custommodule_access_plugin',
'path' => drupal_get_path('module', 'custommodule'),
),
),
);
return $plugins;
}</pre>
</div>
Our access callbacks doing the custom checks.<br />
<div class="geshifilter">
<pre class="text geshifilter-text" style="font-family: monospace;"> function custommodules_access($account = NULL) {
global $user;
$access = false;
$account = user_load($user->uid);
$optionfield = field_get_items('user', $account, 'field_option');
//In the future more values are possible so this is extendible
//For now only +eur exists
$allowed_values = array('eur');
$options = explode('+', $optionfield[0]['value']);
foreach ($allowed_values as $allowed_value) {
if (in_array($allowed_value, $options)) {
$access = true;
}
}
return $access;
}</pre>
</div>
Here we are checking on certain values that are stored in a field of a user of certain role. When a user has these properties we want the callback to return true. This will grant access.<br />
Now that you have this plugin you can start using it in all your views by going to the interface access section and select the plugin.<br />
<br />
<br />
Original source http://dominiquedecooman.com/drupal-7-tip-create-custom-views-access-plugin </div>
</div>
</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-42044977990533144572015-03-04T20:12:00.001-08:002015-03-04T20:12:23.154-08:00<div dir="ltr" style="text-align: left;" trbidi="on">
<h3>
Выключить отображение php ошибок на сайте:</h3>
<pre><code># supress php errors
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0</code></pre>
<h3>
<strong>Включить отображение php ошибок на сайте:</strong></h3>
<pre>php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2047</pre>
<br />
<h3>
Вывод ошибок php в произвольный лог файл</h3>
<pre dir="ltr"><code># enable PHP error logging
php_flag log_errors on
php_value error_log /home/path/public_html/domain/PHP_errors.log</code></pre>
<h3>
Защищаем папку с логами от доступа</h3>
<pre dir="ltr"><code># prevent access to PHP error log
<Files PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files></code></pre>
<h3>
Выставляем уровень вывода ошибок</h3>
integer — флаг, который задает глубину вывода ошибок. 0 — не выводить
ничего, 8191- выводить в лог все. Значение 1 — выводит ошибки. Более
подробное описение в документации по PHP.<br />
<pre dir="ltr"><code># general directive for setting php error level
php_value error_reporting integer</code></pre>
<h3>
Выставляем максимальный размер для строки с ошибкой</h3>
<pre dir="ltr"><code># general directive for setting max error size
log_errors_max_len integer</code></pre>
<h3>
Отключить логирование повторяющихся ошибок</h3>
<pre dir="ltr"><code># disable repeated error logging
php_flag ignore_repeated_errors on
php_flag ignore_repeated_source on</code></pre>
<h3>
Настройки для сайта в рабочем режиме</h3>
<div dir="ltr">
<pre><code><code># PHP error handling for production servers
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_reporting -1
php_value log_errors_max_len 0
</code></code><Files /home/path/public_html/domain/PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files></pre>
</div>
<h3>
Конфигурация для отладки или разработки</h3>
<div dir="ltr">
<pre><code><code># PHP error handling for development servers
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/path/public_html/domain/PHP_errors.log
# [see footnote 3] # php_value error_reporting 999999999
php_value error_reporting -1
php_value log_errors_max_len 0
</code></code><Files /home/path/public_html/domain/PHP_errors.log>
Order allow,deny
Deny from all
Satisfy All
</Files></pre>
</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-24775934574713691142015-03-04T19:56:00.002-08:002015-03-04T19:56:26.060-08:00<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 class="contentheading">
Настройка аутентификации в apache </h2>
<div class="article-tools">
<div class="article-meta">
</div>
<div class="buttonheading">
<span>
<a href="http://sys-it.ru/component/mailto/?tmpl=component&link=aHR0cDovL3N5cy1pdC5ydS9zZWN1cml0eS8xMjktMjAxMS0xMi0zMC0wNC0zOS0zMQ%3D%3D" title="E-mail"><img alt="E-mail" src="http://sys-it.ru/templates/ja_purity/images/emailButton.png" /></a> </span>
<span>
<a href="http://sys-it.ru/security/129-2011-12-30-04-39-31?tmpl=component&print=1&page=" rel="nofollow" title="Печать"><img alt="Печать" src="http://sys-it.ru/templates/ja_purity/images/printButton.png" /></a> </span>
<span>
<a href="http://sys-it.ru/security/129-2011-12-30-04-39-31?format=pdf" rel="nofollow" title="PDF"><img alt="PDF" src="http://sys-it.ru/templates/ja_purity/images/pdf_button.png" /></a> </span>
</div>
</div>
<div class="article-content">
Если хочется закрыть какую либо часть сайта от любопытных глаз, самым
простым способом будет настроить аутентификацию в Apache 2.2: basic или
digest либо по IP адресам. Разница между basic и digest аутентификацией
в том что basic отправляет пароли открытым текстом, digest же
отправляет хэши паролей. Digest метод предпочтительней, так как
безопасней. Пароли будем хранить в файле в зашифрованном виде.<br />
<strong>Настройка аутентификации basic</strong><br />Вписываем в описание виртуального хоста, или директории сайта, либо создаем файл .htaccess в нужной директории сайта:<br />
<pre>AuthType basic
AuthName "private area"
AuthUserFile /usr/local/www/etc/.htpasswd
Require valid-user</pre>
Создаем директорию в которой разместим файл для аутентификации.<br />
<pre>mkdir /usr/local/www/etc</pre>
Создадим файл .htpasswd который будет хранить имена пользователей и пароли:<br />
<pre>#cd /usr/local/www/etc</pre>
<pre>#htpasswd -c .htpasswd user</pre>
И введем пароль для пользователя user.<br />Сделаем этот файл принадлежащим веб серверу и запретим чтение для остальных пользователей:<br />
<pre>#chown www:www .htpasswd</pre>
<pre>#chmod 640 .htpasswd</pre>
Поменять пароль или добавить нового пользователя можно с помощью команды:<br />
<pre>#htpasswd .htpasswd user</pre>
Для удаления пользователя можно использовать<br />
<pre>#htpasswd -D .htpasswd user</pre>
<strong>Настройка аутентификации digest</strong><br />Вписываем в описание виртуального хоста, или директории сайта, либо создаем файл .htaccess в нужной директории сайта:<br />
<pre>AuthType Digest
AuthName "private"
AuthDigestDomain /private/ http://example.com/private/
AuthDigestProvider file
AuthUserFile /usr/local/www/etc/.htdigest
Require valid-user</pre>
Создаем директорию в которой разместим файл для аутентификации.<br />
<pre>#mkdir /usr/local/www/etc</pre>
Создадим файл .htdigest который будет хранить имена пользователей и пароли:<br />
<pre>#cd /usr/local/www/etc</pre>
<pre>#htdigest -c .htdigest private user</pre>
И введем пароль для пользователя user. Обратите внимание на private в
команде, это значение должно совпадать со значением в AuthName
«private». Сделаем этот файл принадлежащим веб серверу и запретим чтение
для остальных пользователей:<br />
<pre>#chown www:www .htdigest</pre>
<pre>#chmod 640 .htdigest</pre>
Поменять пароль или добавить нового пользователя можно с помощью команды:<br />
<pre>#htdigest .htdigest private user</pre>
Для удаления пользователя можно использовать<br />
<pre>#htdigest -D .htdigest private user</pre>
Еще один способ ограничения доступа - это указать с каким IP-адресов можно попадать в директорию, например вот так:<br />
<pre>Order deny,allow
Deny from all
Allow from 192.168.1.1</pre>
<div style="text-align: justify;">
Мы запрещаем доступ всем разрешив только
с нашего IP-адреса (можно перечислить IP-адреса через пробел, или
указывать сети, например так<br />192.168.1.0/24). Директива Order задает порядок проверки, То есть сначала<br />блокируем всех а потом разрешаем избранным.</div>
</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-21201066805433631882014-07-03T04:00:00.001-07:002014-07-03T04:00:23.212-07:00Drupal 7 custom node view modes<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="content-with-sidebars" id="content" role="main">
<div class="pane panel-pane pane-page-title box-full box-style-plain box-color-stiffgrey">
<h1>
Drupal 7 custom node view modes</h1>
</div>
<div class="pane panel-pane pane-node-created box-full box-style-plain box-color-stiffgrey">
Monday, December 20, 2010 - 16:06
</div>
<div class="pane panel-pane pane-panels-mini pane-blog-tags-category">
<div class="content" role="main">
<div class="pane panel-pane pane-entity-field pane-node-field-ns-prod-entrpr-tag">
<span class="field-ns-prod-entrpr-tag">
<a href="https://www.blogger.com/tags/planet-drupal">Planet Drupal</a> </span>
<span class="field-ns-prod-entrpr-tag">
<a href="https://www.blogger.com/tags/drupal-7">Drupal 7</a> </span>
<span class="field-ns-prod-entrpr-tag">
<a href="https://www.blogger.com/tags/views">Views</a> </span>
<span class="field-ns-prod-entrpr-tag">
<a href="https://www.blogger.com/tags/theming">Theming</a> </span>
</div>
<div class="pane panel-pane pane-entity-field pane-node-field-ns-blog-post-blog">
<span class="field-ns-blog-post-blog">
<a href="https://www.blogger.com/blog/technology">Technology</a> </span>
</div>
</div>
</div>
<div class="pane panel-pane pane-entity-field pane-node-field-ns-blog-post-body box-full box-style-plain box-color-stiffgrey">
<div class="field-ns-blog-post-body clearfix">
<div class="field-item even">
One of the cool new things in Drupal 7 is the ability to easily add new “View modes” for nodes. View modes are available for other entities like comments also, but I’m gonna only cover the nodes for this time.<br />
Before, Drupal had only two “hard-coded” node view modes, the full node view and the teaser view. These two provided us just enough flexibility for most simple content listings, but quite often we needed to turn to Views in Fields mode to get more flexibility. By flexibility in this case I mean displaying the same content in different ways in different contexts.<br />
In Drupal 7 we can create additional view modes by simply implementing hook_entity_info_alter() in our custom module.<br />
<br />
<pre><code>/**
* Implements hook_entity_info_alter().
*/
function MYMODULE_entity_info_alter(&$entity_info) {
$entity_info['node']['view modes']['another_teaser'] = array(
'label' => t('Another teaser'),
'custom settings' => TRUE,
);
}</code></pre>
<br />
After defining the new view mode, we can go to content type’s “Manage Display” page and select which fields to display plus some additional options for fields, like which image style to use for image fields, for example.<br />
<img alt="display_fields.jpeg" class="media-image" src="http://www.wunderkraut.com/sites/wunderkraut.com/files/styles/large/public/display_fields.jpeg?itok=J8mLPVCw" height="348" title="display_fields.jpeg" width="480" /><br />
Next we need to get this view mode used somewhere. We’re gonna create a View for that. Set the View to Style = Unformatted, Row style = Node and select the “Another teaser” view mode from the row style options. Optionally you can create a page display with a path for the View for easier testing.<br />
<img alt="views-select-view-mode.jpeg" class="media-image" src="http://www.wunderkraut.com/sites/wunderkraut.com/files/styles/large/public/views-select-view-mode.jpeg?itok=boUsIyo7" height="348" title="views-select-view-mode.jpeg" width="480" /><br />
<img src="http://www.wunderkraut.com/sites/stage.wk.com/files/field_ns_blog_post_attach/views-select-view-mode.jpg" height="0" width="0" /><br />
Up to this point nothing is that different than creating a view in “fields” mode, and select the desired fields one by one in the view itself. The differences are mostly how we can apply some theming and custom layout for the content.<br />
To get the most out of this we’ll propably want to add a custom node.tpl.php template for this view mode. Custom node template enables easy and flexible theming and we can use standard hook_preprocess_node() function for example to control the variables we have available in the template. To make Drupal use a different .tpl.php file for view mode we need to add a new template suggestion in hook_preprocess_node().<br />
<pre><code>/**
* Implements hook_preprocess_node().
*/
function MYMODULE_preprocess_node(&$vars) {
if($vars['view_mode'] == 'another_teaser') {
$vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__another_teaser';
}
} </code></pre>
Duplicate standard node.tpl.php for the content type you need, like node--article--another-teaser.tpl.php. (NOTE: use underscores in template suggestions, dashes in the filename).<br />
There are many other ways to get the exactly same outcome, like the <a href="http://drupal.org/project/ds">Display Suite</a> module, but seems to be an overkill for a simple need what we just covered. While Views in fields mode is still most often the way to go, this opens a completely fresh option if you need to reuse the templates in multiple views, or you need to display every content type in a different way in the same listing without doing gigantic template files for views.</div>
</div>
</div>
<div class="pane panel-pane pane-panels-mini pane-social-sharing-links">
<div class="content" role="main">
<div class="pane panel-pane pane-custom pane-1">
<a class="icons-twitter" href="http://twitter.com/home?status=http://www.wunderkraut.com/blog/drupal-7-custom-node-view-modes/2010-12-20" target="_blank">share on twitter</a>
</div>
<div class="pane panel-pane pane-custom pane-2">
<a class="icons-facebook" href="http://www.facebook.com/share.php?u=http://www.wunderkraut.com/blog/drupal-7-custom-node-view-modes/2010-12-20" target="_blank">share on facebook</a>
</div>
</div>
</div>
<div class="pane panel-pane pane-node-comments box-full box-style-plain box-color-stiffgrey">
<h2 class="pane-title">
Comments</h2>
<a href="https://www.blogger.com/null" id="comment-238"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Sampo (not verified)</span> on Mon, 12/20/2010 - 18:21 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/238#comment-238" rel="bookmark">This really rocks!</a></h3>
</header>
<div class="content">
<div class="comment-body">
This really rocks!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-239"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Jacques (xmacinfo) (not verified)</span> on Mon, 12/20/2010 - 23:26 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/239#comment-239" rel="bookmark">Impressive! This will change</a></h3>
</header>
<div class="content">
<div class="comment-body">
Impressive! This will change forever how I view content type display and usage.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-240"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">TheFrank (not verified)</span> on Mon, 12/20/2010 - 23:42 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/240#comment-240" rel="bookmark">:). Can't wait to start</a></h3>
</header>
<div class="content">
<div class="comment-body">
:). Can't wait to start developing with D7. (but first I must to finish my current projects :(</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-241"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">mori (not verified)</span> on Tue, 12/21/2010 - 11:14 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/241#comment-241" rel="bookmark">THANX !!!</a></h3>
</header>
<div class="content">
<div class="comment-body">
I searched a lot for that !!!<br />
I also tried Display Suite for this, but currently it doesn´t work correctly with views and of course is an overkill. THANKS AGAIN !!!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-242"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://www.malaysiadiscovery.co.uk/" rel="nofollow">Steven (not verified)</a> on Tue, 12/21/2010 - 16:17 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/242#comment-242" rel="bookmark">Thanks</a></h3>
</header>
<div class="content">
<div class="comment-body">
I was literally looking for this feature yesterday and found your post on drupal planet. Talk about good timing.<br />
Also thanks for the drupal 7 tips. Looking forward to working on new projects so can start with D7.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-243"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">yched (not verified)</span> on Tue, 12/21/2010 - 18:24 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/243#comment-243" rel="bookmark">Thanks for this cool</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thanks for this cool highlight of the feature. <br />
This is especially powerful in D7 since you can now define field order per view mode (in CCK D6, field display order = form display order, for all view modes)<br />
Note that Display Suite in D7 got notably skimmed down since much of its features are now handled in core, or can plug directly on the main core field UI, instead of having to develop a complete alternate UI in D6.<br />
Display Suite notably offers a UI to create your own custom view modes - although, as you point, creating them through code is quite straightforward.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-244"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">marcvangend (not verified)</span> on Thu, 12/30/2010 - 02:54 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/244#comment-244" rel="bookmark">$view_mode</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thanks, that was helpful. Two remarks about your code:<br />
AFAIK $vars['build_mode'] is not available in preprocess_node functions, but $vars['view_mode'] is.<br />
I took the creation of template suggestions a small step further by doing this: <br />
/**<br />
* Implements hook_preprocess_node().<br />
*/<br />
function MYMODULE_preprocess_node(&$vars) {<br />
$vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__' . $vars['view_mode'];<br />
}<br />
As a result, I can now use this file naming pattern for all possible node type & view mode combinations: node--NODE-TYPE--VIEW-MODE.tpl.php.</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-245"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Juha Niemi (not verified)</span> on Thu, 12/30/2010 - 09:38 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/245#comment-245" rel="bookmark">You are right,</a></h3>
</header>
<div class="content">
<div class="comment-body">
You are right, $vars['build_mode'] doesn't seem to exist in hook_preprocess_node. It might be that I used an outdated Drupal 7 or something. I corrected it to $vars['view_mode'] now. Thanks!<br />
Thanks for the hint to use a general vars['view_mode'] in the template suggestions.</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-353"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Axel (not verified)</span> on Tue, 11/29/2011 - 23:58 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/353#comment-353" rel="bookmark">"Preview Trimmed Version" </a></h3>
</header>
<div class="content">
<div class="comment-body">
Hi!<br />
I am very new to Drupal and can´t figure out why my html codes doesn´t work in content when saved. If i check the preview -- "Preview Trimmed Version" is how i want it to be displayed in content when saved. Now "content" displays in the "Preview full version" which is not how the html codes should turn out. I checked the html codes and they are correct. Please, if any one knows how to solve this it would be great! Thank you.</div>
</div>
<footer>
</footer>
</article>
</div>
</div>
<a href="https://www.blogger.com/null" id="comment-258"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">ludo (not verified)</span> on Fri, 02/25/2011 - 20:23 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/258#comment-258" rel="bookmark">yes but ...</a></h3>
</header>
<div class="content">
<div class="comment-body">
hello <br />
it's perfect for what i need, but where i put the code :<br />
/**<br />
* Implements hook_entity_info_alter().<br />
*/<br />
function MYMODULE_entity_info_alter(&$entity_info) {<br />
$entity_info['node']['view modes']['another_teaser'] = array(<br />
'label' => t('Another teaser'),<br />
'custom settings' => TRUE,<br />
);<br />
} <br />
?<br />
I must create a new module just for that?<br />
Im a newbie... <br />
sorr for my poor english</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-259"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Juha Niemi (not verified)</span> on Fri, 02/25/2011 - 21:09 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/259#comment-259" rel="bookmark">Custom module</a></h3>
</header>
<div class="content">
<div class="comment-body">
Hi! Thanks for your comment. Yes - you need a custom module where these snippets are placed. I didn't cover the steps to create a custom module, because there's a lot resources for that available on the web.<br />
See: <a href="http://drupal.org/node/361112">http://drupal.org/node/361112</a></div>
</div>
<footer>
</footer>
</article>
</div>
<a href="https://www.blogger.com/null" id="comment-266"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">MMGG (not verified)</span> on Sat, 04/16/2011 - 01:33 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/266#comment-266" rel="bookmark">Another useful tip relating</a></h3>
</header>
<div class="content">
<div class="comment-body">
Another useful tip relating to theming custom node views...<br />
Instead of creating separate template files per view mode you can use the $view_mode variable in your default node type template file. <br />
for example in your "node--news_post.tpl.php" file, you can set the output of your "another_teaser" custom view mode with the following...<br />
custom teaser output code here</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-290"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Bart (not verified)</span> on Fri, 06/24/2011 - 17:28 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/290#comment-290" rel="bookmark">update to Views 3</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thanks for the info. However, I'm a bit stuck with the part on the views, using Views 3 (currently RC1). I've got something working, but I'm not sure I've done it the right way. "Style settings" appears to no longer exist, the closest I can find is "unformatted list".<br />
Could you, or anybody who feels like it, comment on how you should do do this using Views 3?<br />
And is a view really necessary? It seems like overkill to me, what good is a display mode in core if you can't use it without a contrib module...</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-294"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Anonymous (not verified)</span> on Wed, 07/13/2011 - 19:56 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/294#comment-294" rel="bookmark">thx for the nice snipped.</a></h3>
</header>
<div class="content">
<div class="comment-body">
thx for the nice snipped. Did'nt work for me. If you also have problems with the code, try defining TRUE as a string ('TRUE')....</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-469"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Anonymous (not verified)</span> on Tue, 06/05/2012 - 17:37 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/469#comment-469" rel="bookmark">I had the same problem. Set</a></h3>
</header>
<div class="content">
<div class="comment-body">
I had the same problem. Set TRUE as a string helped for me!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-479"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://rastasoft.ir/" rel="nofollow">sepehr (not verified)</a> on Mon, 07/09/2012 - 13:29 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/479#comment-479" rel="bookmark">you shouldn't use a string if</a></h3>
</header>
<div class="content">
<div class="comment-body">
you shouldn't use a string if you use then php interprets it always as TRUE , you probabely didn't activate your custom view mode under `Custom display settings` in `MANAGE DISPLAY` tab.</div>
</div>
<footer>
</footer>
</article>
</div>
<a href="https://www.blogger.com/null" id="comment-298"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://vyoumans.com/" rel="nofollow">Anonymous (not verified)</a> on Sun, 08/07/2011 - 15:20 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/298#comment-298" rel="bookmark">Using this code to create a JSON view formatter...</a></h3>
</header>
<div class="content">
<div class="comment-body">
I have been using Views_datasource in D6 for a while, to output JSON files. One of the things I do is output the URL of Images as oppose to the images them selves. I have mobile apps that consume this data.<br />
I want to try doing this in D7 and VIews3, but no luck out of the box. So I ran across your article, and I am wondering if this could be a solution. <br />
So one of the "another teaser" I would create a view of type JSON. and all of the FILES, and IMAGES would be URL's. The output would have a path with a .json extension. What more am I missing, and am I going int he right direction? perhaps there is some sample code out there that I could look at?<br />
thanks</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-301"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Mark (not verified)</span> on Fri, 08/26/2011 - 19:04 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/301#comment-301" rel="bookmark">Thanks for this article</a></h3>
</header>
<div class="content">
<div class="comment-body">
Excellent and to-the-point article on a super helpful topic. Thank you. This is an excellent addition to D7, too bad it's not documented. (Also the post by marcvangend really helps too).<br />
In case it helps anyone else, I discovered the 'hook_entity_info_alter' feature in the node_example module (example_node_list), but they failed to mention where this modification would manifest itself in the Drupal admin area. It didn't even occur to me that it added a new view mode in the Manage Display tab. So simple! That detail would be helpful.<br />
Anyway, thanks for helping me connect the dots!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-308"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Paul (not verified)</span> on Sat, 10/01/2011 - 10:58 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/308#comment-308" rel="bookmark">How to show only one node</a></h3>
</header>
<div class="content">
<div class="comment-body">
Great. Works for me. My views looks a little different but works with Format:unformatted list and show:content. Well I have an error message I haven't looked into yet but it's using my template file so that's good enough for me for now.<br />
How do I use this view with a specified node? I don't want to look at all the nodes on the same page. I want to be able to select one node and then perhaps switch between view modes for just that node. I imagine I can possibly pass an argument to the view and filter the view based on that argument but I don't know how or if there is an easier/better way.<br />
Thanks again.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-315"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">amruta (not verified)</span> on Wed, 10/05/2011 - 13:59 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/315#comment-315" rel="bookmark">unable to see new view mode</a></h3>
</header>
<div class="content">
<div class="comment-body">
hi<br />
I am not sure what wrong I am doing. I created new module in sites\all\modules\ as energy_landing. Created .info and .module file enable module but still I cant see new view mode.. Please help</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-376"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">xwing (not verified)</span> on Tue, 12/06/2011 - 07:54 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/376#comment-376" rel="bookmark">I'm at the same place. Did</a></h3>
</header>
<div class="content">
<div class="comment-body">
I'm at the same place. Did you solve this yet?</div>
</div>
<footer>
</footer>
</article>
</div>
<a href="https://www.blogger.com/null" id="comment-337"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://kahthong.com/" rel="nofollow">Kah Thong (not verified)</a> on Tue, 11/15/2011 - 06:02 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/337#comment-337" rel="bookmark">Thank you!</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thanks for this article. Managed to add another display mode for grids in Views.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-339"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">cadabra (not verified)</span> on Tue, 11/22/2011 - 16:33 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/339#comment-339" rel="bookmark">Small but powerful</a></h3>
</header>
<div class="content">
<div class="comment-body">
Very nice tip. It might not work when used for the first time until you clear the cache twice: once after adding the new hook and then second time. Duno why, but without second cache clearing I had the custom view mode checkbox checked, but the mode didn't appear in the horizontal view modes list. Now it's ok.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-358"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://barraponto.blog.br/" rel="nofollow">Capi Etheriel (not verified)</a> on Thu, 12/01/2011 - 12:01 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/358#comment-358" rel="bookmark">This tutorial has been copied</a></h3>
</header>
<div class="content">
<div class="comment-body">
I guess <a href="http://10jumps.com/blog/new-and-noteworthy-drupal-7-view-modes">http://10jumps.com/blog/new-and-noteworthy-drupal-7-view-modes</a> is a year-later dumbed down copy of this tutorial.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-371"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://www.beyondesigns.net/" rel="nofollow">Khaled (not verified)</a> on Sun, 12/04/2011 - 11:07 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/371#comment-371" rel="bookmark">You need to clear the cache twice</a></h3>
</header>
<div class="content">
<div class="comment-body">
Yes,<br />
For some reason the new view mode didn't appear without clearing the cache twice. Very useful tutorial. Thanks!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-379"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://stabell-kulo.net/livet" rel="nofollow">Tage Stabel-Kulø (not verified)</a> on Sun, 12/11/2011 - 17:51 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/379#comment-379" rel="bookmark">Make it into Drupal?</a></h3>
</header>
<div class="content">
<div class="comment-body">
Will you (or have you) made this into an official addition to Drupal?</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-380"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://www.davereid.net/" rel="nofollow">Dave Reid (not verified)</a> on Thu, 12/15/2011 - 21:50 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/380#comment-380" rel="bookmark">You could just use Entity</a></h3>
</header>
<div class="content">
<div class="comment-body">
You could just use Entity View Modes (<a href="http://drupal.org/project/entity_view_mode">http://drupal.org/project/entity_view_mode</a>) which simply supports defining custom view modes as well as supporting them as template suggestions for entity types.</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-419"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://www.hoverfusion.com/" rel="nofollow">HoverFusion (not verified)</a> on Wed, 02/22/2012 - 00:08 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/419#comment-419" rel="bookmark">Yes, this was my pick after</a></h3>
</header>
<div class="content">
<div class="comment-body">
Yes, this was my pick after researching, after reading this article. I think this module uses the system described here, but its handy if you do not want to mess with the code and writing own modules... Anyway, article is great. And tjhis module simplifies much for me now :)</div>
</div>
<footer>
</footer>
</article>
</div>
<a href="https://www.blogger.com/null" id="comment-387"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Chill (not verified)</span> on Fri, 01/06/2012 - 16:40 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/387#comment-387" rel="bookmark">Thank you!</a></h3>
</header>
<div class="content">
<div class="comment-body">
Just wanted to thank you for the custom view mode tip. So thanks! :)</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-393"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Jānis Bebrītis (not verified)</span> on Fri, 01/13/2012 - 19:12 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/393#comment-393" rel="bookmark">This post helped me again ;)</a></h3>
</header>
<div class="content">
<div class="comment-body">
This post helped me again ;) Thanks Juha!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-409"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://elevatedthird.com/" rel="nofollow">Kevin (not verified)</a> on Wed, 02/15/2012 - 00:22 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/409#comment-409" rel="bookmark">Great!</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thanks, this has been a huge help!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-461"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Seb (not verified)</span> on Fri, 04/06/2012 - 11:46 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/461#comment-461" rel="bookmark">choosing multiple page for same content</a></h3>
</header>
<div class="content">
<div class="comment-body">
Hello, I don't know if i'm at the right place for that. In fact, i'm fed up to search on the web for this.<br />
I want , when i create a content, to choose multiple node/pages to display my content. For exemple when i'm creating my article i want a fields who allow me to select multiple link of my website.<br />
Is there a way to do that with, just creating a new view or content type ? Or should i alter a module or create a new one for my purpose ?<br />
A link with a turtorial or similar case should be fine too ;)<br />
thank you in advance for your response.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-462"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://nan.im/" rel="nofollow">nan (not verified)</a> on Tue, 04/10/2012 - 11:00 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/462#comment-462" rel="bookmark">Why not using the hook_entity</a></h3>
</header>
<div class="content">
<div class="comment-body">
Why not using the hook_entity_info() API ??</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-463"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <a class="username" href="http://www.citricguy.com/" rel="nofollow">Josh Sommers (not verified)</a> on Sun, 04/15/2012 - 06:24 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/463#comment-463" rel="bookmark">What an eye opener! </a></h3>
</header>
<div class="content">
<div class="comment-body">
This should be required reading for anyone working with views and nodes. Thank you for saving me days of time! :) Cheers!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-470"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Anonymous (not verified)</span> on Thu, 06/07/2012 - 22:40 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/470#comment-470" rel="bookmark">Thank you very much!!!</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thank you very much!!!</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-487"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Simon (not verified)</span> on Wed, 08/08/2012 - 18:18 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/487#comment-487" rel="bookmark">Entity view mode</a></h3>
</header>
<div class="content">
<div class="comment-body">
Not like display suite <a href="https://drupal.org/project/entity_view_mode">https://drupal.org/project/entity_view_mode</a> provide only custom entity view modes.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-1168"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">cristina (not verified)</span> on Thu, 11/15/2012 - 17:30 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/1168#comment-1168" rel="bookmark">simple question</a></h3>
</header>
<div class="content">
<div class="comment-body">
wow, impressive, I'm newbie, so if someone could give me a little example of how to select the title of the node in this node--type--view_mode.tpl.php... <br />
Thanks.</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-1648"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Joe Corneli (not verified)</span> on Sun, 12/02/2012 - 20:16 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/1648#comment-1648" rel="bookmark">adjust visibility in the code</a></h3>
</header>
<div class="content">
<div class="comment-body">
Thanks for the help, one addition:<br />
If you want to adjust the visibility of a field from within the code, so you don't have to mess around with the UI at all, you will likely have to do something like this:<br />
$node->content['my_field_of_interest']['#hidden'] = FALSE;<br />
otherwise the field may be hidden in your new view mode. It may be worth noting this alternative as part of the tutorial, below where you say «we can go to content type’s “Manage Display” page and select which fields to display».</div>
</div>
<footer>
</footer>
</article>
<br />
<div class="indented">
<a href="https://www.blogger.com/null" id="comment-1649"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">Joe Corneli (not verified)</span> on Sun, 12/02/2012 - 20:35 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/1649#comment-1649" rel="bookmark">... in hook_node_view</a></h3>
</header>
<div class="content">
<div class="comment-body">
Oh, that's for use in hook_node_view, of course.</div>
</div>
<footer>
</footer>
</article>
</div>
<a href="https://www.blogger.com/null" id="comment-1897"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">phryk (not verified)</span> on Thu, 03/28/2013 - 14:21 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/1897#comment-1897" rel="bookmark">Clear and concise</a></h3>
</header>
<div class="content">
<div class="comment-body">
Exactly how I like it. Hands down this is the best and most useful Drupal mini-tutorial I've come across so far, earning my keep with Drupal for about 3 years now. Also your preview feature yields a 503, seems like varnish config problems. :P</div>
</div>
<footer>
</footer>
</article>
<a href="https://www.blogger.com/null" id="comment-1933"></a>
<article class="comment comment-by-anonymous clearfix">
<header>
<address class="submitted">
Submitted by <span class="username">pbz1912 (not verified)</span> on Thu, 04/18/2013 - 15:54 </address>
<h3>
<a class="permalink" href="https://www.blogger.com/comment/1933#comment-1933" rel="bookmark">If you set</a></h3>
</header>
<div class="content">
<div class="comment-body">
If you set<br />
'custom settings' => FALSE,<br />
if won't be enabled by default (on all content types) and you can choose which content types to enable it on.</div>
</div>
<footer>
</footer>
</article>
</div>
</div>
<div dir="ltr" style="text-align: left;" trbidi="on">
http://www.wunderkraut.com/blog/drupal-7-custom-node-view-modes/2010-12-20</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-85217827515803243542013-10-03T00:01:00.001-07:002013-10-03T00:03:06.727-07:00Аллергия на собак. Что делать ?<div dir="ltr" style="text-align: left;" trbidi="on">
Хотя все больше и больше людей обнаруживают благоприятное воздействие
собаки в целом,но факт остается фактом , что примерно от 15 до 20
процентов от общей численности населения имеют аллергию на животных.
Результат? Бесчисленное количество владельцев недовольны, встает вопрос-
что же делать?! Аллергены -вещества, которое вызывают аллергическую
реакцию. Контактируя и вдыхая аллергены мы получаем аллергическую
реакцию. Симптомы - покраснение кожи, зуд, выделения из глаз и носа;
чихание; кашель; покалывание или боль в горле; зуд кожи, и наиболее
серьезная из всех- это затрудненное дыхание.Наиболее распространенными
аллергенами являются животные белки, которые обнаружены в частичках
старой отшелушиваемой кожи, , слюне, моче и сальных клетках. Любое
животное может вызвать аллергическую реакцию, но кошки чаще всего. Люди
также испытывают аллергию на мочу, слюну домашних и экзотических
животных, таких, как хорьки, кролики, птицы, хомяки и грызуны. Не
Существует вида животных, к которому у людей не может развиться
аллергия.Длина шерсти и тип не повлияет или не предотвратит аллергию.
Некоторые животные могут быть менее аллергенны, но это строго на
индивидуальной основе и не может быть предсказано.
<br />
После того, как ставится диагноз аллергии на животное врачи часто
рекомендуют устраненить животное от окружающих. Грустно? Да. Это
необходимо? Не всегда.<br />
Имейте в виду, что большинство людей имеют аллергию на некоторые вещи
ещё и кроме животных, как, например, пылевых клещей, пыльцу и формы
пыли, которые можно найти в доме. Аллергические симптомы возникают в
результате общей совокупной нагрузки на организм. Это означает, что если
ликвидировать некоторые другие аллергены, вам возможно не придется
избавляться от вашего питомца. (И наоборот, если вы решите удалить
вашего питомца из вашего дома, это не может сразу решить ваши проблемы.)
Вы также должны быть готовы инвестировать время и усилия, необходимые
для анализа и дезаллергизацию домашней обстановки, ограничить в будущем
воздействие аллергенов и найти врача , который будет работать с вами.<br />
Мы предлагаем вам провести программу , состоящую из 3-х частей .<br />
<b>Улучшение условий жизни </b><br />
1. Найти место свободное от аллергенов. Спальня- наилучший вариант.
Предотвратить доступ вашему питомцу в спальню, Также хорошая идея
использовать гипоаллергенное постельное белье и подушки из
гипоаллергенных материалов.<br />
2. Минимальное количество тканных материалов. Аллергены собираются в
коврах, драпировках и обивках, уменьшить их количество по возможности.
Если вы решили сохранить некоторые ткани необходима их паровая очистка
регулярно. Лучший выбор- это хлопковые ткани. Стирка регулярная штор с
оконных проемов.<br />
3. Вакуумные фильтры- использование в пылесосах фильтров HEPA (высокоэффективное поглощение частиц пыли) или одноразовых мешков.<br />
4. Установить очиститель воздуха оснащенный HEPA-фильтром. Поглощение
из воздуха мелких частиц были способствует уменьшению аллергенов в
помещении.<br />
5. Использование анти-аллергенных спреев . Эти спреи обезвреживают аллергены, что делает их безвредными.<br />
6. Частое мытье оконных стекол. Используйте спреи без отдушек.<br />
7. Регулярная влажная уборка- стирание пыли с предметов интерьера.<br />
8. Частая стирка постельного белья и очищение клетки питомца<br />
<b>Обработка вашего питомца </b><br />
1. Купание домашних животных, по крайней мере один раз в неделю. При
купании смываются аллергены, которые накапливаются в животном мехе.<br />
2. Протирайте вашего любимца с продуктом , который поможет
предотвратить отслаивание старых частиц кожного покрова, средство
посоветует ветеринар.<br />
3. Запишите все симптомы дерматита , которые появляются у вас на
вашего питомца. Часто линька животных усугубляет дерматиты у хозяев.<br />
4. Щеткой или расческой часто расчесывайте вашего питомца . Лучше делать это на открытом воздухе, если это возможно.<br />
<b>Забота о себе </b><br />
1. Если возможно,чтобы кто-то, кроме вас делал домашнюю уборку и все
работы связанные с хим.обработкой,-это тоже хороший выход. Если вы это
делаете сами- то не забудьте надеть маску от пыли.<br />
2. Мойте руки после обработки вашего компаньона, прежде чем
дотрагиваться до лица. Районы вокруг носа и глаз особенно чувствительна к
аллергенам.<br />
3. Выделить себе “домашнюю одежду” из числа наиболее легкомоющейся. Носите ее при уборке и работ с питомцем, стирать часто.<br />
4. Найти врача, желательно специалиста по аллергии , который поможет
убедиться, что ваш питомец является причиной вашей аллергии и поможет
облегчить ваши симптомы. Лекарственные препараты и иммунотерапия часто
помогает сделать вашу жизнь с вашим питомцем более приятной, поможет вам
остаться вместе.<br />
<br />
http://mirsobak.org.ru/1810-allergiya-na-sobak-chto-delat/ </div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-89244412544432957342013-07-25T00:40:00.002-07:002013-07-25T00:40:06.139-07:00Junction cимвольные ссылки в WINDOWS <div dir="ltr" style="text-align: left;" trbidi="on">
<h3>
Using Junction</h3>
<h3>
DOWNLOAD: </h3>
<h3>
http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx</h3>
<h3>
</h3>
Use junction to list junctions:<br />
<strong>Usage: [-s]</strong><br />
<strong>-s </strong>Recurse subdirectories<br />
<strong>Examples:</strong><br />
To determine if a file is a junction, specify the file name:<br />
<strong>junction c:\test</strong><br />
To list junctions beneath a directory, include the –s switch:<br />
<strong>junction -s c:\</strong><br />
To create a junction c:\Program-Files for "c:\Program Files":<br />
<strong>C:\>md Program-Files</strong><br />
<strong>C:\>junction c:\Program-Files "c:\Program Files"</strong><br />
To delete a junction, use the –d switch:<br />
<strong>junction -d c:\Program-Files</strong></div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-38815645886084217152013-07-18T02:31:00.003-07:002013-07-18T02:31:49.995-07:00Обработка ошибок и дебаггинг<div dir="ltr" style="text-align: left;" trbidi="on">
Ext JS 4 включает некоторые полезные особенности, помогающие обратывать ошибки.<br />
<strong>Ext.getDisplayName</strong> для получения имени метода во
время инициализации ошибки: throw new
Error('['+Ext.getDisplayName(arguments.callee)+'] text of message!');</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-30676706686768694972013-07-15T19:37:00.001-07:002013-07-18T12:45:17.215-07:00Git: командная работа<div dir="ltr" style="text-align: left;" trbidi="on">
<h2>
Git: командная работа</h2>
<div class="m-t10">
Все приличные команды разработки работают с таск-трекерами, сейчас как мне кажется стандартом стал <a href="http://www.atlassian.com/software/jira" target="_blank">Jira</a>
(ну или другой трекер, суть та же для примера). Поэтому здесь для
примера буду писать "таск" или "тикет" подразумевая задачу в Jira.
Хорошим тоном сейчас считается указание идентификатора таска в каждом
коммите который для решения этого таска делается. Не претендую на истину
в последней инстанции, но как один из возможных вариантов опишу здесь
свой опыт. Могу дополнить только что для SVN пользовался практически той
же схемой, за исключением того, что ветвление на каждую задачу
значительно безопаснее как мне кажется, но об этом ниже.
<br />
<br />
<b>Итого:</b>
<br />
<ol>
<li>В команде есть NN разработчиков</li>
<li>Все разработчики используют единый репозиторий git</li>
<li>В репозитории существуют две (может быть для каких-то целей и больше) основные ветки <b>master</b> и <b>dev</b></li>
<li>Ветка <b>master</b> существует исключительно для
стабильных версий продукта, работающих только в боевой (продакшн) зоне.
То есть эта ветка считается последней стабильной версией ПО с которой
работают конечные пользователи. Перед каждым релизом на эту ветку
ставится тег, с которого собственно и выкатывается стабильная версия. В
случае каких-то проблем на боевой откатывается на предыдущий стабильный
тег этой ветки (если такой откат возможен конечно после внесенных
изменений в БД или какие-то другие жизненно важные части по).</li>
<li>Ветка <b>dev</b> (development) служит для аккумулирования
изменений всех изменений разработчиков и собственно обмена последними
стабильными изменениями между разработчиками.</li>
<li>Для каждой новой задачи разработчик создает новую ветку от текущей
dev и работает в ней, с нее же получая для своей задачи обновления по
необходимости</li>
<li>При передаче в тест разработчик синхронизирует свою ветку с текущей <b>dev</b> и отдает на тестирование свою задачу именно на ветке этой задачи</li>
<li>После тестирования разработчик мерджит свою ветку в dev и либо сам
проверяет что ничего не сломалось уже на dev либо это опять проверяют
тестеры</li>
<li>Перед релизом <b>dev</b> ветка мерджится на <b>master</b>, после чего на мастере ставится тег с которого производится деплой свежего релиза</li>
</ol>
Вот таким вот нехитрым способом все происходит. Схема вполне рабочая, но возможно можно что-то улучшить, сейчас - как есть.
<br />
Что касается git, то описанный процесс происходит примерно так:
<br />
<ol>
<li>
Клонируем репозиторий в папку (если необходимо)
<blockquote class="tr_bq">
<pre class="code bash"><b>cd /my/project/folder
git clone ssh://luke@tatuin.com/git/project-repo .</b>
</pre>
</blockquote>
</li>
<li>
Переключаемся на dev ветку и обновляем ее
<blockquote class="tr_bq">
<pre class="code bash"><b>git checkout dev
git pull origin dev</b>
</pre>
</blockquote>
</li>
<li>
Ветвимся от dev в ветку под конкретную задачу (для примера имя ветки здесь это ключ от таска в Jira)
<blockquote class="tr_bq">
<pre class="code bash"><b>git checkout -b task-123
git status</b>
</pre>
</blockquote>
Статус должен показать что вы теперь на ветке task-123
</li>
<li>
Теперь спокойно работаем на этой ветке и все коммиты по задаче идут на неё
<blockquote class="tr_bq">
<pre class="code bash"><b>git commit -am <span class="string">'task-123 my task commit'</span></b>
</pre>
</blockquote>
</li>
<li>
Если задача затянулась, то можно подтянуть на ветку обновления от других разработчиков
<blockquote class="tr_bq">
<pre class="code bash"><b>git pull origin dev</b>
</pre>
</blockquote>
Для того чтобы сделать pull в этой ситуации, нужно либо все свои
изменения закомитить на ветку, либо воспользоваться git stash чтобы
спрятать свои изменения, а потом git stash apply чтобы достать свои
изменения назад. При <b>каждом</b> коммите нужно тщательно смотреть diff.
</li>
<li>
Когда задача закончена, и все коммиты по ней отправлены на соответствующую ветку отправляем свою ветку в общий репозиторий
<blockquote class="tr_bq">
<pre class="code bash"><b>git push origin test-123</b>
</pre>
</blockquote>
Таким образом ветка станет доступна другим разработчикам и тестерам.
Все, в этот момент останавливаем прогресс в таск-трекере и передаем
задачу в тестирование.
</li>
<li>
Посмотреть все лоакльные ветки можно вот так
<blockquote class="tr_bq">
<pre class="code bash"><b>git branch</b>
</pre>
</blockquote>
Посмотреть все ветки в удаленном репозитории можно вот так
<blockquote class="tr_bq">
<pre class="code bash"><b>git branch --remote</b>
</pre>
</blockquote>
</li>
<li>
Теперь задачу нам вернули из теста, с ней все хорошо, нужно вмерджить свои изменения в dev ветку
<blockquote class="tr_bq">
<pre class="code bash"><b>git checkout dev
git pull origin dev
git merge test-123</b>
</pre>
</blockquote>
Тут мы переключаемся на dev ветку, обновляем её содержимое из удаленного
репозитория и собственно мерджим в ветку dev свою ветку test-123. При
необходимости все конфликты разрешаем ручками и коммитим, но уже на dev.
Теперь осталось только отправить наши изменения на dev-e в удаленный
репозиторий
<blockquote class="tr_bq">
<pre class="code bash"><b>git push origin dev</b>
</pre>
</blockquote>
</li>
<li>
Теперь желательно прибрать за собой, то есть убрать больше не нужные ветки. Сначала удалим ветку из удаленного репозитория
<blockquote class="tr_bq">
<pre class="code bash"><b>git push origin :test-123</b>
</pre>
</blockquote>
А теперь ветку в локальном репозитории
<blockquote class="tr_bq">
<pre class="code bash"><b>git branch -d test-123</b>
</pre>
</blockquote>
</li>
</ol>
На этом собственно и все. В начале работы по такой схеме часто возникают типовые ошибки:
<br />
<ul>
<li>Работа на другой ветке (забыл переключиться в спешке), тут может выручить <a href="http://git-scm.com/book/en/Git-Tools-Stashing" target="_blank">stash</a>.
С его помощью можно спрятать изменения, а потом выложить их на другой
ветке после переключения на неё, важно внимательно смотреть в diff при
коммитах чтобы не потереть чужое.</li>
<li>Пуш в другую ветку, тут нужно просто быть внимательным при каждом push-e.</li>
<li>Ошибки связанные с мерджем, тут тоже нужно помнить что нужно сначала
перейти в ветку в которую будем мерджить свои изменения, а уже потом
мерджить в неё свою ветку. Нужно просто быть внимательным.</li>
</ul>
При внешней сложности через пару недель все это прочно оседает в голове и
делается почти автоматически. Важно просто быть внимательным в начале
работы по этой схеме чтобы не наломать дров в общем репозитории. Особо
внимательно стоит смотреть на диффы и во время пушей, что, откуда и куда
пушим. Если не сильно торопиться то проблем не будет.</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-15526069055455416642013-04-08T03:43:00.000-07:002013-07-18T23:12:33.451-07:00Javascript Один обработчик на все клики<div dir="ltr" style="text-align: left;" trbidi="on">
<pre><code class="javascript"><a class=<span class="string">'bundle'</span> href=<span class="string">''</span>>Ссылка для примера<<span class="regexp">/a>
<script language="JavaScript">
var MMNav = {
init: function() {
document.onclick = function(e) {
var target = getEventTarget(e);
if (target && target.className == 'bundle' ) {
target.href += '?name=value';
}
return true;
};
}
}
function getEventTarget(e) { /</span><span class="regexp">/ мультибраузерная функция
var e = e || window.event;
var targ = e.target || e.srcElement;
while (targ && (!targ.href || targ.nodeType == 3)) { /</span><span class="regexp">/ боремся с Safari и вложенностью
targ = targ.parentNode;
}
return targ;
}
window.onload=MMNav.init;
</</span>script></code></pre>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-79054138053629851042013-04-04T10:25:00.002-07:002013-04-04T10:25:32.464-07:00ExtJS Cheat Sheet Basic<div dir="ltr" style="text-align: left;" trbidi="on">
<h3 class="post-title entry-title" itemprop="name">
ExtJS Cheat Sheet Basic
</h3>
<div class="post-header">
</div>
<div dir="ltr" style="text-align: left;">
<b>DOM</b><br />
<br />1 Ext.onReady(function () { }); //callback to execute when the DOM is ready<br />2 var myDiv = Ext.get('divId'); //retrieve a Ext.Element<br />3 var combo = Ext.getCmp('colorsCombo'); //retrieve a Ext.Component<br />4 Ext.getBody(); //return the body of the document as an Ext.Element<br />5 Ext.getDom(id) ; //return the DOM node as HTMLElement<br />6<br />7 //Dom Query to return an Array of Ext.Element, includes selector/XPath processing<br />8 var nodes = Ext.query('div'); //Ext.query('.msg'); for all elements with msg class<br />9 Ext.each(nodes, function (item, index, allItems) {<br />10 document.write(index + '<br/>');<br />11 });<br />
<br />
<b>JSON and URL encoding</b><br />
<br />1 Ext.USE_NATIVE_JSON = true;<br />2 JSON Encoding: var objectJson = Ext.encode(myObject); <br />3 JSON Decoding: var myObject = Ext.decode(objectJson);<br />4<br />5 var encodedUrl = Ext.urlEncode(selectedColors); //URL Encoding<br />6 var decodedUrl = Ext.urlDecode(encodedUrl); //URL Decode<br />
<br />
<b>Reflection</b><br /><br />1 Ext.type(myObject); //Determine object type: array, object, number<br />2 Ext.isArray(myObject); Ext.isNumber(myObject); Ext.isString(myObject);<br /><b> <br />Array functions</b><br /><br />1 var position = myArray.indexOf('Duck'); //find an object in an array<br />2 //0 is the first element, -1 is not found<br />3 myArray.remove('Dog'); //remove an object from an array<br />
<br />
<b>String functions</b><br /> <br />1 var newString = String.escape(myString);<br />2 var newString = beforeTrim.trim();<br />3 var newString = String.format('You have {0} messages', msgCount);<br />4 var newString = Ext.util.Format.uppercase(myString);<br />5 //Other functions with one argument: Ext.util.Format.lowercase(),<br />6 //Ext.util.Format.capitalize(), Ext.util.Format.stripScripts(),<br />7 //Ext.util.Format.nl2br(), Ext.util.Format.usMoney()<br />8 var newString = Ext.util.Format.ellipsis(myString, 20);<br />9 var newString = Ext.util.Format.substr(myString, 0, 5);<br />10 var newString = Ext.util.Format.leftPad('23', 4, '0');<br /><br /><b>Value checking</b><br /> <br />1 Ext.num(myObject, 0); //provide a default value it's not a number<br />2 var allowZeroLen = false; //this is the default and you can omit<br />3 Ext.value(myObject, 'default', allowZeroLen); //provide a default value for the string<br />4 var constrained = number1.constrain(25, 50); //force it in the range<br /><b><br />Dates</b><br /> <br />1 var now = new Date();<br />2 var formatted = now.format('Y-m-d');<br />3 var aDate = Date.parseDate('2010-12-09', 'Y-m-d');<br />4 var inRange = now.between(lowDate, highDate);</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-15228478725564150332013-02-02T21:28:00.003-08:002013-02-02T21:28:27.663-08:00Функция разницы времени на php<div dir="ltr" style="text-align: left;" trbidi="on">
function otherDiffDate($end='2020-06-09 10:30:00', $out_in_array=false){<br /> $intervalo = date_diff(date_create(), date_create($end));<br /> $out = $intervalo->format("Years:%Y,Months:%M,Days:%d,Hours:%H,Minutes:%i,Seconds:%s");<br /> if(!$out_in_array)<br /> return $out;<br /> $a_out = array();<br /> array_walk(explode(',',$out),<br /> function($val,$key) use(&$a_out){<br /> $v=explode(':',$val);<br /> $a_out[$v[0]] = $v[1];<br /> });<br /> return $a_out;<br />}</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-42949105614883516902013-01-27T00:08:00.002-08:002013-01-27T00:08:46.516-08:00PHP snippets<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="float: left; width: 45%;">
<ul class="list">
<li><a href="http://www.jonasjohn.de/snippets/php/values2keys.htm">Values2keys</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-walk.htm">array_walk example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/exif-thumbnail.htm">Exif thumbnail</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/domxml-example.htm">DomXML Example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/secure-redirect.htm">Safe redirect</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/datetime-pattern-microformat.htm">Datetime Design Pattern Microformat</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/elapsed-microtime.htm">Elapsed microtime counter</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-map.htm">Array map</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/add-ending-slash.htm">Add ending slash</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/starts-with.htm">Starts with</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/ipadress-is-valid.htm">Is IPAdress valid</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/bin2php.htm">Bin2PHP</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-get-path.htm">Array get path</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/randomize-sql-query-results.htm">Randomize SQL query results</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/listdir-by-date.htm">List directory contents by date</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/phpinfo2file.htm">Save PHPInfo to file</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/block-multiple-ips.htm">How to block multiple IP adresses</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/authenticate-with-logout.htm">HTTP authentication example with logout function</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/printf-and-sscanf.htm">Printf and sscanf examples</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/restore-hsc.htm">Restore htmlspecialchars</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/caching.htm">Caching for dynamic content</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/auth.htm">Simple HTTP authentication example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/ends-with.htm">Ends with</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/debug-function.htm">Debug function</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/random-sentence.htm">Random sentence</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/count-files-recursive.htm">Count files recursive</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/str-middle-reduce.htm">Reduce a string by the middle</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/prefix-and-suffix.htm">Prefix and suffix</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/file-download.htm">File download</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/rgb2hex.htm">RGB2Hex</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/simple-syntax-highlighting.htm">Simple Syntax highlighting</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/trim-array.htm">Trim array (recursive)</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/color-inverse.htm">Color inverse</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/swap-two-variables.htm">Swap two variables</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-randomize.htm">Randomize array</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/remove-duplicated-lines.htm">Remove duplicated lines</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-remove-empty.htm">Array remove empty entries</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/restore-array.htm">Restore array</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array2object.htm">Array2object and Object2array</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/simple-hash.htm">Simple hand-made hash function</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/php-system-vars.htm">PHP System vars</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/daily-random-quotes.htm">Daily changing random quotes</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/delete-temporary-files.htm">Delete temporary files</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/wordwrap-example.htm">Wordwrap example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/md5-based-block-cipher.htm">MD5-based block cipher</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/get-between.htm">String get between</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/soundex.htm">Soundex</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/natsort-example.htm">Natsort example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/readable-filesize.htm">Human readable filesize</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/hex-string.htm">String2Hex and Hex2String</a> (PHP)</li>
</ul>
</div>
<div style="float: left; width: 45%;">
<ul class="list">
<li><a href="http://www.jonasjohn.de/snippets/php/rand-str.htm">Random string</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/remove-duplicated-values.htm">Remove duplicated values</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/ming-example.htm">Simple Ming example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/google-texter.htm">Google texter - v0.2</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/mssql-example.htm">Simple MS-SQL example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/darker-color.htm">Darker color</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/path-get-last-arg.htm">Path get last argument</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/url-functions.htm">URL functions</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/random-color.htm">Random color</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/line-statistics-by-file.htm">Count lines and their occurrences</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/dl-speed-limit.htm">File download with speed limit</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/time-is-older-than.htm">Is older than</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/random-array-element.htm">Random array element</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/hex2rgb.htm">Hex2RGB</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/similar-text.htm">Similar text</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-walk-debug.htm">array_walk debug example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/merge-two-strings.htm">Merge two strings</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/database-full-size.htm">Calculate full database size</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-range.htm">Create array range</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/array-changecase.htm">Array change case</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/random-readable-pwd.htm">Random readable password</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/string-size-to-bytes.htm">A easy way to check the file size</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/read-and-write-tab-files.htm">Read and write tab seperated files</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/misc.htm">Miscellaneous things</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/get-files-by-ext.htm">Files by extension</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/curl-example.htm">Simple cURL example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/glob-examples.htm">Glob examples</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/min-and-max.htm">Find lowest and highest value</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/time-to-load.htm">Time to load</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/dir-size.htm">How to calculate the size of a directory</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/random-file.htm">Random file</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/mysql-examples.htm">Simple MySQL examples</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/function-overloading.htm">Function overloading</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/snoopy-example.htm">Snoopy example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/headers.htm">Modify HTTP Headers (Examples)</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/number-suffix.htm">Number suffix</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/whois-query.htm">Whois query</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/preg-replace-callback.htm">Preg replace callback example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/auto-updating-copyright.htm">Auto updating copyright </a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/random-password.htm">Random password</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/force-the-use-of-the-www-subdomain.htm">Force the use of the www subdomain</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/ftp-example.htm">FTP file upload example</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/dval.htm">Debug value helper function</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/rand-split.htm">Random split</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/text2links.htm">Text to links</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/post-request.htm">How to do a POST request</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/format-as-key.htm">Format string as machine compatible key</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/next-related-number.htm">Next related number</a> (PHP)</li>
<li><a href="http://www.jonasjohn.de/snippets/php/load-and-save-a-array-dump.htm">Load and save a array dump</a> (PHP)</li>
</ul>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
http://www.jonasjohn.de/snippets/php/</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-17675540068333790592013-01-25T23:08:00.005-08:002013-01-25T23:08:57.198-08:00Отказ от глобальных функций в Javascript<div dir="ltr" style="text-align: left;" trbidi="on">
<h2>
</h2>
Js очень располагает к одному глобальному контексту. Но мы то знаем, что
в большом приложении нужна модульность, нужны простые изолированные
контексты. Поэтому вспомните ООП: изолируйте логику в отдельные классы, а
не размазывайте ее по десяткам глобальных функций, которые можно
вызвать откуда угодно, и которые всегда можно случайно перекрыть создав
функцию с тем же именем.<br />
Пример изоляции логики в «классе»:<br />
<blockquote class="tr_bq">
<pre><code class=" php"><span class="comment">/**
* Это javadoc для описания класса
*<span class="phpdoc"> @param</span> {String} str - а это описание параметра конструктора
*/</span>
NoteDocument = <span class="keyword">function</span>(str){
<span class="comment">//удобная ссылка на сам объект</span>
<span class="keyword">var</span> <span class="keyword">self</span> = <span class="keyword">this</span>;
<span class="comment">//внутреннее поле</span>
<span class="keyword">var</span> data;
<span class="comment">//публичный метод</span>
<span class="keyword">this</span>.init = <span class="keyword">function</span>(){
parse(str);
};
<span class="comment">//внутренний метод</span>
<span class="keyword">function</span> parse(str){
...
}
};
</code></pre>
</blockquote>
Как выглядит создание экземпляра:<br />
<blockquote class="tr_bq">
<pre><code class=" cs"><span class="keyword">var</span> doc = <span class="keyword">new</span> NoteDocument(<span class="string">"hello!"</span>);
doc.init();<span id="ctrlcopy"></span></code></pre>
</blockquote>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-75392571443756412142013-01-08T23:18:00.001-08:002013-01-08T23:19:36.452-08:00htaccess часто используемые директивы<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="page_only">
<h2>
htaccess часто используемые директивы</h2>
<div class="page_content type_page">
<h6>
<div align="RIGHT" class="b-print">
× <a href="http://www.blogger.com/blogger.g?blogID=7477911366036839346#" id="printversion" target="_blank" title="В новом окне">Версия для печати</a></div>
</h6>
<br />
<title></title>
<style type="text/css">
p.c1 {text-align: center}
</style>
<br />
Прежде чем мы начнем, обращаю ваше внимание на тот
факт, что злоупотребление использованием <b>.htaccess</b> может
привести к снижению производительности вашего сайта. Главное
правило: использовать .htaccess для реализации той или иной задачи
стоит только в том случае, если нет других вариантов.<br />
Убедитесь в том, что вы сделали резервную копию
оригинального файла .htaccess для вашего сайта, прежде чем вносить
какие-либо изменения. Кроме того, помните — работоспособность
указанных ниже правил зависит от индивидуальных настроек
вашего web-сервера, заданных хостером. Некоторые директивы могут
быть запрещены и не работать.<br />
<a href="http://www.blogger.com/blogger.g?blogID=7477911366036839346" id="cut" name="cut"></a><br />
<a name='more'></a><br /><br />
<a href="http://blogerator.ru/go.php?url=http://ru.wikipedia.org/wiki/.htaccess" rel="nofollow">.htaccess</a> (от. англ. hypertext access) —
файл дополнительной конфигурации <a href="http://blogerator.ru/go.php?url=http://ru.wikipedia.org/wiki/Apache" rel="nofollow">веб-сервера Apache</a>, а также подобных ему
серверов. Позволяет задавать большое количество дополнительных
параметров и разрешений для работы веб-сервера
в отдельных каталогах (папках), таких как управляемый доступ
к каталогам, переназначение типов файлов и т.д., без
изменения главного конфигурационного файла.<br />
<div class="c1">
<img border="0" src="http://blogerator.ru/uploads/pix2012/htaccess-logo2.png" /></div>
Файл <b>.htaccess</b> может быть размещён в <b>любом
каталоге</b>. Директивы этого файла действуют на все файлы
в текущем каталоге и во всех его подкаталогах (если
эти директивы не переопределены директивами нижележащих файлов
.htaccess).<br />
Для того чтобы эти файлы .htaccess можно было использовать,
необходимы соответствующие настройки главного конфигурационного
файла (значение директивы <b>AllowOverride</b> должно быть
установлено <b>All</b>). Как правило, подавляющее большинство
хостеров разрешают использовать свои файлы .htaccess.<br />
<h3>
1. Запрещаем загрузку файлов с внешних сайтов</h3>
Вам надоели люди, которые размещают картинки, опубликованные
на вашем сайте — на своих ресурсах, тем самым
расходуя ваш траффик и создавая ненужную нагрузку на ваш
хостинг? Данный код, размещенный в конце вашего файла
<b>.htaccess</b>, позволит предотвратить загрузку ваших
изображений — сторонними сайтами.<br />
<pre class="sh_css sh_sourceCode">Options <span class="sh_symbol">+</span>FollowSymlinks
#Запрещаем загрузку файлов с внешних сайтов
RewriteEngine On
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>$
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">:</span><span class="sh_comment">//(www.)?site.com/ [nc]</span>
RewriteRule <span class="sh_symbol">.*.(</span>gif<span class="sh_symbol">|</span>jpg<span class="sh_symbol">|</span>png<span class="sh_symbol">)</span>$ http<span class="sh_symbol">:</span><span class="sh_comment">//site.com/stop.gif[nc]</span>
</pre>
Не забудьте изменить <b>site.com</b> на ваше доменное
имя и создать изображение <b>stop.gif</b>, которое будет
показано вместо запрошенной картинки.<br />
<h3>
2. Блокируем все запросы от нежелательных User Agents</h3>
Это правило позволяет заблокировать нежелательные <i>User
Agent</i>, которые могут быть потенциально опасными или просто
перегружать сервер ненужными запросами.<br />
<pre class="sh_css sh_sourceCode">#Блокируем плохих ботов и роботов
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^</span>FrontPage <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^</span>Java<span class="sh_symbol">.*</span> <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^</span>Microsoft<span class="sh_selector">.URL</span> <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^</span>MSFrontPage <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^</span>Offline<span class="sh_selector">.Explorer</span> <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^[</span>Ww<span class="sh_symbol">]</span>eb<span class="sh_symbol">[</span>Bb<span class="sh_symbol">]</span>andit <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
SetEnvIfNoCase user<span class="sh_symbol">-</span>Agent <span class="sh_symbol">^</span>Zeus <span class="sh_symbol">[</span>NC<span class="sh_symbol">]</span>
<span class="sh_symbol"><</span>limit get<span class="sh_symbol">=</span>"" post<span class="sh_symbol">=</span>"" head<span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
Order Allow<span class="sh_symbol">,</span>Deny
Allow from all
Deny from env<span class="sh_symbol">=</span>bad_bot
<span class="sh_symbol"></</span>limit<span class="sh_symbol">></span>
</pre>
Список <b>User Agent</b> браузеров, роботов и пауков
поисковых машин, веб-каталогов, менеджеров закачек, спам-ботов
и плохих ботов можно найти на сайте <a href="http://blogerator.ru/go.php?url=http://www.user-agents.org/" rel="nofollow">List of User-Agents</a>.<br />
<h3>
3. Запрещаем доступ для всех, кроме указанных IP-адресов</h3>
Если по какой-либо причине, вы хотите запретить всем
или разрешить только отдельным IP-адресам доступ к вашему
сайту — добавьте этот код в ваш .htaccess-файл:<br />
<pre class="sh_css sh_sourceCode">#Запрещаем доступ для всех<span class="sh_symbol">,</span> кроме указанных IP<span class="sh_symbol">-</span>адресов
ErrorDocument 403 http<span class="sh_symbol">:</span><span class="sh_comment">//www.domainname.com</span>
Order deny<span class="sh_symbol">,</span>allow
Deny from all
Allow from 124<span class="sh_selector">.34.48.165</span>
Allow from 102<span class="sh_selector">.54.68.123</span>
</pre>
Не забудьте изменить <b>domainname.com</b> на ваше
доменное имя.<br />
<h3>
4. Настраиваем SEO-Friendly 301 Redirect</h3>
Если вы перенесли доменное имя (или свой подсайт) или
хотите перенаправлять пользователя на определенную страницу
(страницы), без санкций со стороны поисковых машин,
используйте этот код:<br />
<pre class="sh_css sh_sourceCode">#Настраиваем SEO<span class="sh_symbol">-</span>Friendly 301 Redirect
Redirect 301 <span class="sh_symbol">/</span>1<span class="sh_symbol">/</span>file<span class="sh_selector">.html</span> http<span class="sh_symbol">:</span><span class="sh_comment">//www.site.com/2/file.html</span>
</pre>
Не забудьте изменить <b>site.com</b> на ваше доменное
имя, а <b>/1/file.html</b> и <b>/2/file.html</b>
на соответствующие директории и страницы.<br />
<h3>
5. Создаем собственные страницы ошибок</h3>
Вам надоел стандартный вид <i>страниц ошибок</i>? Нет
проблем — с помощью следующего кода, вы легко можете
создать свою страницу и показывать пользователю
именно ее:<br />
<pre class="sh_css sh_sourceCode">ErrorDocument 401 <span class="sh_symbol">/</span>error<span class="sh_symbol">/</span>401<span class="sh_selector">.php</span>
ErrorDocument 403 <span class="sh_symbol">/</span>error<span class="sh_symbol">/</span>403<span class="sh_selector">.php</span>
ErrorDocument 404 <span class="sh_symbol">/</span>error<span class="sh_symbol">/</span>404<span class="sh_selector">.php</span>
ErrorDocument 500 <span class="sh_symbol">/</span>error<span class="sh_symbol">/</span>500<span class="sh_selector">.php</span>
</pre>
Не забудьте создать в корневой директории вашего
сервера папку <b>error</b> и разместить в ней
соответствующие файлы.<br />
<h3>
6. Создаем черный список IP адресов</h3>
Устали от спам-комментариев или определенного пользователя?
Просто заблокируйте его <b>IP</b> с помощью следующего
кода, добавляемого в .htaccess-файл.<br />
<pre class="sh_css sh_sourceCode">#Создаем черный список IP адресов
allow from all
deny from 145<span class="sh_selector">.186.14.122</span>
deny from 124<span class="sh_selector">.15</span><span class="sh_symbol">.</span>
</pre>
Узнать IP адреса комментаторов можно или в логах
Apache или с помощью сервисов статистики. У многих CMS
есть свои встроенные средства для мониторинга адресов посетителей.
Например, в <b>Drupal</b> IP- адреса комментаторов можно
увидеть в административной панели — <i>Отчеты</i>.<br />
<h3>
7. Устанавливаем e-mail адрес по-умолчанию для
администратора</h3>
Используйте данный код, для того, чтобы установить e-mail адрес
по-умолчанию для администратора сервера.<br />
<pre class="sh_css sh_sourceCode">#Устанавливаем e<span class="sh_symbol">-</span>mail адрес по<span class="sh_symbol">-</span>умолчанию для администратора
ServerSignature EMail
SetEnv SERVER_ADMIN default@domain<span class="sh_selector">.com</span>
</pre>
Не забудьте заменить <b>default@domain.com</b> — своим
e-mail адресом.<br />
<h3>
8. Защищаем определенный файл</h3>
Нижеследующий код позволяет вам запретить доступ к любому
файлу — при запросе будет выдаваться <b>ошибка 403</b>. Для
примера я закрыл доступ к самому файлу htaccess, повысив
общий уровень безопасности сайта.<br />
<pre class="sh_css sh_sourceCode">#Защищаем <span class="sh_selector">.htaccess</span> файл
<span class="sh_symbol"><</span>files <span class="sh_selector">.htaccess</span><span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
order allow<span class="sh_symbol">,</span>deny
deny from all
<span class="sh_symbol"></</span>files<span class="sh_symbol">></span>
</pre>
<h3>
9. Сжимаем элементы с помощью mod_deflate</h3>
В качестве альтернативы компрессии файлов с помощью
<b>Gzip</b>, вы можете использовать <b>mod_deflate</b>
(предположительно работает быстрее). Разместите следующий код
в начале вашего файла .htaccess (также вы можете добавить
перечисления <i>.jpg|.gif|.png|.tiff|.ico</i>):<br />
<pre class="sh_css sh_sourceCode">#Сжимаем элементы с помощью mod_deflate
<span class="sh_symbol"><</span>ifmodule mod_deflate<span class="sh_selector">.c</span><span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
<span class="sh_symbol"><</span>filesmatch <span class="sh_symbol">.(</span>js<span class="sh_symbol">|</span>css<span class="sh_symbol">)</span>$<span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
SetOutputFilter DEFLATE
<span class="sh_symbol"></</span>filesmatch<span class="sh_symbol">></span>
<span class="sh_symbol"></</span>ifmodule<span class="sh_symbol">></span>
</pre>
<h3>
10. Добавляем срок жизни в заголовки</h3>
Данный код позволяет добавить сроки жизни в заголовки:<br />
<pre class="sh_css sh_sourceCode">#Добавляем срок жизни в заголовки
<span class="sh_symbol"><</span>filesmatch <span class="sh_symbol">.(</span>ico<span class="sh_symbol">|</span>pdf<span class="sh_symbol">|</span>flv<span class="sh_symbol">|</span>jpg<span class="sh_symbol">|</span>jpeg<span class="sh_symbol">|</span>png<span class="sh_symbol">|</span>gif<span class="sh_symbol">|</span>swf<span class="sh_symbol">)</span>$<span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
Header set Expires «Wed<span class="sh_symbol">,</span> 21 May 2010 20<span class="sh_symbol">:</span>00<span class="sh_symbol">:</span>00 GMT»
<span class="sh_symbol"></</span>filesmatch<span class="sh_symbol">></span>
</pre>
<h3>
11. Устанавливаем страницы по-умолчанию</h3>
Обычно страницей по-умолчанию является <b>index.html</b>, однако
с помощью этого кода вы можете настроить по-умолчанию
любую другую страницу.<br />
<pre class="sh_css sh_sourceCode">#Устанавливаем альтернативную страницу по<span class="sh_symbol">-</span>умолчанию
DirectoryIndex about<span class="sh_selector">.html</span>
</pre>
<h3>
12. Защищаем паролем папки и файлы</h3>
Вы можете включить проверку пароля для доступа в любую
папку или файл на вашем сервере, используя этот код:<br />
<pre class="sh_css sh_sourceCode">#защита паролем файла
<span class="sh_symbol"><</span>files secure<span class="sh_selector">.php</span><span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
AuthType Basic
AuthName «Prompt»
AuthUserFile <span class="sh_symbol">/</span>pub<span class="sh_symbol">/</span>home<span class="sh_symbol">/</span><span class="sh_selector">.htpasswd</span>
Require valid<span class="sh_symbol">-</span>user
<span class="sh_symbol"></</span>files<span class="sh_symbol">></span>
#защита паролем папки
resides
AuthType basic
AuthName «This directory is protected»
AuthUserFile <span class="sh_symbol">/</span>pub<span class="sh_symbol">/</span>home<span class="sh_symbol">/</span><span class="sh_selector">.htpasswd</span>
AuthGroupFile <span class="sh_symbol">/</span>dev<span class="sh_symbol">/</span>null
Require valid<span class="sh_symbol">-</span>user
</pre>
Для того, чтобы организовать доступ к файлу по паролю,
необходимо создать файл .htpasswd и внести в него пару
логин-пароль в формате <b>user:password</b>.<br />
Однако в этом случае пароли будут хранится в открытом
виде, что не слишком хорошо с точки зрения безопасности.
Поэтому оптимальнее пароль зашифровать. Для этого воспользуйтесь
сервисами генерации записей в файлы <b>.htpasswd</b>.
Например, <a href="http://blogerator.ru/go.php?url=http://www.htaccesstools.com/htpasswd-generator/" rel="nofollow">вот таким</a>.<br />
В нашем примере файл с паролями доступа лежит
в корневой директории сайта и называется
<b>.htpasswd</b>. Директория указывается от корня сервера
и если путь будет некорректным — Apache, не получив
доступа к файлу, откажет в доступе к папке любому
пользователю — в том чилсе и тому, который ввел
правильную пару <b>логин:пароль</b>.<br />
<h3>
13. Перенаправляем со старого домена —
на новый</h3>
Используя <b>.htaccess</b>, вы можете настроить
перенаправление со старого доменного имени на новое,
добавив следующий код:<br />
<pre class="sh_css sh_sourceCode">#Перенаправляем со старого домена old<span class="sh_selector">.com</span> — на новый
RewriteEngine On
RewriteRule <span class="sh_symbol">^(.*)</span>$ http<span class="sh_symbol">:</span><span class="sh_comment">//www.new.com/$1 [R=301,L]</span>
</pre>
Перенаправление используется в том случае, если
вы переносите свой существующий сайт на новое доменное
имя. В этом случае любой пользователь, который наберет
в адресной строке <b>www.old.com</b> — будет
перенаправлен на <b>www.new.com</b>.<br />
<h3>
14. Усиливаем кеширование</h3>
Использование этого правила не означает прямое ускорение
загрузки вашего сайта. Оно предназначено для более быстрой загрузки
сайта — для уже заходившего на него посетителя, путем
отправки <b>статуса 304</b> для тех элементов, которые
не обновлялись.<br />
Таким образом, при повторной загрузке страницы браузер
посетителя не будет заново скачивать изображения, скрипты или
CSS, а выведет те файлы, которые уже хранятся в его
кеше. Вы можете изменить <i>срок жизни кеша</i>, путем
корректирования его значения в <i>годах</i> (year),
<i>месяцах</i> (month) или, например — <i>секундах</i>
(seconds). В примере указан 1 год.<br />
<pre class="sh_css sh_sourceCode">#Усиливаем кеширование
FileETag MTime Size
<span class="sh_symbol"><</span>ifmodule mod_expires<span class="sh_selector">.c</span><span class="sh_symbol">></span>
<span class="sh_symbol"><</span>filesmatch "<span class="sh_symbol">.(</span>jpg<span class="sh_symbol">|</span>gif<span class="sh_symbol">|</span>png<span class="sh_symbol">|</span>css<span class="sh_symbol">|</span>js<span class="sh_symbol">)</span>$"<span class="sh_symbol">></span>
ExpiresActive on
ExpiresDefault «access plus 1 year»
<span class="sh_symbol"></</span>filesmatch<span class="sh_symbol">></span>
<span class="sh_symbol"></</span>ifmodule<span class="sh_symbol">></span>
</pre>
<h3>
15. Сжимаем компоненты сайта путем включения Gzip</h3>
При использовании <b>Gzip</b>, сервер будет сжимать файлы перед
отправкой их пользователю, ввиду чего ваш сайт будет грузиться
быстрее.<br />
<pre class="sh_css sh_sourceCode">#Сжимаем компоненты сайта путем включения Gzip
AddOutputFilterByType DEFLATE text<span class="sh_symbol">/</span>html text<span class="sh_symbol">/</span>plain <span class="sh_symbol">..</span>
<span class="sh_symbol">..</span> text<span class="sh_symbol">/</span>xml application<span class="sh_symbol">/</span>xml application<span class="sh_symbol">/</span>xhtml<span class="sh_symbol">+</span>xml <span class="sh_symbol">..</span>
<span class="sh_symbol">..</span> text<span class="sh_symbol">/</span>javascript text<span class="sh_symbol">/</span>css application<span class="sh_symbol">/</span>x<span class="sh_symbol">-</span>javascript
BrowserMatch <span class="sh_symbol">^</span>Mozilla<span class="sh_symbol">/</span>4 gzip<span class="sh_symbol">-</span>only<span class="sh_symbol">-</span>text<span class="sh_symbol">/</span>html
BrowserMatch <span class="sh_symbol">^</span>Mozilla<span class="sh_symbol">/</span>4<span class="sh_selector">.0</span><span class="sh_symbol">[</span>678<span class="sh_symbol">]</span> no<span class="sh_symbol">-</span>gzip
BrowserMatch bMSIE <span class="sh_symbol">!</span>no<span class="sh_symbol">-</span>gzip <span class="sh_symbol">!</span>gzip<span class="sh_symbol">-</span>only<span class="sh_symbol">-</span>text<span class="sh_symbol">/</span>html
</pre>
Обратите внимание, что включение <i>компрессии</i> приведет
к большей нагрузке на процессор сервера. Здесь строка
<b>AddOutputFilterByType</b> записывается в одну длинную строчку с
двумя нижними (все <b>..</b> нужно убрать).<br />
<h3>
16. Удаляем «category» из URL</h3>
Для изменения ссылки <b>yourdomain.com/category/blue</b>
на <b>yourdomain.com/blue</b>, просто добавьте следующий код
в конце вашего <b>.htaccess</b> файла.<br />
<pre class="sh_css sh_sourceCode">#Удаляем category из URL
RewriteRule <span class="sh_symbol">^</span>category<span class="sh_symbol">/(.+)</span>$ http<span class="sh_symbol">:</span><span class="sh_comment">//www.site.com/$1 [R=301,L]</span>
</pre>
Не забудьте изменить <b>www.site.com</b> на ваше
доменное имя.<br />
<h3>
17. Запрещаем просмотр содержимого папки</h3>
Для того, чтобы ограничить доступ к директориям, которые
могут содержать разнообразную информацию и для обеспечения
безопасности сервера, добавьте этот код в файл
<b>.htaccess</b><br />
<pre class="sh_css sh_sourceCode">#Запрещаем просмотр содержимого папки
Options All —Indexes
</pre>
<h3>
18. Перенаправляем свою RSS-ленту на FeedBurner</h3>
Покажем как это можно сделать на примере <b>RSS</b>-ленты
<b>Drupal</b> на сервис <b>Google Feedburner</b>.<br />
<pre class="sh_css sh_sourceCode">#Перенаправляем RSS<span class="sh_symbol">-</span>ленту Drupal на FeedBurner
<span class="sh_symbol"><</span>ifmodule mod_rewrite<span class="sh_selector">.c</span><span class="sh_symbol">=</span>""<span class="sh_symbol">></span>
RewriteEngine on
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_USER_AGENT</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!</span>FeedBurner <span class="sh_symbol">[</span>NC<span class="sh_symbol">]</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_USER_AGENT</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!</span>FeedValidator <span class="sh_symbol">[</span>NC<span class="sh_symbol">]</span>
RewriteRule <span class="sh_symbol">^</span>rss<span class="sh_selector">.xml</span>$ http<span class="sh_symbol">:</span><span class="sh_comment">//feeds.feedburner.com/yourfeed [R=302,NC,L]</span>
<span class="sh_symbol"></</span>ifmodule<span class="sh_symbol">></span>
</pre>
Изначально необходимо зарегистрировать ленту своего блога
в сервисе <a href="http://blogerator.ru/go.php?url=http://feedburner.google.com/" rel="nofollow">Feedburner</a>. Далее не забудьте заменить
<b>yourfeed</b> на имя вашей ленты уже
в <b>Feedburner</b>.<br />
<h3>
19. Запрещаем комментарии от пользователей без
Referrer</h3>
Чаще всего <i>спам-боты</i> обращаются напрямую к файлу
комментариев, например к <b>wp-comments-post.php</b>,
не заходя на страницы записей вашего блога. Приведенный
ниже код позволяет заблокировать комментарии, отправленные
пользователями, которые пришли «из ниоткуда», позволяя
комментировать только тем читателям, которые перешли
на страницу вашего блога с каких-либо других страниц
(например, результатов поиска Google).<br />
<pre class="sh_css sh_sourceCode">#Запрещаем комментарии от пользователей без Referrer
RewriteEngine On
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">REQUEST_METHOD</span><span class="sh_cbracket">}</span> POST
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">REQUEST_URI</span><span class="sh_cbracket">}</span> <span class="sh_selector">.comment</span><span class="sh_symbol">\/</span>reply<span class="sh_symbol">\</span><span class="sh_comment">/*</span>
<span class="sh_comment">RewriteCond %{HTTP_REFERER} !.*yourblog.com.* [OR]</span>
<span class="sh_comment">RewriteCond %{HTTP_USER_AGENT} ^$</span>
<span class="sh_comment">RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]</span>
</pre>
Не забудьте заменить <b>yourblog.com</b> на доменное
имя вашего блога.<br />
<h3>
20. Убираем расширение файла из URL</h3>
Данный код позволяет удалить расширение файла <b>.php</b>
(вы можете изменить его на любое другое, например —
.html) из URL-адресов страниц.<br />
<pre class="sh_css sh_sourceCode">#Убираем расширение файла из URL
RewriteRule <span class="sh_symbol">^(([^/]+/)*[^.]+)</span>$ <span class="sh_symbol">/</span>$1<span class="sh_selector">.php</span> <span class="sh_symbol">[</span>L<span class="sh_symbol">]</span>
</pre>
<h3>
21. Защищаем сайт</h3>
Данный код позволяет защитить сайт от <b>scripts
enjection</b> и нежелательных модификаций <b>_REQUEST</b>
и/или <b>GLOBALS</b>:<br />
<pre class="sh_css sh_sourceCode">#Включаем отслеживание сим<span class="sh_symbol">-</span>ссылок
Options <span class="sh_symbol">+</span>FollowSymLinks
#Запускаем url_rewriting
RewriteEngine On
#Блокируем все ссылки<span class="sh_symbol">,</span> содержащие <span class="sh_symbol"><</span>script<span class="sh_symbol">></span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">QUERY_STRING</span><span class="sh_cbracket">}</span> <span class="sh_symbol">(\<|%</span>3C<span class="sh_symbol">).*</span>script<span class="sh_symbol">.*(\>|%</span>3E<span class="sh_symbol">)</span> <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>OR<span class="sh_symbol">]</span>
#Блокируем все скрипты<span class="sh_symbol">,</span> которые пытаются изменить переменные PHP Globals<span class="sh_symbol">:</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">QUERY_STRING</span><span class="sh_cbracket">}</span> GLOBALS<span class="sh_symbol">(=|\[|\%[</span>0<span class="sh_symbol">-</span>9A<span class="sh_symbol">-</span>Z<span class="sh_symbol">]</span><span class="sh_cbracket">{</span><span class="sh_value">0</span>,<span class="sh_value">2</span><span class="sh_cbracket">}</span><span class="sh_symbol">)</span> <span class="sh_symbol">[</span>OR<span class="sh_symbol">]</span>
#Блокируем все скрипты<span class="sh_symbol">,</span> которые пытаются изменить переменную _REQUEST<span class="sh_symbol">:</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">QUERY_STRING</span><span class="sh_cbracket">}</span> _REQUEST<span class="sh_symbol">(=|\[|\%[</span>0<span class="sh_symbol">-</span>9A<span class="sh_symbol">-</span>Z<span class="sh_symbol">]</span><span class="sh_cbracket">{</span><span class="sh_value">0</span>,<span class="sh_value">2</span><span class="sh_cbracket">}</span><span class="sh_symbol">)</span>
#Перенаправляем все подобные на страницу с ошибкой 403 — запрещено
RewriteRule <span class="sh_symbol">^(.*)</span>$ index<span class="sh_selector">.php</span> <span class="sh_symbol">[</span>F<span class="sh_symbol">,</span>L<span class="sh_symbol">]</span>
</pre>
<h3>
22. Перенаправляем посетителя с помощью директивы
RedirectMatch и регулярных выражений</h3>
Еще одна полезная директива, рекомендуемая к использованию
— <b>RedirectMatch</b>. Цитата: «Эта директива позволяет
в качестве запрашиваемого адреса использовать <i>регулярное
выражение</i> (пересылка не „с документа“,
а „со всех документов, типа ...“). Редирект
внешний — браузеру сообщается о необходимости загрузить
другую страницу.<br />
<b>Синтаксис</b>:<br />
<code>RedirectMatch [status] regexp URL</code><br />
Значения <i>статусов</i> (код возврата веб-сервера)
стандартные:<br />
permanent (<b>301</b> — постоянный редирект), temp
(<b>302</b> — временный редирект, приходите ещё), seeother
(<b>303</b> — летим туда, там много вкусного), gone
(<b>410</b> — удалён навсегда).<br />
<b>Пример</b>:<br />
То же перенаправление со старого домена на новый
без подключения <b>RewriteEngine</b>:<br />
<pre class="sh_css sh_sourceCode">RedirectMatch 301 <span class="sh_symbol">^(.*)</span>$ www<span class="sh_selector">.domainname.com</span><span class="sh_symbol">/</span>$1
</pre>
От себя добавлю, что вы можете использовать
не только <i>http-статусы</i>, но и другие
условия:<br />
<pre class="sh_css sh_sourceCode">RedirectMatch <span class="sh_symbol">(.*)\</span><span class="sh_selector">.gif</span>$ http<span class="sh_symbol">:</span><span class="sh_comment">//www.myserver.com$1.png</span>
RedirectMatch <span class="sh_symbol">(.*\</span><span class="sh_selector">.jpg</span><span class="sh_symbol">)</span>$ http<span class="sh_symbol">:</span><span class="sh_comment">//www.myanother.com$1</span>
</pre>
Обязательно сделайте резервную копию файла <b>.htaccess</b>
до внесения изменений и проверьте работоспособность всего
сайта — после добавления новых строк.<br />
<h3>
23. Защита от прямых ссылок для изображений через
.htaccess</h3>
<i>Хотлинк</i> (Hotlink) — вставка прямых ссылок
изображений или файлов с одного сайта на другие. Этот
прием используется довольно часто, ну например, у вас
на сервере не хватает места для хранения картинок
и вы пользуетесь каким-либо бесплатным сервисом для
хранения файлов изображений, т.е. загружаете картинку, получаете
URL и вставляете его на свой сайт.<br />
В итоге: вы сохраняете место для вашего сайта
и используете пропускную способность хостинга для картинок,
но это уже не ваше дело. Но вот как быть, если
кто-то решил, что ваш сайт можно использовать как подобный
сервис.<br />
Как не стать бесплатным поставщиком изображений
и файлов?<br />
Есть ли защита от этого? Да, есть! Чтобы
запретить другим сайтам пользоваться вашим трафиком и/или просто
указывать прямые ссылки на ваши файлы (картинки),
то добавьте в ваш <b>.htaccess</b> файл следующие
строки:<br />
<pre class="sh_css sh_sourceCode"># Запретить другим сайтам использовать прямые ссылки на ваши картинки
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>$
# Дальше список разрешенных доменов
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//(www.)?sitename.ru.*$ [NC]</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//(www.)?sitename.ru:80.*$ [NC]</span>
# IP сайта <span class="sh_symbol">(</span>домена<span class="sh_symbol">)</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//111.111.111.111.*$ [NC]</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//111.111.111.111:80.*$ [NC]</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//(www.)?yandex.ru [NC]</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//(www.)?google. [NC]</span>
# RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!^</span>http<span class="sh_symbol">(</span>s<span class="sh_symbol">)?:</span><span class="sh_comment">//(www.)?домен_дружественного сайта.ru [NC]</span>
RewriteCond <span class="sh_symbol">%</span><span class="sh_cbracket">{</span><span class="sh_value">HTTP_REFERER</span><span class="sh_cbracket">}</span> <span class="sh_symbol">!</span>search<span class="sh_symbol">?</span>q<span class="sh_symbol">=</span>cache <span class="sh_symbol">[</span>NC<span class="sh_symbol">]</span>
# Форматы файлов<span class="sh_symbol">,</span> для которых устанавливается защита
# Выводит ошибку 403
# RewriteRule <span class="sh_symbol">\.(</span>jpe<span class="sh_symbol">?</span>g<span class="sh_symbol">|</span>bmp<span class="sh_symbol">|</span>gif<span class="sh_symbol">|</span>png<span class="sh_symbol">|</span>css<span class="sh_symbol">|</span>mov<span class="sh_symbol">|</span>swf<span class="sh_symbol">|</span>dcr<span class="sh_symbol">|</span>exe<span class="sh_symbol">|</span>rar<span class="sh_symbol">|</span>avi<span class="sh_symbol">|</span>vob<span class="sh_symbol">|</span>zip<span class="sh_symbol">|</span>pdf<span class="sh_symbol">|</span>txt<span class="sh_symbol">|</span>doc<span class="sh_symbol">|</span>flv<span class="sh_symbol">|</span>mp3<span class="sh_symbol">|</span>mp4<span class="sh_symbol">)</span>$ — <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>F<span class="sh_symbol">,</span>L<span class="sh_symbol">]</span>
# или показывает спецрисунок вместо указанного
RewriteRule <span class="sh_symbol">.*\.(</span>jpe<span class="sh_symbol">?</span>g<span class="sh_symbol">|</span>bmp<span class="sh_symbol">|</span>gif<span class="sh_symbol">|</span>png<span class="sh_symbol">)</span>$ files<span class="sh_symbol">/</span>images<span class="sh_symbol">/</span>nohotlink<span class="sh_selector">.jpg</span> <span class="sh_symbol">[</span>NC<span class="sh_symbol">,</span>L<span class="sh_symbol">]</span>
</pre>
В итоге все остальные сайты получат ошибку <b>403
Forbidden</b> (т.е. <i>Доступ запрещен</i>) и ваша пропускная
способность больше «не работает на других».<br />
<h3>
24. ImageCache и защита от хотлинка через
.htaccess</h3>
Для <i>ImageCache</i> предыдущий пункт работать не будет,
поэтому добавляем такие настройки:<br />
<pre class="sh_css sh_sourceCode">SetEnvIfNoCase Referer «<span class="sh_symbol">^</span>$» local_ref<span class="sh_symbol">=</span>1
# Allowed domains
# Далее разрешенные домены
SetEnvIfNoCase Referer «<span class="sh_symbol">^</span>http<span class="sh_symbol">:</span><span class="sh_comment">//(www\.)?domain\.ru» local_ref=1</span>
SetEnvIfNoCase Referer «<span class="sh_symbol">^</span>http<span class="sh_symbol">:</span><span class="sh_comment">//(www\.)?domain\.com» local_ref=1</span>
# File extensions that you want to protect
# Расширения файлов<span class="sh_symbol">,</span> которые нужно защитить
<span class="sh_symbol"><</span>FilesMatch "<span class="sh_symbol">\.(</span>bmp<span class="sh_symbol">|</span>jpe<span class="sh_symbol">?</span>g<span class="sh_symbol">|</span>gif<span class="sh_symbol">|</span>png<span class="sh_symbol">)</span>"<span class="sh_symbol">></span>
Order Allow<span class="sh_symbol">,</span>Deny
Allow from env<span class="sh_symbol">=</span>local_ref
<span class="sh_symbol"></</span>FilesMatch<span class="sh_symbol">></span>
</pre>
Теперь у нас есть и защита от <i>хотлинка</i>
и модуль <b>ImageCache</b> — вместе они работают превосходно.
Одно «но» — таким способом, как вы видите
не получится выдавать другую картинку; только защита своих
изображений, что и является основной целью.<br />
<h3>
25. Мало этого?</h3>
Вот лучшие и подробные ресурсы по <i>магическому</i>
<b>.htaccess</b> в Интернете:<br />
<ul>
<li><a href="http://blogerator.ru/go.php?url=http://htaccess.net.ru/" rel="nofollow">Энциклопедия по .htaccess по-русски</a>;</li>
<li><a href="http://blogerator.ru/go.php?url=http://httpd.apache.org/docs/1.3/howto/htaccess.html" rel="nofollow">Apache htaccess official tutorial</a>;</li>
<li><a href="http://blogerator.ru/go.php?url=http://www.wmaster.ru/htaccess/" rel="nofollow">Практические решения по использованию файла
.htaccess</a>;</li>
<li><a href="http://blogerator.ru/go.php?url=http://www.javascriptkit.com/howto/htaccess.shtml" rel="nofollow">Comprehensive guide to .htaccess</a>;</li>
<li><a href="http://blogerator.ru/go.php?url=http://www.quizful.net/post/guide-to-htaccess" rel="nofollow">Вводное руководство по .htaccess файлам</a>;</li>
<li><a href="http://blogerator.ru/go.php?url=http://habrahabr.ru/post/154643/" rel="nofollow">Попытка номер раз создать почти идеальный
.htaccess</a>.</li>
</ul>
<div class="page_other_pages">
<div class="page_other_pages_header">
Похожие страницы:</div>
<table border="0" style="width: 100%px;"><tbody>
<tr><td><ul>
<li><a href="http://blogerator.ru/page/15-reguljarnyh-vyrazhenij-kotorye-dolzhen-znat-kazhdyj-php-programmist-regex-primeri" title="15 регулярок, которые должен знать каждый PHP-программист">15 регулярок, которые должен знать каждый PHP-программист</a></li>
<li><a href="http://blogerator.ru/page/minimum-komand-memcached-php-kotorye-nuzhno-znat-naizust" title="Минимум команд Memcached, который нужно знать наизусть">Минимум команд Memcached, который нужно знать наизусть</a></li>
<li><a href="http://blogerator.ru/page/anonimnaja-set-i2p-dobro-pozhalovat-torrenty-cherez-ubuntu" title="Анонимная сеть i2p - добро пожаловать. Торренты через Ubuntu">Анонимная сеть i2p - добро пожаловать. Торренты через Ubuntu</a></li>
<li><a href="http://blogerator.ru/page/anonimnaja-set-i2p-dobro-pozhalovat-freebsd-chast-1" title="Анонимная сеть i2p - добро пожаловать. FreeBSD. Часть 1">Анонимная сеть i2p - добро пожаловать. FreeBSD. Часть 1</a></li>
<li><a href="http://blogerator.ru/page/anonimnaja-set-i2p-dobro-pozhalovat-freebsd-chast-2" title="Анонимная сеть i2p - добро пожаловать. FreeBSD. Часть 2">Анонимная сеть i2p - добро пожаловать. FreeBSD. Часть 2</a></li>
<li><a href="http://blogerator.ru/page/printer-shou-bezopasnost-printera-hp-1" title="Принтер-шоу: творим хардкор своими руками. Часть 1">Принтер-шоу: творим хардкор своими руками. Часть 1</a></li>
<li><a href="http://blogerator.ru/page/ispolzuem-wordpress-kak-framework" title="Используем WordPress как Framework">Используем WordPress как Framework</a></li>
<li><a href="http://blogerator.ru/page/printer-shou-proshivka-printera-i-ego-bezopasnost-praeda-2" title="Принтер-шоу: творим хардкор своими руками. Часть 2">Принтер-шоу: творим хардкор своими руками. Часть 2</a></li>
<li><a href="http://blogerator.ru/page/high-load-balansirovka-nagruzki-servera-po-metodu-sticky-load-balancing" title="Балансировка нагрузки сервера по методу SLB">Балансировка нагрузки сервера по методу SLB</a></li>
<li><a href="http://blogerator.ru/page/yahoo-pipes_nenasilstvennaja-kirillizacija-amerikanskogo-prezidenta" title="Yahoo! Pipes: наше дело труба. Пример 1">Yahoo! Pipes: наше дело – труба. Пример 1</a></li>
</ul>
</td></tr>
</tbody></table>
</div>
<div class="addzakl">
<a href="http://twitter.com/home/?status=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+http%3A%2F%2Fblogerator.ru%2Fpage%2Ffajl-primery-htaccess-redirekt-dostup" rel="nofollow"><img alt="twitter.com" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/twitter.png" title="Добавить в Twitter" width="16" /></a> <a href="http://www.facebook.com/sharer.php?u=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup" rel="nofollow"><img alt="facebook.com" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/facebook.png" title="Поделиться в Facebook" width="16" /></a> <a href="http://vkontakte.ru/share.php?url=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="vkontakte.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/vkontakte.png" title="Поделиться В Контакте" width="16" /></a> <a href="http://www.odnoklassniki.ru/dk?st.cmd=addShare&st._surl=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="odnoklassniki.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/odnoklassniki.png" title="Добавить в Одноклассники" width="16" /></a> <a href="http://connect.mail.ru/share?url=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="mail.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/mail-ru.png" title="Поделиться в Моем Мире@Mail.Ru" width="16" /></a> <a href="http://my.ya.ru/posts_add_link.xml?URL=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="ya.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/yaru.png" title="Поделиться в Я.ру" width="16" /></a> <a href="http://rutvit.ru/tools/widgets/share/popup?url=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="rutvit.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/rutvit.png" title="Добавить в РуТвит" width="16" /></a> <a href="http://www.friendfeed.com/share?title=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup" rel="nofollow"><img alt="friendfeed.com" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/friendfeed.png" title="Добавить в FriendFeed" width="16" /></a> <a href="http://www.blogger.com/blog_this.pyra?t&u=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&n=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="blogger.com" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/blogger.png" title="Опубликовать в Blogger.com" width="16" /></a> <a href="http://www.liveinternet.ru/journal_post.php?action=n_add&cnurl=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&cntitle=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="liveinternet.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/liveinternet.png" title="Опубликовать в LiveInternet" width="16" /></a> <a href="http://www.livejournal.com/update.bml?event=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&subject=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="livejournal.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/livejournal.png" title="Опубликовать в LiveJournal" width="16" /></a> <a href="http://memori.ru/link/" rel="nofollow"><img alt="memori.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/memori.png" title="Сохранить закладку в Memori.ru" width="16" /></a> <a href="http://www.google.com/bookmarks/mark?op=edit&bkmk=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="google.com" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/google-bookmarks.png" title="Сохранить закладку в Google" width="16" /></a> <a href="http://bobrdobr.ru/addext.html?url=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="bobrdobr.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/bobrdobr.png" title="Забобрить" width="16" /></a> <a href="http://zakladki.yandex.ru/newlink.xml?url=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&name=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="yandex.ru" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/yandex.png" title="Добавить в Яндекс.Закладки" width="16" /></a> <a href="http://del.icio.us/post?url=http://blogerator.ru/page/fajl-primery-htaccess-redirekt-dostup&title=25+%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB+.htaccess%2C+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5+%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD+%D0%B7%D0%BD%D0%B0%D1%82%D1%8C+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+-+Blogerator.ru" rel="nofollow"><img alt="del.icio.us" height="16" src="http://blogerator.ru/application/maxsite/plugins/addzakl/images/delicious.png" title="Сохранить закладку в Delicious" width="16" /></a>
<script gapi_processed="true" src="https://apis.google.com/js/plusone.js"></script>
<br />
<div id="___plusone_0" style="background: none repeat scroll 0% 0% transparent; border-style: none; display: inline-block; float: none; font-size: 1px; height: 15px; line-height: normal; margin: 0px; padding: 0px; text-indent: 0px; vertical-align: baseline; width: 70px;">
<iframe allowtransparency="true" data-gapiattached="true" frameborder="0" hspace="0" id="I0_1357715656189" marginheight="0" marginwidth="0" name="I0_1357715656189" scrolling="no" src="https://plusone.google.com/_/+1/fastbutton?bsv&count=true&size=small&hl=en-US&origin=http%3A%2F%2Fblogerator.ru&url=http%3A%2F%2Fblogerator.ru%2Fpage%2Ffajl-primery-htaccess-redirekt-dostup&ic=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.ru._bGnmCMfZT0.O%2Fm%3D__features__%2Fam%3DiQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAItRSTP9SzGnbWWmL6WZBA50Hgf5qyUn7Q#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled%2Conload&id=I0_1357715656189&parent=http%3A%2F%2Fblogerator.ru" style="border-style: none; height: 15px; left: 0px; margin: 0px; position: static; top: 0px; visibility: visible; width: 70px;" tabindex="0" title="+1" vspace="0" width="100%"></iframe></div>
<script> gapi.plusone.render("g-plusone", {"size": "small", "count": "true"}); </script>
</div>
</div>
<br />
<span class="usernik">Подписка на обновления блога → <a href="http://feeds.feedburner.com/Blogerator">через RSS</a>, <a href="http://feedburner.google.com/fb/a/mailverify?uri=Blogerator&loc=ru_RU">на e-mail</a>, <a href="http://twitter.com/blogerator">через Twitter</a></span><br />
<div class="page-info-after">
Теги: <a href="http://blogerator.ru/tag/SEO" rel="tag">SEO</a>, <a href="http://blogerator.ru/tag/%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82" rel="tag">интернет</a>, <a href="http://blogerator.ru/tag/%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0" rel="tag">практика</a>, <a href="http://blogerator.ru/tag/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D1%81%D0%BA%D0%BE%D0%B5" rel="tag">программистское</a>, <a href="http://blogerator.ru/tag/%D1%87%D1%83%D0%B6%D0%BE%D0%B5" rel="tag">чужое</a>, <a href="http://blogerator.ru/tag/%D1%88%D0%BF%D0%BE%D1%80%D0%B0" rel="tag">шпора</a><br />
Эта запись опубликована: Пятница, 30 декабря 2011 в рубрике <a href="http://blogerator.ru/category/programming">Программирование</a> → <a href="http://blogerator.ru/category/reviews">Обзоры</a>. </div>
</div>
</div>
Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.comtag:blogger.com,1999:blog-7477911366036839346.post-21680083950365283742013-01-05T21:53:00.001-08:002013-01-05T21:53:51.181-08:00Секреты javascript<iframe src="http://www.slideshare.net/slideshow/embed_code/3653076" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="http://www.slideshare.net/arhan/javascript-secrets-by-aleksandr-motsjonov" title="JavaScript Secrets by Aleksandr Motsjonov" target="_blank">JavaScript Secrets by Aleksandr Motsjonov</a> </strong> from <strong><a href="http://www.slideshare.net/arhan" target="_blank">Anton Arhipov</a></strong> </div>Cosmoshttp://www.blogger.com/profile/13613775583369792050noreply@blogger.com