Для получения полного доступа
зарегистрируйтесь.

Раздел:
Подраздел:
Языки:


Gravatar image
Ivan Kochurkin
  • Репутация: 14
  • Сниппеты: 1
  • Ревизии: 0

Игра "Змейка" реализованная в исходном коде (Квайн). Для каждого следующего шага необходимо компилировать код и сохранять его в файл (пока только Windows):

Продолжение »

Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Удалить повторяющиеся значения из многомерного массива

// 1 вложенность 
$array = array_map("unserialize", array_unique(array_map("serialize", $array)));

// Рекурсивно
function super_unique($array) {
    $result = array_map("unserialize", array_unique(array_map("serialize", $array)));
    foreach ($result as $key => $value) {
        if ( is_array($value) ) {
        	$result[$key] = super_unique($value);
        }
    }
    return $result;
}
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Несмотря на то, что затея сама по себе довольно бессмысленна, можно использовать анонимные функции для обработки URL и полностью выкинуть MVC примерно так же, как это рекламируют популярные микрофреймворки.

require 'vendor/autoload.php';
require 'vendor/yiisoft/yii2/Yii.php';


$app = new CallbackWebApplication([
    'id' => 'MyApplication',
    'basePath' => __DIR__,
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
        ],
    ],
]);

$app->onGet('hello/<name>', function($name) {
    return 'Hello, ' . $name . '!';
});
$app->run();
<?php
class CallbackWebApplication extends \yii\web\Application
{
    private $callbacks = [];

    /**
     * @inheritdoc
     */
    public function handleRequest($request)
    {
        list ($route, $params) = $request->resolve();
        if (preg_match('~callbacks/(\d+)~', $route, $matches) && isset($this->callbacks[$matches[1]])) {
            $result = call_user_func_array($this->callbacks[$matches[1]], $params);
        } else {
            throw new \yii\web\NotFoundHttpException();
        }

        $response = $this->getResponse();
        $response->data = $result;
        return $response;
    }

    public function onGet($pattern, callable $callback)
    {
        // можно реализовать через свой UrlRule,
        // но было очень лениво
        $callbackIndex = count($this->callbacks);
        $this->callbacks[$callbackIndex] = $callback;
        Yii::$app->getUrlManager()->addRules([
            $pattern => 'callbacks/' . $callbackIndex
        ]);
    }
}
Bran
  • Репутация: 29
  • Сниппеты: 7
  • Ревизии: 0

Задача

Иногда, нам нужно пояснить пользователю как всё устроено на нашем сайте (например, сложные формы, CRM, редакторы).

Для этого отлично подходят туры. Заходите на сайт, и вам на странице показывают с помощью шагов для чего нужен каждый элемент. Следуя трендам, показываю как это работает:

l41lHYxV4FjGmaoeI.gif

Лично от меня, не стоит это добавлять на любые задачи. Туры вообще, вещь раздражающая когда я понимаю без что могу справиться с задачей, без стороней помощь.

Решение

На деле всё очень просто. Скачиваем, Bootstrap Tour, подключаем скрипты:

<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/bootstrap-tour.min.css" rel="stylesheet">

<script src="/js/jquery-2.1.4.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/bootstrap-tour.min.js"></script>

Теперь добавим шаги в наш скрипт:

var tour = new Tour({
    steps: [
        {
            element: "#element-1",
            title: "Шаг 1",
            content: "Текст для первого шага"
        },
        {
            element: "#element-2",
            title: "Шаг 2",
            content: "Текст для второго шага"
        }
    ]});

tour.init();
tour.start();
Gravatar image
dkrnl
  • Репутация: 17
  • Сниппеты: 2
  • Ревизии: 0

При копировании любого выделенного текста, в конец текста автоматически добавляется ссылка на сайт.

jQuery(function($){
    
    $(document).on("copy", function () {
        var selection, html = "", minLength = 10;
        if (window.getSelection || document.getSelection) {
            selection = window.getSelection ? window.getSelection() : document.getSelection();
            if (selection.rangeCount) {
                html = document.createElement("div");
                for (var i = 0, n = selection.rangeCount; i < n; ++i) {
                    html.appendChild(selection.getRangeAt(i).cloneContents());
                }
                html = html.innerHTML;
            }
        } else if (document.selection && document.selection.type == "Text") {
            selection = document.selection.createRange();
            html = selection.htmlText;
        }
        if (html.length <= minLength) { // проверка минимальной длины
            return;
        }
        html += "<br>\n<br>\n" + document.location.href; // тут можно добавить название сайта
        var container = $("<div style=\"position:absolute;left:-99999px\"></div>").appendTo("body");
        container.html(html);
        selection.selectAllChildren(container.get(0));
        setTimeout(function() {
            container.remove();
        }, 0);
    });
    
});
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Видел вот такой подход: http://gostash.it/ru/stashes/232 И нашел альтернативу чуть по проще.

 list($a, $b) = [$b, $a];
Сниппет,  PHP

