• Content count

  • Joined

  • Last visited

Community Reputation

88 Excellent

About valan

  • Rank
    Distinguished Member
  • Birthday 12/13/1973

Profile Information

  • Gender
  • Location
    Russia, Moscow

Recent Profile Visitors

6,119 profile views
  1. Hi! Thank you for responses. It's clear how to access PW from external PHP script. What's not clear yet is what would be a right setup in my case. As far as I understand, first, PW should be included in vendor directory via "composer require processwire/processwire"; second, it should be installed (e.g. direct some subdomain like to index.php). Correct?
  2. I'd like to use ProcessWire CMS capabilities in existing project which runs on popular PHP framework (Yii2). Specifically, I'd like to handle requests in Yii and call PW if necessary, plus create/modify pages in ProcessWire admin. Is it possible? If yes - how to setup such combination?
  3. valan

    @BitPoet thank you for link. Haven't heard about this setting, as well as about FileCompiler=? Checked. Doesn't help. As far as I understand, because PHP compiler already declared class earlier. Looks like in my case Order_Status.class.php should not be required_once as soon as it has been compiled somewhere before + class is in use already. Or (I guess) Order_Status.class.php should never be compiled. But this scenario looks ugly to me as there are a lot of files that I need to prevent from compilation...).
  4. I'm trying to upgrade PW from 2.8 to 3.0 and get: Compile Error: Cannot declare class Order\Order_Status, because the name is already in use (line 6 of /path-to-file/Order_Status.class.php) File Order_Status.class.php: <?php namespace Order; require_once('SomeClass.php'); class Order_Status { // ... } ?> File where compiler breaks Master_Order.class.php: <?php namespace MM\User\Master; require_once('/path-to-file/Order_Status.class.php'); use Order\Order_Status; class Master_Order { // ... } I've checked FileCompiler cache and discovered that: Order_Status.class.php is compiled as expected (e.g. there is 'SomeClass.php' wrapped by file compiler) Master_Order.class.php is uncompiled as required_once('/path-to-file/Order_Status.class.php') is not wrapped Most probably conflict appears as a result of Order_Status.class.php compilation and its usage at early stage (this class is used both in modules and in template files). So my question is - how to fix compiler error in this case?
  5. valan

    @arjen thanks! Checked with different selector types = exactly what I need! Just minor fix - adding $selector2 needs to be done through new Selectors($selector2).
  6. valan

    @AndZyk thanks. Yes, there are associative and regular arrays used for selectors. It is exactly a reason of the question - how to merge them and get one: $selector1 = 'template=basic-page|product'; $selector2 = [ 'title|body%=' => $sanitizer->text($input->get('q')), ]; $selector3 = [ ['categories', '=', $input->get('categories'), 'int'], ['sort', '-created'] ] $selector = mergeSelectors($selector1, $selector2, $selector3); // <- I need this kind of method $results = $pages->find($selector);
  7. valan

    How to merge selectors of different types (string, array, array of arrays, Selectors) and get $selector with some of these types (to pass it to $pages->find($selector))?
  8. valan

    At our site we use both email and phone authorizations at frontend. To make life easier, I've developed HelperPhone pack that handles phone numbers. This pack includes following modules for ProcessWire CMS/CMF: FieldtypePhoneNumber: module that stores phone numbers InputfieldPhoneNumber: module that renders inputfield for phone numbers HelperPhone: module that loads PhoneNumber and PhoneNumberConst classes, and 'libphonenumber' namespace All these modules require included PW WireData-derived class PhoneNumber and PhoneNumberConst. PhoneNumber class is a thin wrapper over giggsey/libphonenumber-for-php, itself is port of Google's libphonenumber. PhoneNumberConst class stores constants, used by PhoneNumber class Usage: PhoneNumber class $phone = '8 (916) 318-07-29 ext 1234'; // input string could be in any phone-recognizable format $phoneNumber = new PhoneNumber($phone, 'RU'); // or wire('modules')->get('HelperPhone')->makePhoneNumber($phone, 'RU'); echo ($phoneNumber->isValidNumber() ? 'Yes':'No'); // Yes echo ($phoneNumber->isValidNumberForRegion($regionCode) ? 'Yes':'No'); // Yes echo $phoneNumber->getNumberTypeTitle(); // Mobile echo $phoneNumber->getCountryCode(); // 7 echo $phoneNumber->getRegionCode(); // RU echo $phoneNumber->getNationalNumber(); // 9163180729 echo $phoneNumber->getExtension(); // 1234 echo $phoneNumber->formatForCallingFrom('US') // 011 7 916 318-07-28 echo $phoneNumber->formatForCallingFrom('GE') // 00 7 916 318-07-28 For more methods and properties please refer to PhoneNumber and PhoneNumberConst source files. Need more? Check giggsey/libphonenumber-for-php and use it by accessing $phoneNumber->phoneNumber property - it is instance of \libphonenumber\PhoneNumber or null (if empty). Usage: field Note: on field creation, make sure that you've configured field settings Default region: assumed region if input phone number string is not in international format (starts with '+', etc) Enabled/disabled phone extentions: if disabled, phone extension will be removed on field save. Phone field settings in example below: default region code 'RU', phone extensions are enabled echo $page->phone; // +79163180729 // Note1: $page->phone stores instance of PhoneNumber and renders to string in E164 format. // Note2: E164 format does not include extension. echo $page->getFormatted('phone'); // +7 916 318-07-29 ext. 1234 echo $page->getUnformatted('phone'); // +79163180729 echo $page->phone->format(PhoneNumberConst::RFC3966); // tel:+7-916-318-07-29;ext=1234 echo $page->phone->getNationalNumber(); // 9163180729 Usage: PW selectors FieldtypePhoneNumber is instance of FieldtypeText. It stores phone numbers and extensions as string in E164 format with #extention (if provided by user and enabled in settings) E.g. in db it looks like this: '+79163180729#1234'. This makes it easy to query fields as any text field. echo $pages->find([ 'template' => 'my_temlate', 'phone^=' => '+79163180729', ]); // will echo page ids where phone starts with '+79163180729' Finally I've decided to put it here first and later to Modules directory (based on your feedbacks). GitHub: Enjoy
  9. valan

    @LostKobrakai - thank you! link is very helpful. P.S. and thank you for article - helped me a lot to better structure and maintain the code.
  10. valan

    There is excellent article here by @LostKobrakai that describes how to use custom page types and extend the Page class. Q: How to extend (e.g. w/o hooks, using method described in article) core Users and User classes and reload $users and $user api variables (they are locked) with new/extended classes? Currently I think about changing User to MyUser class in systems tab (e.g. set another class to be used for 'user' template) and installing module like below. As you can see it adds $myusers and $myuser api variables but I'm not sure that it won't conflict with core. // MyUsers.php class MyUsers extends Users { public function __construct(ProcessWire $wire, $templates = array(), $parents = array()) { parent::__construct($wire, $templates, $parents); $this->setPageClass('MyUser'); } // my non-overlapping methods here ... } // MyUser.php class MyUser extends User { // my non-overlapping methods here ... } class ResourceUser extends WireData implements Module { public static function getModuleInfo() { return [ 'title' => 'Extend Users and User', 'version' => 100, 'autoload' => true, 'singular' => true, ]; } public function __construct() { require_once(dirname(__FILE__) . '/MyUsers.php'); require_once(dirname(__FILE__) . '/MyUser.php'); } public function init() { $pagesType = new MyUsers($this->wire); $this->wire('myusers', $pagesType, true); $page = new MyUser; $this->wire('myuser', $page, true); } }
  11. @ryan may be you can help? Thanks.
  12. @Robin S @LostKobrakai thanks. This method looks like a right method for input-specific js/css. It creates config under $this->attr('id') on initial page load... but now w/o values. Looks like when Ajax visibility is set, PW knows $this->attr('id') but doesn't know $this->my_config_key and $this->attr('value'). How to get these values in this method when Ajax visibility is set? P.S. If visibility set to "Open", everything works OK, e.g. it does not work with 2 Ajax visibility options. public function renderReady(Inputfield $parent = null, $renderValueMode = false) { $this->config->js($this->attr('id'), [ 'config' => [ 'my_config_key' => $this->my_config_key, // = null (it's an inputfield config parameter) 'pageId' => $this->attr('value'), // = 0 (it's a page id from InputfieldPage) ], ]); parent::renderReady($parent, $renderValueMode); }
  13. @Robin S thanks for check. Looks like problem is deeper. May be at MySQL level as we've migrated to InnoDb. Or smth else. And thanks for sensible advice!
  14. @arjen thanks. I guess that such kind of errors like "endless loops somewhere in the core" require line-by-line execution debugger in order to find where it occurs. Not sure that Tracy may help here, but will give it a try. I also think its a core issue, not site-specific. Could you check it in admin? - move any page under any user (preliminary make sure you've enabled 'may have children' in user template). Page will be moved, but spinner will continue to run, blocking any further work in admin, so you'll need to create a new session (restart browser/login again).
  15. @kixe thanks. $page already exists, so no need to set template again. Anyway, I did it but issue remained - the same $page->save(). I'm not really advanced enough programmer to debug PW core code (and don't have proper debugging tools, wire('log')->error('My error'); was always enough for me))