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


Алгоритм для формирования дерева.

private function buildTree($data)
{
	$tree       = [];
	$references = [];

	foreach ($data as $id => &$node) {
    	//FIX: Дерево строится не корректно (происходит замена уже ранее созданного и удаления всех "детей"), 
        //если за ранее не отсортировано по ключу 'parent_id'
		$node['children'] = isset($references[$node['id']]['children']) ? $references[$node['id']]['children'] : [];
            $references[$node['id']] = &$node;

		if (is_null($node['parent_id'])) {
			$tree[] = &$node;
		} else {
			$references[$node['parent_id']]['children'][] = &$node;
		}
	}

	return $tree;
}

Открываем конфиг, редактируем параметры запуска демона, перезапускаем сервис

vi /etc/init/docker.conf 
> DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'
service docker restart

При запуске через systemctl:

vi /lib/systemd/system/docker.service
> ExecStart=/usr/bin/dockerd daemon -H fd:// -H tcp://0.0.0.0:2373
systemctl daemon-reload

CPU:

lscpu

Memory:

less /proc/meminfo

Hard Drive:

sudo fdisk -l | grep Disk

Network:

ifconfig -a
ethtool {interface name} | grep -i speed

Проверяем установленую версию:

git --version
git version 1.7.12.4 (Apple Git-37)

Устанавливаем git с помощью brew:

brew install git

Добавляем в ~/.bash_profile новую строчку:

export PATH="/usr/local/bin:$PATH"

Применяем изменения:

source .bash_profile

Проверяем версию:

git --version
git version 2.11.1

Стандартный класс LinkPager генерирует HTML-код постраничной навигации, который неправильно отображается с Bootstrap 4. Этот сниппет исправляет эту проблему.

<?php

namespace app\components;

use Yii;
use yii\helpers\Html;
use yii\widgets\LinkPager;

class BootstrapLinkPager extends LinkPager
{
    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();

        // In Bootstrap 4 no div's "next" and "prev", so you need to overwrite the default values
        $this->prevPageCssClass = 'page-item';
        $this->nextPageCssClass = 'page-item';

        // Change the location and size of block
        // https://v4-alpha.getbootstrap.com/components/pagination/#alignment
        // https://v4-alpha.getbootstrap.com/components/pagination/#sizing
        $this->options['class'] = 'pagination justify-content-center';

        // Change standard arrows "«" and "»"
        $this->nextPageLabel = Yii::t('app', 'Next');
        $this->prevPageLabel = Yii::t('app', 'Previous');

        // Default div for links
        $this->linkOptions['class'] = 'page-link';
    }

    /**
     * @inheritdoc
     */
    public function run()
    {
        if ($this->registerLinkTags) {
            $this->registerLinkTags();
        }

        if ($this->pagination->getPageCount() > 1) {
            echo Html::tag('nav', $this->renderPageButtons());
        }
    }

    /**
     * @inheritdoc
     */
    protected function renderPageButton($label, $page, $class, $disabled, $active)
    {
        $options = ['class' => empty($class) ? 'page-item' : $class];
        $linkOptions = $this->linkOptions;

        if ($active) {
            Html::addCssClass($options, $this->activePageCssClass);
        }

        if ($disabled) {
            Html::addCssClass($options, $this->disabledPageCssClass);
            $linkOptions['tabindex'] = '-1';
        }

        return Html::tag('li', Html::a($label, $this->pagination->createUrl($page), $linkOptions), $options);
    }
}

Использовать просто: вместо LinkPager при вызове используйте BootstrapLinkPager.

Установить другой шаблон:

$this->layout()->setTemplate('layout/new-layout');

Добавить новый шаблон для сайдбара:

$view = new ViewModel();
$sideView = new ViewModel();
$sideView->setTemplate('content/sidebar');
$this->$layout->addChild($sideView, 'side-view');
return $view;

Отключить шаблон:

$view = new ViewModel();
$view->setTerminal(true);
return $view;

Разные файлы шаблона для разных контролеров:

//module.php
public function init(ModuleManager $moduleManager){
    $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
        $controller = $e->getTarget();
        if ($controller instanceof Controller\FrontEndController) {
            $controller->layout('layout/front');
        }
    }, 100);
}

Получить доступ к объекту View в модули:

public function onBootstrap($e){
  $app = $e->getApplication();
  $viewModel = $app->getMvcEvent()->getViewModel();
}

Получить значение представления в Layout:

$viewModel = $this->viewModel()->getCurrent();
$children = $viewModel->getChildren();
$viewModel = $children[0];
$viewModel->foo;

Переопределить шаблон для View:

$view = new ViewModel();
$view->setTemplate('my-template.phtml');

Передать переменные в представление:

$view = new ViewModel();
$view->setVariables(['var' => 'foo']);

Добавление нескольких объектов View Model и передача их в представления:

$view = new ViewModel();
$sidebarView = new ViewModel();
$sidebarView->setTemplate('content/sidebar');
$view->addChild($sidebarView, 'sidebar');
return $view;

Отключить представления (view):

$response = $this->getResponse();
$response->setStatusCode(200);
return $response;

Вернуть Json ответ (response):

$view = new JsonModel(['success' => '1','data'=>'foo']);
return $response;
namespace MyModule\Controller;
 
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
 
class MyController extends AbstractActionController
{

    public function indexAction()
    {
    	return new ViewModel(['id' => $id, 'form' => $form]);
        // или return ['id' => $id, 'form' => $form];
    }
 
}

// добавляем новое сообщение 
public function indexAction() {
    $this->flashMessenger()->addMessage('Message');
}

// передаём сообщение в представления (view) с помощью EventManager
$em = $e->getApplication()->getEventManager();

$em->attach(\Zend\Mvc\MvcEvent::EVENT_RENDER, function($e) {

    $messenger = new \Zend\Mvc\Controller\Plugin\FlashMessenger();
    
    if ($messenger->hasMessages()) {
        $messages = $messenger->getMessages();
        $e->getViewModel()->setVariable('flashMessages', $messages);
    }
    
});

// получаем все сообщение в представлении (view)
<?php if (isset($flashMessages)) : ?>
  <ul class="flash-messages">
       <?php foreach ($flashMessages as $message) : ?>
          <li> <?= $message; ?></li>
       <?php endforeach; ?>
  </ul>
 <?php endif; ?>