Nested Sets to array

Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Работаю с вложенными деревьями, а именно Nested Sets и как раз потребовалась функция, которая собирает из полученных узлов массив со вложенностями.

function toHierarchy($collection)
{
    // Trees mapped
    $trees = [];
    $l = 0;

    if (count($collection) > 0) {
        // Node Stack. Used to help building the hierarchy
        $stack = [];

        foreach ($collection as $node) {
            $item = $node;
            $item['children'] = [];

            // Number of stack items
            $l = count($stack);

            // Check if we're dealing with different levels
            while($l > 0 && $stack[$l - 1]['depth'] >= $item['depth']) {
                array_pop($stack);
                $l--;
            }

            // Stack is empty (we are inspecting the root)
            if ($l == 0) {
                // Assigning the root node
                $i = count($trees);
                $trees[$i] = $item;
                $stack[] = & $trees[$i];
            } else {
                // Add node to parent
                $i = count($stack[$l - 1]['children']);
                $stack[$l - 1]['children'][$i] = $item;
                $stack[] = & $stack[$l - 1]['children'][$i];
            }
        }
    }

    return $trees;
}
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Вот такую красивую кнопку "Поделиться" можно добавить в свои проекты.

Демо:

90f50d9015a147e83726cb2898ced68b.gif

Начнём с разметки:

<div class="btn-group dropup">
    <a type="button" class="btn btn-default dropdown-toggle btn-sm" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        <i class="fa fa-share-alt"></i>
    </a>
    <ul class="dropdown-menu arrow">
        <li><input class="form-control input-sm" value="http://gostash.ru" type="text"></li>
        <li><a href="#" class="social-likes" data-url="http://gostash.ru"><div class="twitter"> Twitter</div></a></li>
        <li><a href="#" class="social-likes" data-url="http://gostash.ru"><div class="facebook"> Facebook</div></a></li>
        <li><a href="#" class="social-likes" data-url="http://gostash.ru"><div class="vkontakte"> ВКонтакте</div></a></li>
        <li><a href="#" class="social-likes" data-url="http://gostash.ru"><div class="plusone"> Google+</div></a></li>
    </ul>
</div>

Важно! Для работы кнопки необходимо подключить bootstrap.min.js и также Font Awesome, который я использую для иконок соц. сетей. Вы можете этот шрифт не использовать, а заменить в классах .social-likes__button_название_соц_сети на нужную вам иконку. И последнее, Social Likes.

Осталось добавить css:

.social-likes__button > .social-likes__icon {
    font-family: 'FontAwesome', serif;
}

.social-likes__counter {
    background: #eee;
    margin-left: 0.5em;
    color: #555;
    font-size: 0.8em;
    font-weight: bold;
    display: inline-block;
	min-width: 1.5em;
	text-align: center;
}

.dropdown-menu.arrow input[type=text] {
    margin-left: 0.4em;
    width: 12.3em;
    margin-bottom: 0.3em;
    border-radius: 0.2em !important;
}

.dropdown-menu.arrow {
    margin-bottom: 1em;
}

.dropdown-menu.arrow:before {
    position: absolute;
    bottom: -10px;
    left: 9px;
    width: 0;
    height: 0;
    border-left: 10px solid transparent;
    border-right:10px solid transparent;
    border-top: 10px solid #ccc;
    font-size: 0;
    line-height: 0;
    content: '';
}

.dropdown-menu.arrow:after {
    position: absolute;
    bottom: -9px;
    left: 10px;
    width: 0;
    height: 0;
    border-left: 9px solid transparent;
    border-right: 9px solid transparent;
    border-top: 9px solid #fff;
    font-size: 0;
    line-height: 0;
    content: '';
}

.social-likes__icon > span {
    position:relative;
    top:0;
    left:-3px;
    background-image: none !important;
}

.social-likes__button_twitter > span:before {
    content: "\f099";
    color: #00B7EC;
}

.social-likes__button_facebook > span:before {
    content: "\f082";
    color: #425497;
}

.social-likes__button_vkontakte > span:before {
    content: "\f189";
    color: #526E8F;
}

.social-likes__button_plusone > span:before {
    content: "\f0d5";
    color: #DD4241;
}
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Простая в использовании, но довольно мощная в плане возможностей библиотека Essence. Данная библиотека поддерживает 68 сайтов - Youtube, Twitter, Vimeo, Vine и тд.

Демо:

d338627098c55af2e1d499bbee73d876.gif

Продолжение »

Gravatar image
maxyc
  • Репутация: 29
  • Сниппеты: 4
  • Ревизии: 0

Просто оставлю это здесь. Иногда пригождается для дебага, чтоб далеко не лезть, чтоб посмотреть, какой sql формируется

$news      = Article::find()->limit(3);
$news->andWhere('city_id = :cid OR city_id IS NULL', [':cid'=>$this->_city->id]);
$news->andWhere('company_id = :c_id OR company_id IS NULL', [':c_id'=>$model->id]);

var_dump($news->prepare(Yii::$app->db->queryBuilder)->createCommand()->rawSql);

$news->all();